我有一个我正在调试的应用程序,我正在尝试了解gdb的工作原理以及为什么我有时无法单步执行应用程序。我遇到的问题是,当我逐步执行程序时,gdb将挂起并且它所附加的进程将进入一个已不存在的状态。 gdb挂起后,我必须杀死它以释放终端(ctrl-C不起作用,我必须通过获取该gdb会话的进程ID并使用kill -9从不同的终端窗口执行此操作)。
我猜测gdb正在挂起,因为它正在等待应用程序在下一条指令处停止,并且某种程度上应用程序完成执行而没有gdb识别这一点。但这只是我迄今为止所观察到的行为的猜测。所以我的问题是,如果有人之前已经看过这种行为和/或可能会提出原因可能是什么。我认为这可能有助于我改进调试策略。
如果重要,我正在使用g ++ 4.4.3,gdb 7.1,在Ubuntu 10.04 x86_64上运行。
答案 0 :(得分:4)
我会说调试过程如果是挂起的原因就不会闲置。每次GDB完成一个步骤,它都必须更新您需要打印的任何表达式。它可能包括以下指针等,在某些情况下,它可能会在那里失败(虽然我没有提醒真正的“挂起”)。它通常还会尝试更新堆栈跟踪。如果堆栈跟踪已损坏且不再一致,则可能会陷入无限循环。将gdb附加到strace
以查看挂起期间正在进行的活动可能是进一步解决问题的好方法。
(例如,通过不再工作的NFS / SSHFS挂载来访问源是gdb挂起的最常见原因之一,这里:P)
答案 1 :(得分:1)
我遇到了类似的问题,并通过向正在调试的进程发送CONT
信号解决了这个问题。