使用perf对在线服务器用户态程序离线分析时符号缺失的解决方法
Perf离线分析解决libc及内核符号缺失问题
问题根源
符号缺失通常来自两个核心原因:
- 服务器端未安装对应库/内核的调试信息包,导致
perf-archive无法打包完整符号 - 本地解析时未正确指定符号路径,或本地与服务器的perf版本、库版本差异过大
服务器端预处理(关键步骤)
- 安装调试信息包
- Debian/Ubuntu系:
# 安装libc调试包 apt-get install libc6-dbg # 安装内核调试包(替换为当前内核版本) apt-get install linux-image-$(uname -r)-dbg - RHEL/CentOS系:
# 启用debuginfo仓库后安装 yum install glibc-debuginfo glibc-debuginfo-common yum install kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -m)-$(uname -r)
- Debian/Ubuntu系:
- 验证采集数据的完整性
在服务器上先执行perf report -i perf.data,确认所有符号(包括libc、内核函数)能正常显示,排除采集阶段的问题。 - 重新生成符号归档
确保perf-archive能抓取所有必要文件:
执行后会生成perf-archive -i perf.dataperf-archive.tar.gz,可通过tar tvf perf-archive.tar.gz检查是否包含libc.so.6的调试文件、vmlinux等关键符号文件。
本地解析流程
- 传输文件到本地
将服务器上的perf.data和perf-archive.tar.gz一同拷贝到本地目录。 - 解压符号归档
tar xf perf-archive.tar.gz - 指定符号路径解析
执行perf report时通过--symfs参数指向解压后的符号目录:perf report -i perf.data --symfs ./
额外排查与优化
- 匹配perf版本:本地perf版本尽量与服务器一致,避免跨版本解析兼容性问题。可通过
perf --version查看版本,若差异过大,建议在本地搭建与服务器同版本的容器/虚拟机进行分析。 - 手动指定内核符号:若内核符号仍缺失,可手动将服务器上的
vmlinux文件(通常在/usr/lib/debug/boot/)拷贝到本地,解析时添加--kallsyms=./vmlinux参数。 - 检查符号文件权限:确保本地解压后的符号文件有可读权限,避免perf无法读取。
内容的提问来源于stack exchange,提问作者Y.Z
相关产品推荐
相关产品推荐

