讲师中心 微信公众号
AI工具推荐 视频效率加速

perf record -g 火焰图全是 [unknown] 的用户态符号解析完整流程

雨墨大大_7054

雨墨大大_7054

发布时间:2026-01-21 18:29:21

|

1042人浏览过

|

来源于php中文网

原创

[unknown]大量出现是因缺少调试符号、帧指针或符号路径失效;需编译加-g -fno-omit-frame-pointer,检查file/nm确认符号存在,保持二进制路径不变,并用perf report验证函数名是否解析成功。

perf record -g 火焰图全是 [unknown] 的用户态符号解析完整流程

使用 perf record -g 生成火焰图后,大量显示 [unknown](尤其在用户态),说明 perf 无法解析用户程序的符号信息。这不是 bug,而是缺少调试符号、动态链接信息或 perf 配置不当所致。核心在于让 perf 能正确回溯调用栈并关联到源码函数名。

确认二进制是否包含调试符号和符号表

perf 解析用户态函数依赖 ELF 文件中的符号表(.symtab)和调试信息(.debug_*)。若编译时未保留,perf 就只能看到地址,显示为 [unknown]。

  • 检查是否存在符号:运行 file your_program,输出中应含 with debug_info 或至少 not stripped;若显示 stripped,符号已被移除
  • 验证符号表:用 nm -C your_program | head -10 查看是否有可读函数名(如 main、foo);若全是 U(undefined)或空,说明无有效符号
  • 编译时务必加:gcc -g -O2 -fno-omit-frame-pointer your.c -o your_program。-g 生成调试信息,-fno-omit-frame-pointer 是关键——它保证调用栈能被 perf 正确展开(尤其启用 -g 后默认可能仍省略)

确保 perf 能定位到可执行文件和共享库

perf 在记录时不加载符号,而是在 perf report 或生成火焰图时按需查找。若程序已退出、路径变更、或动态库被替换,符号就无法匹配。

Python Testing
Python Testing

Python 测试速查:运行 pytest、使用 mock/patch、参数化、fixtures、异步、覆盖率测试。

下载
  • 记录时尽量保持程序运行状态(如 perf record -g ./your_program),或用 perf record -g -p $(pidof your_program) 追踪已有进程
  • 记录后不要移动/重编译二进制或 so 库;否则 perf script 输出中的 buildid 与当前文件不匹配,导致符号加载失败
  • 检查 perf 是否找到文件:perf report --debug=2 2>&1 | grep "looking for",观察它是否在正确路径搜索你的程序或 libc.so.6 等
  • 若用系统库(如 libc),确保安装了对应的 debuginfo 包(如 CentOS 的 glibc-debuginfo,Ubuntu 的 libc6-dbg)

正确生成火焰图并验证符号解析

从 perf.data 到火焰图需经过符号解析环节,常用 perf script + FlameGraph 工具链。中间任何一步跳过符号处理都会保留 [unknown]。

  • 先用 perf report -g --no-children 直接查看文本报告,确认顶部是否出现真实函数名(如 main、malloc)。若仍是 [unknown],说明前面两步未解决
  • 生成火焰图时,必须让 perf script 输出含符号名:perf script -F comm,pid,tid,cpu,time,period,ip,sym,dso > out.stacks。其中 sym(符号名)和 dso(动态库名)字段必须有内容,否则火焰图工具无法映射
  • 若 out.stacks 中某行 ip 对应列为 sym 空、dso 为 [unknown],说明该帧既无符号也找不到对应 DSO 文件(常见于 JIT 代码、mmap 匿名内存、或内核模块)
  • 对 C++ 程序,确保 FlameGraph 的 stackcollapse-perf.pl 使用 --demangle 参数(或设置环境变量 PERF_SCRIPT_DEMANGLE=1),否则符号是 mangled 名(如 _Z3fooi),火焰图工具无法识别

特殊场景排查:JIT、动态加载、容器环境

即使上述都满足,某些运行时行为仍会导致部分帧显示为 [unknown],需针对性处理。

  • JIT 语言(Java/JS/Python):JVM/V8/CPython 在运行时生成代码,地址不在原始 ELF 中。需启用对应 perf 支持:Java 加 -XX:+PreserveFramePointer -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints,并配合 perf-map-agent 注入 symbol map
  • dlopen 动态库:若库在 perf 记录开始后才加载,perf 可能未捕获其映射事件。尝试加 -d 参数(perf record -g -d)启用动态符号跟踪,或用 perf buildid-list 检查是否记录了该库的 build-id
  • 容器环境:宿主机 perf 无法直接读取容器内路径的二进制。要么在容器内运行 perf(推荐),要么将容器内二进制和 debuginfo 复制到宿主机相同路径,并用 perf buildid-cache -v --add /path/to/binary 手动注入符号缓存
  • 内核态 vs 用户态混淆:[unknown] 出现在用户态栈中,通常不是内核问题;但若调用栈频繁进入 [kernel.kallsyms] 后断开,可能是内核配置禁用了 frame pointer(CONFIG_FRAME_POINTER=n),此时需依赖 DWARF 展开(需 kernel-debuginfo + perf 编译支持)

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

299

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4707

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2128

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

430

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

473

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

243

2025.11.27

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

3836

2023.06.20

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn