在断点处打印线程ID

时间:2017-02-01 05:05:00

标签: c++ multithreading debugging gdb

我正在调试一些C ++代码。当我在断点处暂停时,如果我执行info thread,gdb会向我显示我的进程中所有线程的列表,并在断点处执行的线程旁边放置一个星号。是否有一个gdb命令使gdb在断点时告诉你线程id?

我正在做catch throwcatch catch,以便在线程1上抛出异常时进行调试。但是,线程2同时也会抛出并捕获异常。因为,我只对thread1上的throwcatch感兴趣,我打算向gdb请求threadid,如果threadid为2,则断点断点继续。

(gdb) catch throw
Catchpoint 7 (throw)
(gdb) catch catch
Catchpoint 8 (catch) 
(gdb) command 8
> if threadid == 2
>      c
> end

你能告诉我如何写这一行if threadid == 2吗?

1 个答案:

答案 0 :(得分:2)

使用built-in $_thread convenience variable

  

调试器便捷变量$_thread$_gthread包含,   分别是每个下线程数和全局线程   当前线程的编号。您可能会发现这有用   断点条件表达式,命令脚本等。看到   便利变量,方便变量的一般信息   变量

catch catch if $_thread == 1

使用Python API

  

- 功能:gdb.selected_thread()此函数返回线程   所选线程的对象。如果没有选定的线程,这个   将返回无。

catch catch
command
  python
    if gdb.selected_thread() != 1:
      gdb.execute('continue');
  end
end

一般来说,当GDB缺少某个功能时,您很可能无法使用Python API实现它,因为它允许您浏览正在运行的程序和上下文。