【发布时间】:2011-12-09 23:17:03
【问题描述】:
我正在使用 gcc44 和 gdb 在 64 位 Linux CentOS 5.7 服务器上调试一些 ANSI C 代码。
在我的一个函数的中间,我有一个循环 192 次的 for 循环(循环中有 2 行代码)。如果我在 for 循环开始时设置 gdb 并设置断点,我可以单步执行 for 循环 192 次,然后它会退出 for 循环并在 for 循环之后继续执行下一行代码。这都是使用“s”或“n”逐步执行 gdb 中的代码。一切正常。
现在,我不再使用“s”或“n”单步执行 for 循环以到达 for 循环之后的下一行代码,而是启动 gdb,然后在该行结束后的行设置断点for 循环。如果我然后在 gdb 中按“c”,它会给我“程序正常退出”。我希望 gdb 在 for 循环之后的代码行上的这个断点处停止。 (!?)
作为另一个实验,我了解到 gdb 确实成功地停止在任何行上设置的任何断点之后紧跟 for 循环之后的代码行。
从诸如此类的问题来看,也许其他人有过这种经历(其中还有 2 个额外的参考资料):
gdb error "Program exited normally"
它在 gdb 中是可重复的。在没有深入研究相关代码的情况下,任何人之前都看到过这种行为和/或知道我可以检查什么?
编辑 1
如果我在断点行包含printf("\n"); 会导致上述问题,将该行上的内容移动到此 printf 代码下方的一行,则一切正常(例如 gdb 在 printf 行上停止)。
我什至可以在之前有问题的代码行上成功设置断点,现在是 printf 行之后的下一行。奇怪!
【问题讨论】:
-
线程问题?使用调试器单步执行将很好地隐藏竞争条件。 W/O 最少的代码或回溯 (bt),任何人都很难为您提供帮助。
-
如果是竞争条件阻止 gdb 正常运行,那么是否也会阻止程序正常运行(不使用 gdb 时)?如果是这样,我什至不会意识到它正在发生,如果不是因为这次奇怪的事故——人们如何解决这种情况?
-
一种解决方法是使用 'u'ntil 命令退出循环。
-
我不熟悉...它是如何工作的?是 gdb 命令吗?
-
你编译过优化了吗?