2010-09-27 8 views
5

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.

Odpowiedz

9

Nie widzę, że jest to część projektu gdb. To wydaje się przypadkowym efektem ubocznym; gdb uczynił segment kodu zdolnym do zapisu, gdy ustawi punkt przerwania, więc twój kod, który nadpisuje literały tam teraz działa

W rzeczywistości żaden projektant debuggera nie rozmyślnie spowodowałby, że ich debugger zmieniłby zachowanie programu; to sprawia, że ​​debugowanie jest naprawdę trudne

+0

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

+0

To naprawdę dziwne, zwłaszcza, że ​​moja wersja gcc umieszcza wszystko w innym segmencie, '.rodata' który gdb nie ma powodu, aby dotknąć – Hasturkun

1

Muszę zaznaczyć, że zrekompilowałem i ponownie debugowałem ten kod nowszym gdb (GDB 7.1) i to zachowanie już się nie pojawia. Kod wygląda na uszkodzony (błąd segmentacji przy drugim wywołaniu funkcji), tak jak powinien.

+0

brzmi jak naprawiony błąd w gdb – pm100

+0

Tak. Wierzę, że tak jest. – andandandand

Powiązane problemy