perf报告出现未知符号,寻求QEMU/KVM性能分析完整报告解决方案
解决QEMU perf剖析中的未知符号问题
一、排查内核符号缺失
你看到的[unknown] [k]标记属于内核空间符号缺失,可按以下步骤处理:
- 安装内核调试符号包(Debian/Ubuntu):
sudo apt install linux-image-$(uname -r)-dbg - 确认内核编译选项:检查
/boot/config-$(uname -r),确保CONFIG_KALLSYMS=y和CONFIG_KALLSYMS_ALL=y已开启;如果是自定义内核,需重新编译开启这两个选项。 - 记录perf数据时添加
--kcore参数,让perf读取内核核心文件以获取完整符号:perf record -g --quiet -p $qemu_pid --kcore -o perf.out -F 99 -- sleep 10 &
二、定位未知地址所属模块
对于0x6a00000002这类用户空间未知地址,可通过以下方式定位:
- 查看QEMU进程的内存映射,搜索目标地址对应的文件:
cat /proc/$qemu_pid/maps | grep 0x6a00000002 - 用perf原始数据解析地址映射:
perf report -D -i perf.out | grep -A5 -B5 0x6a00000002 - 用
addr2line解析地址(需先从/proc/$qemu_pid/maps中提取库的加载基址):addr2line -e /path/to/target/library $(printf "0x%x" $((0x6a00000002 - 0xBASE_ADDR)))
三、安装系统依赖库的调试符号
QEMU依赖的系统库(如libc、libglib2.0)如果缺少调试符号,也会导致未知符号,Debian/Ubuntu下可安装对应调试包:
- libc调试符号:
sudo apt install libc6-dbg - libglib2.0调试符号:
sudo apt install libglib2.0-0-dbg - 其他依赖库:先用
ldd /path/to/your/build/qemu-system-x86_64列出所有依赖,再安装对应-dbg包。
四、优化perf记录与解析
- 使用dwarf调用图提升符号解析精度,替换
-g参数:perf record --call-graph dwarf --quiet -p $qemu_pid -o perf.out -F 99 -- sleep 10 & - 解析报告时指定你编译的带调试符号的QEMU路径,避免使用系统默认版本:
perf report -i perf.out --executable=/path/to/your/build/qemu-system-x86_64 - 清理perf缓存,避免旧符号干扰:
perf buildid-cache -r
五、QEMU自身验证
- 确认运行的是你编译的QEMU:用
ps aux | grep qemu检查进程路径,确保是build目录下的二进制,而非系统默认的/usr/bin/qemu-system-x86_64。 - 验证QEMU模块调试符号:编译QEMU时默认开启模块支持,确保
build/modules目录下的模块也带有调试符号,若编译时加了--disable-modules需移除该选项重新编译。
内容的提问来源于stack exchange,提问作者Trilok Bhattacharya
相关产品推荐
相关产品推荐

