我正在使用gdb调试多线程应用程序。
我可以看到线程,并使用它们进行切换/中断,但有时当我附加到特定线程时,其他一些线程会打印出来。
如何找出哪个线程正在打印哪个部分?
答案 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()