2010-09-27 9 views
5

consideri il seguente codice:comprensione di questo comportamento irregolare in 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; 
} 

La seconda chiamata a Mstrupr non riesce a funzionare correttamente su Linux quale riceve la stringa come un letterale (e non come un array di char). Quando il programma completo viene eseguito su gdb fallisce pure, ma quando un breakpoint viene aggiunto a main e il programma viene eseguito tramite il comando successivo di gdb, la seconda stringa viene scritta in maiuscolo e stampata. Perché? Credo che questo non dovrebbe essere, ma il mio istruttore insiste sul fatto che fa parte del design di gdb.

risposta

9

Non vedo che faccia parte del design di gdb. Sembra un effetto collaterale accidentale; gdb ha reso il segmento di codice scrivibile quando imposta il punto di interruzione, quindi il tuo codice che sovrascrive i letterali ora funziona

In effetti nessun designer di debugger avrebbe deliberatamente fatto in modo che il loro debugger modificasse il comportamento di un programma; che rende davvero difficile il debug

+0

Probabilmente è qualcosa che i gdb considererebbero un bug. Per la maggior parte degli usi (non alcuni di quelli incorporati, però) gdb deve modificare il codice per inserire un'istruzione di interruzione per implementare un punto di interruzione, il che significa che deve modificare quell'area di memoria in scrittura. Apparentemente non lo sta riportando alle impostazioni precedenti. – nategoose

+0

È davvero strano, soprattutto perché la mia versione di gcc mette tutto in un segmento diverso, '.rodata' che gdb non ha motivo di toccare – Hasturkun

1

Devo sottolineare che ho ricompilato e re-debug questo codice con un gdb più recente (GDB 7.1) e questo comportamento non appare più. Il codice appare difettoso (Segmentation Fault alla seconda chiamata di funzione), come dovrebbe.

+0

suona come un bug fisso in gdb – pm100

+0

Sì. Credo che sia. – andandandand

Problemi correlati