为Ruby添加带参数的perf探针失败,报错无此文件或目录
Ruby perf探针获取ci->mid失败的排查方案
问题回顾
- 无参数探针可正常创建:
perf probe -x $(command -v ruby) --add 'vm_search_method.isra.0' - 尝试获取
rb_call_info结构体的mid字段时失败:perf --debug verbose=10 probe -x $(command -v ruby) --add 'vm_search_method.isra.0 ci->mid:u64' - 报错信息:
An error occurred in debuginfo analysis (-2). Error: Failed to add events. Reason: No such file or directory (Code: -2)
排查步骤
1. 确认Ruby是否带有完整调试信息
perf探针依赖目标程序的调试符号(debuginfo)解析结构体成员,多数发行版默认Ruby包不带完整调试信息:
- Debian/Ubuntu系:安装
ruby-dbg或ruby-debuginfo包 - RHEL/CentOS系:安装
ruby-debuginfo包 - 源码编译Ruby时,需添加
--enable-debug参数生成调试符号
2. 验证ci变量的可见性
用perf probe --vars确认函数内是否能访问到ci变量:
perf probe -x $(command -v ruby) --vars 'vm_search_method.isra.0'
如果输出中没有ci,说明编译器优化(isra.0是内联优化后的函数版本)或调试符号缺失导致变量被隐藏。
3. 核对结构体成员路径正确性
通过GDB确认rb_call_info的结构定义:
gdb $(command -v ruby) (gdb) ptype struct rb_call_info
检查mid是否为直接成员,以及ci的类型是否为struct rb_call_info*,路径错误会直接导致解析失败。
4. 检查perf与内核版本兼容性
旧版本perf对复杂结构体成员的解析支持有限,建议升级perf到最新稳定版,同时确保内核版本≥4.10(该版本对探针语法支持更完善)。
5. 确认tracefs挂载与权限
虽然/sys/kernel/tracing/README存在,仍需检查tracefs挂载状态:
mount | grep tracefs
未挂载时执行:
mount -t tracefs nodev /sys/kernel/tracing
同时用sudo执行perf命令,排除权限不足的可能性。
内容的提问来源于stack exchange,提问作者jvans
相关产品推荐
相关产品推荐

