【问题标题】:command to suspend a thread with GDB使用 GDB 挂起线程的命令
【发布时间】:2011-08-07 12:15:22
【问题描述】:

我对 GDB 有点陌生。我希望有人可以帮助我做一些应该很简单的事情,我使用过 Google/docs,但我只是错过了一些东西。

人们使用 GDB 调试线程应用程序的“正常”方式是什么?我正在使用pthreads。我只想看一个线程 - 我看到的两个选项是

a) 告诉调试器以某种方式附加到特定线程,这样步进不会导致每次上下文切换时都跳转线程

b) 告诉调试器暂停/释放任何“无趣”的线程

我更喜欢路线 b) - 阅读 GDB 的帮助我没有看到这个命令,提示?

【问题讨论】:

    标签: c++ c gdb pthreads


    【解决方案1】:

    首先,您需要使用以下命令启用舒适的多线程调试器行为。不知道为什么默认禁用它。

    set target-async 1
    set non-stop on
    

    我个人将这些命令放入 .gdbinit 文件中。它们使您的每个命令仅应用于当前关注的线程。注意:线程可能正在运行,所以你必须暂停它。

    要查看焦点线程,请执行thread

    要切换到另一个线程,请附加线程的编号,例如thread 2.

    要查看所有线程及其编号问题info thread

    要将命令应用于特定线程发出类似 thread apply threadnum command 之类的问题。例如。 thread apply 4 bt 将回溯命令应用于线程号 4。thread apply all continue 继续所有暂停的线程。

    不过有一个小问题——许多命令需要暂停线程。我知道这样做的几种方法:

    • interrupt 命令:中断线程执行,接受多个线程暂停,不带参数中断焦点。
    • 在某处设置断点。请注意,您可以为特定线程设置断点,以便其他线程将忽略它,例如 break linenum thread threadnum。例如。 break 25 thread 4

    您可能还会发现 you can set a list of commands to be executed when a breakpoint hit 通过命令 commands 非常有用——例如您可以快速打印感兴趣的值,然后继续执行。

    【讨论】:

    • 感谢您的提示。我还发现在多线程程序中使用带有复杂表达式的条件断点(例如b func if arg1->foo().bar().c_str() == "xxx" )非常奇怪。你用过这种技术吗?
    • 哦,我什至不知道您可以将if condition 放入break 命令中。我以前先执行break somewhere,然后再执行commands,在这里我写下if-condition。谢谢你的提示! ;)
    【解决方案2】:

    请参阅set scheduler-locking on 的文档。

    注意:如果您挂起其他线程,并且其中一个持有锁,并且您的感兴趣的线程在单步执行时需要该锁,您将陷入死锁。

    人们调试线程应用程序的“正常”方式是什么

    您永远无法调试线程正确性,您只能将其设计进去。根据我的经验,线程应用程序的大多数调试都是放入断言,并在违反其中一个断言时检查世界的状态。

    【讨论】:

    • 通过“正常”我提到的技术问题的频率比线程编程的“操作方法”要多。在 Windows 上,我通常会看到人们在专注于特定线程时冻结一两个他们想要忽略的线程。 “设置调度程序锁定”技术有点相反
    • 有没有办法只冻结一个线程?我只看到关闭/打开的选项
    猜你喜欢
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多