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

perf probe无法为目标函数KerrBL::chrostoffel设置探针的解决方法

解决方法

出现这个问题核心是两个原因:一是你给perf probe指定的目标文件错误,二是编译生成的带调试信息的二进制在安装阶段被strip裁剪了符号。

  • 首先纠正目标文件:KerrBL::chrostoffel属于核心功能实现,不在gyoto主可执行文件中,是编译到libgyoto动态链接库内的,你给-x参数传主程序路径自然找不到对应函数。
  • 其次确认符号完整性:大部分开源软件执行make install时默认会strip二进制,把编译时带的-g调试信息全部裁掉,哪怕你编译阶段开了调试选项也没用。

操作步骤

  1. 定位函数实际所在的动态库
    执行以下命令查询gyoto主程序依赖的libgyoto库路径:
    ldd /usr/local/bin/gyoto | grep gyoto
    
    输出结果中箭头后面的so文件路径,才是真正包含目标函数的二进制文件。
  2. 验证库文件是否保留调试符号
    对上一步查到的so文件执行file命令:
    file /替换为上一步查到的so实际路径
    
    如果输出内容包含stripped字样,说明文件已被裁剪,需要重新编译安装:
    • 编译时确保编译选项带-g,建议同时加-fno-inline -O0关闭内联和过高优化,避免函数被优化内联后找不到符号
    • 安装时跳过strip步骤:如果是autotools构建的项目,安装时执行make install INSTALL="install -p"禁止自动裁剪,或者直接使用编译构建目录中生成的、未经过install步骤的原始so文件,不要使用安装到系统路径后被裁剪的版本
  3. 添加探针
    找到未被strip的libgyoto.so路径后,先验证目标函数存在:
    sudo perf probe -x /未裁剪的so文件路径 -F | grep KerrBL::chrostoffel
    
    能查到对应函数的话,直接执行添加探针命令即可:
    sudo perf probe -x /未裁剪的so文件路径 KerrBL::chrostoffel
    
    如果仍然查不到,是C++名称修饰导致的,用nm命令查询真实符号名:
    # 查反修饰后的可读名称
    nm -C /未裁剪的so文件路径 | grep chrostoffel
    # 查二进制中实际存储的修饰后符号名
    nm /未裁剪的so文件路径 | grep chrostoffel
    
    用查询到的修饰后符号名替换上述命令中的函数名即可。

注意:perf相关操作需要root权限,普通用户执行可能出现符号读取失败、权限不足的问题,所有perf命令建议加sudo执行。

内容的提问来源于stack exchange,提问作者dearn44

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:00:59