0

0

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

舞夢輝影

舞夢輝影

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

|

902人浏览过

|

来源于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 查看是否有可读函数名(如 mainfoo);若全是 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 或生成火焰图时按需查找。若程序已退出、路径变更、或动态库被替换,符号就无法匹配。

Veed AI Voice Generator
Veed AI Voice Generator

Veed推出的AI语音生成器

下载
  • 记录时尽量保持程序运行状态(如 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 直接查看文本报告,确认顶部是否出现真实函数名(如 mainmalloc)。若仍是 [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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

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

435

2023.07.18

堆和栈区别
堆和栈区别

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

601

2023.08.10

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

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

77

2025.09.05

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

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

40

2025.11.16

golang map原理
golang map原理

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

67

2025.11.17

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

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

47

2025.11.27

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

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

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

554

2023.07.28

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号