perf生成火焰图如何查看__lll_lock_wait_private与_xstat的调用方?
这两个函数属于glibc内部实现,断栈看不到调用者的核心原因是默认发行版的glibc默认开启了帧指针省略优化,perf默认的dwarf栈展开参数不足以正确解析跨glibc的调用链,可通过以下方案修复:
解决方案
1. 调整perf采样配置
默认perf的dwarf调用栈展开仅读取8KB栈数据,不足以解析glibc内部复杂调用栈,将采样命令的dwarf参数调整为64KB栈大小即可解决大多数断栈问题,修改后的命令如下:
perf record -F 99 -p $TPID --call-graph dwarf,65536 sleep 8
如果调整栈大小后仍有断栈问题,可换用帧指针(fp)模式采集:
- 编译业务程序时添加
-fno-omit-frame-pointer参数保留帧指针 - 安装对应发行版的glibc调试包:Debian/Ubuntu系安装
libc6-dbg,CentOS/RHEL系安装glibc-debuginfo - 将采样命令的调用栈参数改为
--call-graph fp即可
2. 调整调用链导出配置
执行perf script时添加--show-callchain参数,强制输出完整调用链避免默认截断:
perf script --show-callchain -i perf.data > perf.unfold
3. 调整火焰图生成脚本配置
运行栈折叠脚本时添加--all参数,避免脚本默认过滤glibc内部函数的调用栈信息:
./stackcollapse-perf.pl --all perf.unfold > perf.fold
4. 极端场景处理
如果以上方案均无效,说明当前环境的glibc开启了LTO全链路优化,完全丢失了栈展开所需的调试信息,可临时切换到未开启强LTO优化的glibc版本复现采样即可。
内容的提问来源于stack exchange,提问作者calvin
相关产品推荐
相关产品推荐

