0

0

perf record -g 抓取火焰图后全是 [unknown] 的符号解析方法

舞姬之光

舞姬之光

发布时间:2026-01-21 20:15:08

|

279人浏览过

|

来源于php中文网

原创

perf调用栈显示[unknown]是因缺失用户态符号表,主因包括调试信息缺失、动态库识别失败或符号路径配置错误;需检查二进制是否含.symtab/.debug*段,编译加-g,安装-debuginfo包,配置PERF_BUILDID_DIR及--symfs,并确认/proc/PID/maps可读与ptrace权限正常。

perf record -g 抓取火焰图后全是 [unknown] 的符号解析方法

这是因为 perf 无法找到用户态程序的符号表(如函数名、行号等),导致调用中大量显示 [unknown]。核心问题通常出在缺少调试信息、动态链接库未被正确识别,或内核/用户态符号路径配置不当。

确认二进制文件是否包含调试符号

运行以下命令检查可执行文件或共享库是否带有 .symtab.debug_* 段:

readelf -S /path/to/your/binary | grep -E '\.(symtab|debug)'
file /path/to/your/binary | grep "with debug"

若无输出,说明编译时未保留调试信息。重新编译需加:
gcc -g -O2 ...-g 是关键)
对已发布的二进制,可尝试安装对应的 -debuginfo-dbg 包(如 CentOS 的 debuginfo-install,Ubuntu 的 apt install your-package-dbgsym)。

确保 perf 能定位到符号文件和动态库

perf 默认只搜索标准路径(如 /usr/lib, /lib),而你的程序可能使用自定义路径(如 LD_LIBRARY_PATH 中的目录)或静态链接部分模块:

  • perf record -g --call-graph dwarf,1024 替代默认的 fp(frame pointer),DWARF 方式能更好处理优化后的栈帧
  • 运行前设置:export PERF_BUILDID_DIR=~/.debug,并用 perf buildid-list -i perf.data | perf buildid-cache -v --add /path/to/binary 手动注入符号
  • 对非标准路径的 so 文件,复制其副本到 /tmp/mylibs/,再用 perf script --symfs /tmp/mylibs 指定符号根目录

检查内核与用户态符号权限及映射

某些环境(如容器、chroot、seccomp 限制)会阻止 perf 访问 /proc/PID/maps/proc/PID/exe,导致无法关联内存地址到文件:

CoCo
CoCo

智谱AI推出的首个有记忆的企业自主Agent智能体

下载
  • 确认目标进程未被 ptrace 限制:cat /proc/sys/kernel/yama/ptrace_scope 应为 0(否则需 root 或调整)
  • 检查 /proc/PID/maps 是否可读,且其中的路径存在且有执行权限(尤其注意容器中挂载的 binary 是否被覆盖或只读)
  • 若用 perf record -p PID,建议在进程启动时就 attach,避免早期栈帧丢失;也可改用 perf record -e 'syscalls:sys_enter_*' -g 辅助交叉验证

生成火焰图前先验证符号是否可用

不要直接跳到 flamegraph.pl,先用 perf 自带工具看原始解析效果:

perf script > out.perf
# 查看前 20 行是否有真实函数名
head -20 out.perf | grep -v '\[unknown\]'
# 或过滤掉 unknown 后统计热点
perf script | awk '$NF !~ /\[unknown\]/ {print $NF}' | sort | uniq -c | sort -nr | head -10

如果 perf script 输出仍有大量 [unknown],说明符号问题未解决;若已正常显示函数名,但火焰图仍乱,可能是 stackcollapse-perf.pl 解析异常,可尝试升级 FlameGraph 工具集 或换用 perf script -F +pid,+tid,+comm 增加上下文辅助诊断。

相关专题

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

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

392

2023.07.18

堆和栈区别
堆和栈区别

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

572

2023.08.10

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

809

2023.10.27

ubunt上安装和配置vnc
ubunt上安装和配置vnc

安装方法:安装VNC服务器、启动VNC服务器、设置VNC密码等等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

412

2023.12.28

ubuntu启动黑屏解决方法
ubuntu启动黑屏解决方法

ubuntu启动黑屏解决方法:检查是否是电源问题、检查内存是否接触不良、检查显卡问题等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

658

2023.12.28

为什么ubuntu有网络连接但不能上网
为什么ubuntu有网络连接但不能上网

ubuntu有网络连接但不能上网的原因:1、dns配置问题;2、代理服务器设置问题;3、网络防火墙设置问题;4、路由器或调制解调器设置问题;5、网络驱动程序问题;6、网络配置文件问题;7、其他问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

455

2024.09.05

ubuntu安装golang
ubuntu安装golang

本专题整合了ubuntu安装golang所有方法汇总,阅读下面的文章了解更多详细操作。

106

2025.12.13

centos
centos

PHP中文网为大家提供centos相关信息,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,是免费的、开源的、可以重新分发的开源操作系统,PHP中文网提供centos相关文章,以及安装教程。

431

2023.06.16

html编辑相关教程合集
html编辑相关教程合集

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

38

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

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

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