Eclipse CDT 多线程调试不是最佳的 - 如何以独占方式运行线程

Eclipse CDT multithreaded debugging not-optimal - how does one run threads exclusively?

本文关键字:方式 线程 运行 调试 多线程 CDT 最佳 Eclipse      更新时间:2023-10-16

我知道这个问题的答案,我把它放在这里给别人看

如果你使用 eclipse

CDT,你可能会明白 eclipse 不是一个调试器,它只是一个应用程序前端,专门用于 GDB。因此,在调试C++程序时,您实际上只是以更舒适的方式使用 GDB。如果你必须在 eclipse CDT 中调试一个多线程程序,你会意识到事情很快就会变得忙碌,因为当你遇到断点时,所有线程都会停止,当一个线程尝试在特定线程中执行一行时,它也会运行其他线程。为了使它正常工作,线程必须能够任意和排他性地运行,以便当程序员执行一行时,它只执行特定的线程。

因此,默认情况下,gdb的设置默认关闭"调度程序锁定"。如果调试多线程应用程序,您将了解必须在 GDB 中启用此功能才能实现所需的行为。如何运行此命令:

set scheduler-locking on

在日食CDT中的GDB中?

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

但是,如果您不知道,可以更改此设置 - 请参阅此图像。倒数第二个右边的按钮(看起来像显示器的蓝色按钮(可以选择 GDB 输入控制台。在这个线程中也讨论了它。

从那里只需键入命令。

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

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

也许如果您添加以下 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

我的答案来自 @user1448557 . 不幸的是,我目前没有足够的声誉来评论它(或者顺便说一下对它投赞成票(。 该策略似乎很棒,但答案可能有点过时,因为它不涉及"设置调度程序锁定步骤"。 我已经在我的 gdb 初始化文件中(在我的 Eclipse 项目中(中放置了以下内容,它做了我想要的。

#inspired from [link to this thread][1]
define hookpost-run
set scheduler-locking step
end

关于@rbaleksandar的评论,Eclipse CDT 启动配置允许指定"GDB 命令文件",默认值通常是 .gdbinit