You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结构体的指针,不需要再用&取地址——额外的&导致访问了错误的内存区域,得到的是无效数值。

正确操作步骤如下:

  1. 先查看目标pthread_t的实际值(即struct pthread的起始地址):
    (gdb) p this->m_thread->m_state->m_Thread
    $x = (pthread_t) 0x7f05f84bde00
    
  2. 直接将该pthread_t转换为struct pthread*,并访问tid字段:
    (gdb) p ((struct pthread*)this->m_thread->m_state->m_Thread)->tid
    $y = 2977
    
    此时得到的数值就会和info threads显示的LWP完全一致。

额外提示:

  • 可以通过GDB命令ptype struct pthread查看线程结构体的完整定义,确认tid字段的位置与类型,避免类似的内存偏移错误。
  • Linux NPTL中,struct pthread的tid字段直接存储的就是系统级的LWP ID,和ps -L或info threads显示的数值一致。

内容的提问来源于Stack Exchange,提问作者JenyaKh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:10:03