Rozważmy następujący kod:Zrozumienie tej nieprawidłowe działanie w gdb
#include <stdio.h>
#include <ctype.h>
char* Mstrupr(char* szCad);
int main()
{
char szCadena[] = "This string should print well.";
printf("%s\n", Mstrupr(szCadena));
printf("%s\n", Mstrupr("This string should fail."));
return 0;
}
char* Mstrupr(char* szCad)
{
int i;
for (i=0; szCad[i]; i++)
szCad[i] = toupper(szCad[i]);
return szCad;
}
Drugie wezwanie do Mstrupr nie działać poprawnie na linux jak jego otrzymaniu ciąg jako dosłowna (a nie jak w tablicy char). Gdy kompletny program jest uruchamiany na gdb, również się nie powiedzie, ale gdy punkt przerwania zostanie dodany do głównej, a program zostanie uruchomiony za pomocą następnego polecenia gdb, drugi łańcuch zostanie zamieniony na wielką i wydrukowany. Dlaczego? Wierzę, że tak nie powinno być, ale mój instruktor nalega, że jest to część projektu gdb.
To prawdopodobnie coś, co ludzie gdb mogliby uznać za błąd. W przypadku większości zastosowań (a nie niektórych wbudowanych) gdb musi zmienić kod, aby wstawić instrukcję przerwania do implementacji punktu przerwania, co oznacza, że musi zmienić obszar pamięci na zapisywalny. To najwyraźniej nie zmienia go z powrotem do poprzednich ustawień. – nategoose
To naprawdę dziwne, zwłaszcza, że moja wersja gcc umieszcza wszystko w innym segmencie, '.rodata' który gdb nie ma powodu, aby dotknąć – Hasturkun