考虑以下代码:
#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 在设置断点时使代码段可写,因此覆盖文字的代码现在可以工作了
事实上,没有调试器设计者会故意让他们的调试器改变程序的行为;这使得调试变得非常困难
关于c - 了解 gdb 中的这种不稳定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806420/