perf probe无法为目标函数KerrBL::chrostoffel设置探针的解决方法
解决方法
出现这个问题核心是两个原因:一是你给perf probe指定的目标文件错误,二是编译生成的带调试信息的二进制在安装阶段被strip裁剪了符号。
- 首先纠正目标文件:
KerrBL::chrostoffel属于核心功能实现,不在gyoto主可执行文件中,是编译到libgyoto动态链接库内的,你给-x参数传主程序路径自然找不到对应函数。 - 其次确认符号完整性:大部分开源软件执行
make install时默认会strip二进制,把编译时带的-g调试信息全部裁掉,哪怕你编译阶段开了调试选项也没用。
操作步骤
- 定位函数实际所在的动态库
执行以下命令查询gyoto主程序依赖的libgyoto库路径:
输出结果中箭头后面的so文件路径,才是真正包含目标函数的二进制文件。ldd /usr/local/bin/gyoto | grep gyoto - 验证库文件是否保留调试符号
对上一步查到的so文件执行file命令:
如果输出内容包含file /替换为上一步查到的so实际路径stripped字样,说明文件已被裁剪,需要重新编译安装:- 编译时确保编译选项带
-g,建议同时加-fno-inline -O0关闭内联和过高优化,避免函数被优化内联后找不到符号 - 安装时跳过strip步骤:如果是autotools构建的项目,安装时执行
make install INSTALL="install -p"禁止自动裁剪,或者直接使用编译构建目录中生成的、未经过install步骤的原始so文件,不要使用安装到系统路径后被裁剪的版本
- 编译时确保编译选项带
- 添加探针
找到未被strip的libgyoto.so路径后,先验证目标函数存在:
能查到对应函数的话,直接执行添加探针命令即可:sudo perf probe -x /未裁剪的so文件路径 -F | grep KerrBL::chrostoffel
如果仍然查不到,是C++名称修饰导致的,用nm命令查询真实符号名:sudo perf probe -x /未裁剪的so文件路径 KerrBL::chrostoffel
用查询到的修饰后符号名替换上述命令中的函数名即可。# 查反修饰后的可读名称 nm -C /未裁剪的so文件路径 | grep chrostoffel # 查二进制中实际存储的修饰后符号名 nm /未裁剪的so文件路径 | grep chrostoffel
注意:perf相关操作需要root权限,普通用户执行可能出现符号读取失败、权限不足的问题,所有perf命令建议加sudo执行。
内容的提问来源于stack exchange,提问作者dearn44
相关产品推荐
相关产品推荐

