2010-09-27 13 views
5

considere el siguiente código:La comprensión de este comportamiento errático en 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 segunda llamada a Mstrupr falla para funcionar correctamente en Linux como su recepción de la cadena como un literal (y no como una matriz de caracteres). Cuando el programa completo se ejecuta en gdb también falla, pero cuando se agrega un punto de interrupción a main y el programa se ejecuta a través del siguiente comando de gdb, la segunda cadena se escribe en mayúscula y se imprime. ¿Por qué? Creo que esto no debería ser, pero mi instructor insiste en que es parte del diseño de gdb.

Respuesta

9

No veo que sea parte del diseño de gdb. Parece un efecto secundario accidental; gdb hizo que el segmento de código se pueda escribir cuando establece el punto de interrupción, por lo que ahora funciona el código que sobrescribe los literales

De hecho, ningún diseñador de depuradores deliberadamente haría que su depurador cambiara el comportamiento de un programa; eso hace que la depuración sea realmente difícil

+0

Eso es probablemente algo que la gente de gdb consideraría un error. Para la mayoría de los usos (aunque no algunos integrados) gdb tiene que cambiar el código para insertar una instrucción break para implementar un punto de interrupción, lo que significa que tiene que cambiar esa área de memoria para poder escribirla. Aparentemente no lo está cambiando a su configuración anterior. – nategoose

+0

Es realmente extraño, especialmente porque mi versión de gcc pone todo en un segmento diferente, '.rodata' que gdb no tiene razón para tocar – Hasturkun

1

Debo señalar que he recompilado y vuelto a depurar este código con un nuevo gdb (GDB 7.1) y este comportamiento ya no aparece. El código aparece defectuoso (falla de segmentación en la segunda llamada a la función), como debería ser.

+0

suena como un error en gdb – pm100

+0

Sí. Yo creo que es. – andandandand

Cuestiones relacionadas