我对 GDB 有点陌生。我希望有人可以帮助我做一些应该很简单的事情,我已经使用了 Google/docs,但我只是错过了一些东西。
人们使用 GDB 调试线程应用程序的“正常”方式是什么?我正在使用 pthreads。我只想看一个线程 - 我看到的两个选项是
a)告诉调试器以某种方式附加到特定线程,这样单步执行就不会导致在每个上下文切换上跳转线程
b) 告诉调试器挂起/释放任何“无趣”的线程
我更喜欢走路线 b) - 阅读 GDB 的帮助,我没有看到这方面的命令,有提示吗?
请参阅文档
set scheduler-locking on
。
注意:如果您挂起其他线程,并且其中一个线程持有锁,并且您感兴趣的线程在单步执行时的某个时刻需要该锁,那么您将陷入死锁。 人们调试线程应用程序的“正常”方式是什么
你永远无法调试线程的正确性,你只能设计它。根据我的经验,线程应用程序的大多数调试都是放入断言,并在违反断言之一时检查世界状态。
首先,您需要使用以下命令启用多线程调试器行为。不知道为什么默认情况下它被禁用。
set mi-async on
set non-stop on
你必须将它们放入
.gdbinit文件中,因为在调试期间不允许更改它们。它们使每个命令仅适用于当前聚焦的线程。注意:线程可能正在运行,所以你必须暂停它。
查看焦点话题:
thread
要切换到另一个,请附加其编号,例如
thread 2
查看所有线程及其编号:
info thread
将命令应用于特定线程类似于
thread apply <threadnum> <command>
thread apply 4 bt
将向编号为 4 的线程应用“backtrace”命令。
thread apply all continue
继续所有暂停的线程(或者您可以使用
continue -a
).
但是有一个小问题——许多命令需要暂停线程。我知道一些方法:interrupt
在某处设置断点。请注意,您可以为特定线程设置断点,以便其他线程将忽略它,例如
break <linenum> thread <threadnum>
break 25 thread 4
。您可能还会发现非常有用,
commands
设置断点命中时要执行的命令列表 - 例如您可以快速打印有趣的值,然后继续执行。