如何知道是谁开始线程
问题描述:
我想在gdb其中核心倾倒在此线程调试崩溃。还有其他40多个线程同时进行。我怎么知道这个线程42是从哪里开始的?如何知道是谁开始线程
另外,为什么在最后一行(第0帧#)没有显示出来?
Thread 42 (Thread 0x2aaba65ce940 (LWP 15854)):
#0 0x0000003a95605b03 in __nptl_deallocate_tsd() from /lib64/libpthread.so.0
#1 0x0000003a9560684b in start_thread() from /lib64/libpthread.so.0
#2 0x0000003a946d526d in clone() from /lib64/libc.so.6
#3 0x0000000000000000 in ??()
我用gdb版本7.7
答
如何揣摩出这个线程42从开始的?
您不能:GDB和操作系统都不会跟踪“谁启动此线程”。 (知道某个特定线程创建的位置通常也是无用的)。
你可以做的是要么把仪器到您自己的呼叫pthread_create
和日志“线程X创建的线程Y”,或使用catch syscall clone
,并在GDB版画创作的堆栈跟踪,然后再与它们匹配的崩溃线程(赛它的LWP
返回值为clone
earler)。
此外,为什么最后一行(frame#0)没有显示出来?
您的意思是帧数#3
。它不存在 - clone
是线程承载(存在)的地方。
P.S.安装的libc调试符号,所以你可以看到其中内__nptl_deallocate_tsd
线程崩溃更可能提供线索比知道线程创建细节。
一个更有趣的问题是为什么这么多线程?猜你喜欢处理器进行上下文切换,而不是完成任务! – 2014-10-10 04:31:45
我无法控制..这是一个非常大的代码库 – bohanl 2014-10-10 06:07:05
非常好的问题。我不明白那些没有评论的解释。通常你不知道你正在使用的库创建的线程,并且想要将问题跟踪到你的代码。类似问题:http://*.com/questions/6069484/finding-creator-of-crashed-thread-in-os-x-gdb – 2017-01-19 13:54:18