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.
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
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