Linux下GDB核心转储:从pthread_t获取LWP遇异常值问题
问题:从Linux核心转储中通过GDB获取pthread对应的LWP(tid)结果格式不符
我有一份Linux核心转储文件,想要通过GDB从中获取pthread对应的Linux tid(LWP)。参考方案执行了以下GDB命令:
(gdb) p &this->m_thread->m_state->m_Thread $29 = (pthread_t *) 0x7f05f84bde00 (gdb) p &((struct pthread *)(&this->m_thread->m_state->m_Thread))->tid $28 = (pid_t *) 0x7f05f84be0d0 (gdb) p *&((struct pthread *)(&this->m_thread->m_state->m_Thread))->tid $30 = 136478480
但得到的值与执行info threads时看到的LWP(如2977、5110)格式不符,请问我哪里操作出错了?
问题原因与解决方法
你的核心错误是对pthread_t的类型转换多做了一次取地址操作:在Linux NPTL线程库实现中,pthread_t本身就是指向struct pthread结构体的指针,不需要再用&取地址——额外的&导致访问了错误的内存区域,得到的是无效数值。
正确操作步骤如下:
- 先查看目标
pthread_t的实际值(即struct pthread的起始地址):(gdb) p this->m_thread->m_state->m_Thread $x = (pthread_t) 0x7f05f84bde00 - 直接将该
pthread_t转换为struct pthread*,并访问tid字段:
此时得到的数值就会和(gdb) p ((struct pthread*)this->m_thread->m_state->m_Thread)->tid $y = 2977info threads显示的LWP完全一致。
额外提示:
- 可以通过GDB命令
ptype struct pthread查看线程结构体的完整定义,确认tid字段的位置与类型,避免类似的内存偏移错误。 - Linux NPTL中,
struct pthread的tid字段直接存储的就是系统级的LWP ID,和ps -L或info threads显示的数值一致。
内容的提问来源于Stack Exchange,提问作者JenyaKh
相关产品推荐
相关产品推荐

