Backtrace退出线程。

时间:2016-08-23 13:22:54

标签: multithreading debugging x86 gdb backtrace

我注意到一个线程的回溯看起来像:

Thread 8 (Thread 0x7f385f185700 (LWP 12861)):
#0  0x00007f38655a3cf4 in __mcount_internal (frompc=4287758, selfpc=4287663) at mcount.c:72
#1  0x00007f38655a4ac4 in mcount () at ../sysdeps/x86_64/_mcount.S:47
#2  0x0000000000000005 in ?? ()
#3  0x00007f382c02ece0 in ?? ()
#4  0x000000000000002d in ?? ()
#5  0x000000000000ffff in ?? ()
#6  0x0000000000000005 in ?? ()
#7  0x0000000000000005 in ?? ()
#8  0x0000000000000000 in ?? ()

这似乎是退出的线程,但我不确定。 我想知道如何理解它。特别是,我不明白它是什么意思LWPThread 0x7f385f185700(该地址是什么)? 此外,我注意到分析器表明__mcount_internal花费了相当多的时间。它是什么以及为什么耗时?特别是frompcselfpc计数器是什么?

我的内核是Linux 4.4.0,并且线程与POSIX兼容(C ++ 11实现)。

1 个答案:

答案 0 :(得分:1)

LWP =轻量级进程,表示线程。 Linux线程每个都有自己的线程ID,来自与PID号相同的序列,即使它们是一个单独的进程。如果您在/proc/PID/task中查找多线程进程,您将看到每个线程ID的条目。

0x7f385f185700可能是该线程的RIP(指令指针)。

frompcselfpc__mcount_internal() glibc函数的函数参数。

您的回溯可以显示名称和参数,因为您已为glibc安装了调试符号。你刚刚得到??对于父函数,因为您没有为包含它们的程序或库安装调试信息。 (使用-g编译您自己的程序,并安装qtbase5-dbglibglib2.0-0-dbg等软件包以获取发行版打包的库的调试符号。

mcount似乎与分析相关(即-fprofile-generate-pg生成的代码)。这可以解释为什么它将程序计数器值作为args。

Why do applications compiled by GCC always contain the _mcount symbol?

该线程尚未退出。你不会看到尽可能多的细节。 (可能根本不会看到它。)