为函数添加perf %return探针失败,求解决方案
问题:C++函数添加perf返回探针失败的排查与解决
我尝试使用perf为一个函数的入口和返回位置各添加探针点,操作流程如下:
- 执行以下命令获取目标函数的 mangled 符号:
perf probe --funcs -x ./libVfeAecAndComms.so --no-demangle --filter='*'
得到符号_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m,对应实际函数AecElement::ProcessSubFrame()(返回值为void)。
- 添加入口探针成功:
perf probe -x ./libVfeAecAndComms.so --add psf_enter='_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m'
- 尝试添加返回探针时失败:
perf probe -x ./libVfeAecAndComms.so --add psf_ret='_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m%return'
报错信息:
Failed to find symbol _ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m in /opt/Bose/bin/VfeElementLibs/AecElement/libVfeAecAndComms.so Error: Failed to add events.
另外执行objdump --t ./libVfeAecAndComms.so仅能列出该符号名,不清楚为何添加%return后符号不被识别,寻求其他实现方法。
解决方法
1. 直接使用未 mangled 的函数名
perf 自带C++符号解析能力,无需手动输入 mangled 符号,直接用原函数名尝试添加返回探针:
perf probe -x ./libVfeAecAndComms.so --add psf_ret='AecElement::ProcessSubFrame%return'
如果解析失败,强制开启符号反汇编:
perf probe -x ./libVfeAecAndComms.so --demangle --add psf_ret='AecElement::ProcessSubFrame%return'
2. 手动指定返回指令的偏移地址
若%return语法无法识别,可通过反汇编找到函数返回指令的偏移:
- 反汇编目标函数:
objdump -d ./libVfeAecAndComms.so | grep -A 100 '_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m'
- 在输出末尾找到
ret指令,记录其相对于函数起始地址的偏移(如0x250)。 - 用偏移地址添加探针:
perf probe -x ./libVfeAecAndComms.so --add psf_ret='_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m+0x250'
3. 检查库的编译优化选项
如果函数被编译器优化(如内联、尾调用优化),会导致返回点无法被perf识别:
- 确认库编译时是否添加了
-fno-inline和-fno-omit-frame-pointer,这两个选项会保留函数的完整调用结构,便于探针挂载。 - 若有权限重新编译库,添加上述选项后再尝试添加返回探针。
4. 底层BPF替代方案
如果前面的方法都无效,可借助BPF的uretprobe接口编写简单程序实现返回点探测,但这种方式需要一定的BPF基础,适合需要长期监控的场景,临时调试优先尝试前三种方法。
内容的提问来源于stack exchange,提问作者Rich von Lehe
相关产品推荐
相关产品推荐

