Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法查看哪个线程正在使用gdb打印到标准输出或标准输出?_C++_Multithreading_Gdb - Fatal编程技术网

C++ 有没有办法查看哪个线程正在使用gdb打印到标准输出或标准输出?

C++ 有没有办法查看哪个线程正在使用gdb打印到标准输出或标准输出?,c++,multithreading,gdb,C++,Multithreading,Gdb,我正在用gdb调试一个多线程应用程序 我可以看到线程,并用它们播放切换/中断,但有时当我连接到某个特定线程时,其他一些线程会打印一些内容 如何找出哪个线程正在打印哪个部分?除了在策略位置[printf、fprintf、write或其他类似位置]设置断点外,我想您可以在任何printf前面(或后面)加上线程id(但您可能需要为每个printf手动添加它,或者至少需要知道的那些printf) 如果您使用的是cout而不是printf,可能会更容易一些,因为您可以这样做(像这样丑陋的事情): #def

我正在用gdb调试一个多线程应用程序

我可以看到线程,并用它们播放切换/中断,但有时当我连接到某个特定线程时,其他一些线程会打印一些内容


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

除了在策略位置[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()