perf采用fp调用图生成火焰图失败,提示无栈计数求解
解决perf生成火焰图时"ERROR: No stack counts found"的问题
针对你在x86 CentOS系统上使用GCC 10编译的RelWithDebInfo版本Google Benchmark,用--call-graph fp采集perf数据后无法生成火焰图的问题,以下是几种可行的排查和解决方法:
1. 过滤无效栈帧并强制解析
--call-graph fp生成的栈帧可能包含无法被stackcollapse-perf.pl识别的内容(比如[unknown]函数、寄存器标记),可以先过滤无效行,或强制解析所有栈帧:
- 过滤未知函数:
perf script | grep -v "\[unknown\]" | ~/FlameGraph/stackcollapse-perf.pl | ~/FlameGraph/flamegraph.pl > flamegraph.svg - 使用
--all参数强制解析:perf script | ~/FlameGraph/stackcollapse-perf.pl --all | ~/FlameGraph/flamegraph.pl > flamegraph.svg
2. 编译时强制保留帧指针
RelWithDebInfo模式下GCC 10可能默认开启了-fomit-frame-pointer,导致--call-graph fp的栈回溯不完整,符号信息缺失。重新编译时添加帧指针保留选项:
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer" ..
编译完成后重新运行基准测试并采集perf数据。
3. 增加perf采样量
如果采样次数过少,stackcollapse-perf.pl可能无法统计到有效栈计数。提高采样频率或延长采样时长:
perf record -F 99 -g fp ./your_benchmark_binary
-F 99表示每秒采样99次(避免超过系统默认的采样上限),-g fp指定帧指针调用图,采集完成后再执行火焰图生成命令。
4. 适配stackcollapse-perf.pl的解析规则
旧版本的stackcollapse-perf.pl可能无法匹配当前perf的输出格式。打开脚本查看解析栈帧的正则表达式,调整规则以适配你的perf script输出(比如匹配函数名、地址的格式)。
内容的提问来源于stack exchange,提问作者thebugger
相关产品推荐
相关产品推荐

