使用 GDB 暂停线程的命令

问题描述 投票:0回答:2

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

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

a)告诉调试器以某种方式附加到特定线程,这样单步执行就不会导致在每个上下文切换上跳转线程

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

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

c++ c gdb pthreads
2个回答
15
投票

请参阅文档

set scheduler-locking on

注意:如果您挂起其他线程,并且其中一个线程持有锁,并且您感兴趣的线程在单步执行时的某个时刻需要该锁,那么您将陷入死锁。 人们调试线程应用程序的“正常”方式是什么

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

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

14
投票
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

设置断点命中时要执行的命令列表 - 例如您可以快速打印有趣的值,然后继续执行。

© www.soinside.com 2019 - 2024. All rights reserved.