C++ 有没有办法查看哪个线程正在使用gdb打印到标准输出或标准输出?
我正在用gdb调试一个多线程应用程序 我可以看到线程,并用它们播放切换/中断,但有时当我连接到某个特定线程时,其他一些线程会打印一些内容C++ 有没有办法查看哪个线程正在使用gdb打印到标准输出或标准输出?,c++,multithreading,gdb,C++,Multithreading,Gdb,我正在用gdb调试一个多线程应用程序 我可以看到线程,并用它们播放切换/中断,但有时当我连接到某个特定线程时,其他一些线程会打印一些内容 如何找出哪个线程正在打印哪个部分?除了在策略位置[printf、fprintf、write或其他类似位置]设置断点外,我想您可以在任何printf前面(或后面)加上线程id(但您可能需要为每个printf手动添加它,或者至少需要知道的那些printf) 如果您使用的是cout而不是printf,可能会更容易一些,因为您可以这样做(像这样丑陋的事情): #def
如何找出哪个线程正在打印哪个部分?除了在策略位置[printf、fprintf、write或其他类似位置]设置断点外,我想您可以在任何printf前面(或后面)加上线程id(但您可能需要为每个printf手动添加它,或者至少需要知道的那些printf) 如果您使用的是
cout
而不是printf,可能会更容易一些,因为您可以这样做(像这样丑陋的事情):
#define cout cout << pthread_self() << ":"
(gdb) p pthread_self()
#define cout首先,您需要在FD number处于条件下的write
系统调用上设置条件断点,并在该断点处停止。
具体情况取决于您使用的体系结构
对于64位x86,它可以是:
(gdb) catch syscall write
(gdb) condition 1 $rdi==1
对于32位:
(gdb) catch syscall write
(gdb) condition 1 $ebx==1
这些示例适用于标准输出。对于stderr,条件将略有变化,例如(gdb)条件1$rdi==2
完成后,您可以通过info threads
输出或手动调用pthread\u self()
查看线程编号,如下所示:
#define cout cout << pthread_self() << ":"
(gdb) p pthread_self()