有没有办法看到哪个线程正在使用gdb打印到stdout或stderr?

时间:2013-05-25 21:28:09

标签: c++ multithreading gdb

我正在使用gdb调试多线程应用程序。

我可以看到线程,并使用它们进行切换/中断,但有时当我附加到特定线程时,其他一些线程会打印出来。

如何找出哪个线程正在打印哪个部分?

2 个答案:

答案 0 :(得分:1)

除了在战略位置设置断点[printf,fprintf,write或者其他类似]之外,我想你可以使用thread-id为任何printf加前缀(或后缀)(但你可能需要为每个人手动添加它们) printf - 或至少你需要知道的那些)。

如果你使用cout而不是printf,它可能会更容易,就像你可以做的那样(像丑陋一样)这样的东西:

#define cout cout << pthread_self() << ":"

虽然可能会导致cout.flush()cout.setprecision()等问题。

答案 1 :(得分:0)

首先,您需要在write系统调用上设置条件断点,条件为FD编号,并在此断点处停止。 确切的条件取决于您使用的架构。

对于64位x86,它可以是:

(gdb) catch syscall write
(gdb) condition 1 $rdi==1

对于32位:

(gdb) catch syscall write
(gdb) condition 1 $ebx==1

这些示例适用于stdout。对于stderr,条件会略有变化,例如(gdb) condition 1 $rdi==2

完成此操作后,您可以从info threads输出轻松查看主题号码,也可以像这样手动调用pthread_self()

(gdb) p pthread_self()