【问题标题】:Eclipse CDT multithreaded debugging not-optimal - how does one run threads exclusively?Eclipse CDT 多线程调试不是最佳的 - 如何独占运行线程?
【发布时间】:2012-05-13 18:03:14
【问题描述】:

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

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

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

set scheduler-locking on

在 eclipse CDT 内的 GDB 中?

【问题讨论】:

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


    【解决方案1】:

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

    但如果您不知道,您可以更改此设置 - 请参阅此 image。倒数第二个右侧的那个按钮——看起来像监视器的蓝色按钮——你可以选择 GDB 输入控制台。 this thread 也对此进行了讨论。

    从那里只需键入命令。

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

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

    【讨论】:

    • 嗨,亚当,还有答案吗?
    • 好吧,我想我正在寻找的是让 eclipse CDT 开发人员注意到我要说的话;我不是 Eclipse 程序员。某种按钮会很好
    • 谢谢,您是否还看到删除所有断点后仍停在同一位置的行为?
    • 我不知道你在问什么。关键是并发代码没有线程锁定,如果你设置了断点,并且任何调试器干预并停止执行的情况发生,你永远无法很好地控制整个并发系统作为一个整体.因此,如果我在线程 1.cpp(仅限该线程的本地类)中放置一个断点,并且线程 2 与线程 1 并发执行;在我停止线程 1 之后,一旦我再次启动它,每次我在线程 1 中点击下一个时,线程 2 都会执行。我想要按线程进行精细控制(调度程序锁定)。这在日食中很不稳定
    【解决方案2】:

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

    【讨论】:

    • 究竟是如何从 Eclipse 内部执行 GDB 脚本的?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-24
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2011-07-19
      相关资源
      最近更新 更多