我正在尝试调试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
答案 0 :(得分:1)
如何确定此线程42的起始位置?
你不能:GDB和OS都没有跟踪“谁开始这个帖子”。 (知道创建特定线程的位置通常也毫无用处。)
您可以做的是将检测放入您自己的pthread_create
调用并记录“线程X创建的线程Y”,或使用catch syscall clone
,并在GDB中打印创建堆栈跟踪,然后匹配它们稍后到崩溃的线程(将其LWP
与clone
管理员的返回值匹配)。
另外,为什么最后一行(第0帧)没有出现?
你的意思是框架#3
。它不存在 - clone
是线程所在的位置(存在)。
P.S。安装libc调试符号以便在__nptl_deallocate_tsd
内看到 where 线程崩溃的可能性比提供线程创建细节更有可能提供线索。