请考虑以下代码:

#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设计的一部分。

最佳答案

我不认为这是gdb设计的一部分。这似乎是一个意外的副作用;gdb在设置断点时使代码段可写,因此覆盖那里文字的代码现在可以工作了。
事实上,没有调试器设计器会故意让调试器更改程序的行为;这使得调试非常困难

08-05 09:33