GDB怎么跟踪线程创建过程

冬浩大大_2352

冬浩大大_2352

2026-09-08

980人浏览

原创

最直接可控的线程诞生跟踪方式是在 pthread_create 函数入口设断点,停住后用 next 执行完调用再 info threads 查看新线程 id。

gdb怎么跟踪线程创建过程

用 break pthread_create 拦住线程诞生瞬间

线程创建不是魔法,本质就是调用 pthread_create。GDB 无法“自动感知”线程何时诞生,但可以在该函数入口打断点,强制程序在新线程真正启动前停住。这是最直接、最可控的跟踪起点。

注意:必须确保编译时加了 -g,且链接了 pthread 库(-lpthread),否则 GDB 可能找不到符号或跳转到汇编层。

  • 启动调试:gdb ./your_program
  • 设断点:break pthread_create(不要写成 break pthread_create(),括号会报错)
  • 运行:run,程序会在每次调用 pthread_create 前停下
  • 此时还没生成新线程,info threads 仍只显示主线程

next 和 step 的区别决定你能否看到线程 ID 出现

在 pthread_create 断点处,用 next 会直接执行完该函数调用(返回成功后继续),这时新线程已启动,info threads 就能看到新增线程;而用 step 会跳进 pthread_create 内部实现(通常是 glibc 汇编或 C 实现),对理解业务逻辑帮助小,还容易卡在系统层。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 推荐操作:停在 pthread_create 后,先 print $rax(x86_64 下返回值在 $rax)确认是否为 0(成功)
  • 再执行 next,然后立刻 info threads —— 新线程 ID 会出现在列表里,带 (LWP xxx) 标识
  • 如果 next 后没看到新线程,说明 pthread_create 失败了,检查传入的 attr 或栈大小等参数

为什么 info threads 有时看不到刚创建的线程?

不是 GDB 漏了,而是线程对象虽已分配,但内核线程(LWP)尚未完全初始化或调度。常见于以下情况:

  • 断点设在 pthread_create 返回之后,但新线程函数还没开始执行第一行代码(比如它开头是 sleep(1))
  • 程序用了自定义线程池或延迟启动逻辑,pthread_create 成功但线程体被挂起
  • GDB 版本较老(
  • 你正在调试的是 clone 系统调用直连的线程(非 pthread 封装),此时 pthread_create 断点无效,得用 break clone 或 catch syscall clone

想看线程函数里第一行就断住?用 thread apply all break 不现实

别试图在所有线程上统一打同一个函数断点——新线程还没存在,thread apply all 对它无效。正确做法是:在 pthread_create 断点触发后,记下即将传入的线程函数指针(如 arg 参数里的函数地址),然后手动对那个函数设断点。

  • 例如:print *(void**)($rdi + 8)(x86_64,$rdi 是第一个参数,函数指针通常在结构体偏移 8 字节)
  • 拿到地址后:break *0x7ffff7bcb123(把地址换成实际值)
  • 再 continue,新线程一执行就会停在它自己的第一行
  • 这个过程没法自动化,必须人工介入一次,因为函数地址在 ASLR 开启时每次不同

线程创建过程本身极快,GDB 的介入点只有两个可靠位置:pthread_create 入口和线程函数入口。中间那段“线程已创建但未执行”的空白期,靠 info threads 刷新频率或 thread 切换是抓不住的——它根本不在用户可控的代码路径上。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4258

6

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

0

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

0

16

剧云故事大纲与分场规划教程
剧云故事大纲与分场规划教程

本专题讲解剧云梗概与多级大纲功能,覆盖全局、分集、分场结构生成,以及主线冲突、剧情节点和场次顺序调整。

2026.10.22

0

15

VibeKnow PPT讲解视频教程汇总
VibeKnow PPT讲解视频教程汇总

本专题介绍VibeKnow PPT讲解模式的素材准备、旁白生成、页面节奏、画面呈现与导出设置,适合课程和培训场景。

2026.10.22

0

16

VibeKnow PDF转视频教程合集
VibeKnow PDF转视频教程合集

本专题围绕VibeKnow的PDF转视频功能,讲解文件准备、内容解析、脚本生成、重点可视化及配音字幕检查方法。

2026.10.22

0

12

二狗PPT模板与视觉设计
二狗PPT模板与视觉设计

本专题介绍二狗PPT的职场模板、主题风格与页面版式,覆盖模板切换、色彩选择、内容匹配和正式汇报场景下的视觉优化方法。

2026.10.22

0

13

php漏洞修复方法
php漏洞修复方法

PHP漏洞聚合专题,持续整理PHP最新高危漏洞、CVE安全预警、受影响版本、自查命令及修复方案,覆盖PHP-FPM、Docker、Ubuntu与Linux服务器环境,帮助开发者快速完成漏洞排查、版本升级和安全加固。

2026.10.22

20

31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ 手册教程
C++ 手册教程

共41课时 | 78.4万人学习