You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为函数添加perf %return探针失败,求解决方案

问题:C++函数添加perf返回探针失败的排查与解决

我尝试使用perf为一个函数的入口和返回位置各添加探针点,操作流程如下:

  1. 执行以下命令获取目标函数的 mangled 符号:
perf probe --funcs -x ./libVfeAecAndComms.so --no-demangle --filter='*'

得到符号_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m,对应实际函数AecElement::ProcessSubFrame()(返回值为void)。

  1. 添加入口探针成功:
perf probe -x ./libVfeAecAndComms.so --add psf_enter='_ZN10AecElement15ProcessSubFrameERK15VoiceAudioFrameIfERS1_m'
  1. 尝试添加返回探针时失败:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:27:02