0

I am debugging a multithreaded application with gdb.

I can see the threads, and play switch / break with them, but sometimes when I am attached to a particular thread, some of the other threads print something.

How can I find out which thread is printing what part?

4

2 回答 2

1

除了在战略位置 [printf、fprintf、write 或其他] 设置断点之外,我想您可以为任何 printf 加上一个线程 ID 前缀(或后缀)(但您可能需要为每个 printf 手动添加它 - 或那些你至少需要知道的)。

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

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

尽管它可能会导致一些问题,例如cout.flush()or cout.setprecision()

于 2013-05-25T21:49:06.680 回答
0

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

对于 64 位 x86,它可以是:

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

对于 32 位:

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

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

完成后,您可以轻松地从info threads输出或手动调用中查看线程号,pthread_self()如下所示:

(gdb) p pthread_self()
于 2013-05-27T18:14:56.793 回答