Eclipse CDT多线程调试不是最优的 - 如何独占运行线程?

时间:2012-05-04 07:36:44

标签: c++ c eclipse gdb eclipse-cdt

我知道答案,我把它放在这里让其他人看到它

如果您使用eclipse CDT,您可能会理解eclipse不是调试器,它只是一个应用程序前端,特别是GDB。因此,在调试C ++程序时,您实际上只是以更舒适的方式使用GDB。如果您必须在eclipse CDT中调试多线程程序,您会发现事情很快就会变得忙乱,因为当您遇到断点时,所有线程都会停止,当一个人尝试在特定线程中执行一行时,它也会运行其他线程。为了使它正常工作,线程必须能够任意和异常地运行 - 这样当程序员执行一行时,它只执行特定的线程。

因此,默认情况下,默认情况下gdb的设置会关闭“scheduler-locking”。如果您调试多线程应用程序,您将理解这必须在GDB中启用,以便实现所需的行为。如何运行此命令:

set scheduler-locking on

在eclipse CDT中的GDB中?

2 个答案:

答案 0 :(得分:3)

至少有一种方法可以解决问题,就是知道如何浏览eclipse提供的大量功能。通常,当程序启动时,eclipse CDT会切换控制台窗口(如果打开它,通常它位于底部)以显示程序的输入/输出。

但如果您不知道,可以更改此内容 - 请参阅此image。第二个到右边的那个按钮 - 看起来像监视器的蓝色按钮 - 你可以选择GDB输入控制台。它也在this thread中进行了讨论。

从那里只需输入命令。

已解决,但需要更好的解决方案

但是现在已经解决了这个问题,以更好的方式解决这个问题;必须在每次程序启动时键入set scheduler-locking都是愚蠢的。但是加载gdbinit文件的问题是在eclipse设置了gdb要解决的程序之前,gdbinit文件会被获取。这是一个问题,因为它导致调试器视图在eclipse中挂起,因为gdb抱怨。要了解发生了什么,请尝试启动gdb,然后在不加载要执行的二进制文件的情况下发出命令。它失败了 - 那么如何将其设置为粘性选项呢?

答案 1 :(得分:3)

也许你添加以下gdb脚本可以在程序停止时设置变量,如果继续则将其关闭:

define hook-step
set scheduler-locking on
end
define hookpost-step
set scheduler-locking off
end
define hook-run
set scheduler-locking off
end
define hook-continue
set scheduler-locking off
end