2012-01-23 128 views
8

我有一个应用程序,我正在调试,我想了解gdb是如何工作的,以及为什么我无法有时通过应用程序。我遇到的问题是,gdb将挂起,并且它将连接到的进程将在我逐步执行该程序时进入停用状态。 gdb挂起后我必须杀死它才能释放终端(ctrl-C不起作用,我必须通过获取该gdb会话的进程ID并使用kill -9来从不同的终端窗口执行此操作)。gdb为什么会挂起?

我猜测gdb挂起,因为它正在等待应用程序停止在下一个指令,并以某种方式应用程序完成执行没有gdb标识这一点。但这只是我迄今为止观察到的行为的猜测。所以我的问题是,如果有人曾经看到过这种行为,并且/或者可能会提出原因可能是什么。我认为这可以帮助我改进我的调试策略。

万一它很重要我使用g ++ 4.4.3,gdb 7.1,在Ubuntu 10.04 x86_64上运行。

+0

有一些最小的测试用例可以给你吗?我的意思是,正如所写,很难回答为什么它可能会发生 - 除了“可能是因为gdb有bug”。 – derobert

+0

感谢您的建议。现在应用程序有很多库代码,但是我会看看是否可以创建一个我可以作为示例发布的小测试用例。 –

+1

我建议使用更新的'gdb'。目前的版本是** 7.3 **,他们取得了很大的进步。 (和BTW,使用更新的'g ++'即4.6.2也会有所帮助;因为GCC也在调试信息方面取得进展)。 –

回答

4

我会说调试的过程不会闲置,如果它是挂起的原因。每次GDB完成一个步骤,它都必须更新您需要打印的任何表达式。它可能包括以下指针等等,并且在某些情况下,它可能会在那里失败(尽管我没有提醒真正的“挂起”)。它通常也会尝试更新堆栈跟踪。如果堆栈跟踪已被破坏并且不再一致,则可能陷入无限循环。将gdb附加到strace以查看挂起期间发生的活动可能是进一步找出问题的好方法。

(例如,通过无较长的工作-NFS/SSHFS挂载访问来源是最常见的原因GDB挂,这里一个:P)

+0

感谢您的想法。你能否详细说明“附加gdb到strace”是什么意思? –

+0

我的意思是在终端上运行'strace -p \'pidof gdb \''并研究输出。它应该显示程序执行的所有系统调用。 – PypeBros

+0

感谢您的建议。我还没有弄清楚是什么原因造成了这个问题,但看看是否有用。 gdb挂起的最后一个系统调用是'wait4(26066,'(对于这个运行,PID当然会有所不同)。同时用ps -a列表显示进程26066是'defunct'。 –

1

我也有类似的问题,并通过发送解决它CONT发信号给被调试的进程。