debugging 已退出线程回溯跟踪

0yg35tkg  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(151)

我注意到其中一个线程的回溯如下所示:

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(地址是什么)?另外,我注意到profiler显示__mcount_internal比较耗时,这是什么,为什么耗时?特别是,什么是frompcselfpc计数器?
我的内核是Linux4.4.0,线程与POSIX(C++11实现)兼容。

3zwtqj6y

3zwtqj6y1#

LWP =轻量级进程,表示线程。Linux线程每个都有自己的线程ID,与PID编号的顺序相同,即使它们 * 不是 * 独立的进程。如果你在/proc/PID/task中查找多线程进程,你会看到每个线程ID的条目。
0x7f385f185700是来自pthread_self(3)的pthread ID。这是指向pthread_t的指针。
该线程在RIP = 0x00007f38655a3cf4处停止,RIP = 0x00007f38655a3cf4是帧#0中的地址。
frompcselfpc__mcount_internal() glibc函数得函数参数.
你的回溯可以显示它们的名称和参数,因为你已经为glibc安装了调试符号。你只得到了父函数的??,因为你没有为包含它们的程序或库安装调试信息。(用-g编译你自己的程序,并安装像qtbase5-dbglibglib2.0-0-dbg这样的包来为你的发行版打包的库获取调试符号)。
mcount似乎与分析有关(即由-fprofile-generate-pg生成的代码)。这可以解释为什么它将程序计数器值作为参数。
Why do applications compiled by GCC always contain the _mcount symbol?
该线程尚未退出。如果退出了,您将看不到那么多详细信息。(可能根本看不到。)

相关问题