理解gdb中的这种不稳定行为

时间:2010-09-27 17:48:37

标签: c debugging gcc 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;
}

对Mstrupr的第二次调用无法在linux上正确运行,因为它接收字符串作为文字(而不是字符数组)。当在gdb上运行完整的程序时,它也会失败,但是当断点被添加到main并且程序通过gdb的下一个命令运行时,第二个字符串被大写并打印。 为什么?我相信这不应该,但我的导师坚持认为这是gdb设计的一部分。

2 个答案:

答案 0 :(得分:9)

我没有看到它是gdb设计的一部分。这似乎是偶然的副作用; gdb在设置断点时使代码段可写,因此现在覆盖文字的代码可以正常工作

事实上,没有调试器设计者会故意让他们的调试器改变程序的行为;这让调试变得非常困难

答案 1 :(得分:1)

我必须指出,我使用较新的gdb(GDB 7.1)重新编译并重新调试了此代码,并且不再出现此行为。代码看起来有问题(第二次函数调用时出现Segmentation Fault),应该是这样。