17

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

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

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

set scheduler-locking on

在 Eclipse CDT 中的 GDB 中?

4

3 回答 3

4

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

但是如果你不知道,你可以改变它——看到这张图片。倒数第二个右侧的那个按钮——看起来像监视器的蓝色按钮——你可以选择 GDB 输入控制台。在这个线程中也进行了讨论。

从那里只需键入命令。

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

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

于 2012-05-04T07:43:58.637 回答
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
于 2013-08-02T12:37:08.790 回答
0

我的答案来自@user1448557 的答案。不幸的是,我目前没有足够的声誉来评论它(或者顺便提一下)。该策略似乎很棒,但答案可能有点过时,因为它不涉及“设置调度程序锁定步骤”。我已将以下内容放在我的 gdb 初始化文件中(在我的 Eclipse 项目中),它可以满足我的要求。

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

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

于 2021-10-31T20:22:28.883 回答