MacOS下DTrace无法获取自定义程序符号,Cargo配置debug=true无效的问题排查求助
MacOS下DTrace无法获取自定义程序符号,Cargo配置debug=true无效的问题排查求助
我正在MacOS上尝试用DTrace做性能分析(最终要生成火焰图),但遇到了一个棘手的问题:DTrace输出的只有内存地址,完全拿不到我自己代码的符号,只有malloc这类标准库函数的符号能正常显示。
我已经做了这些尝试,但问题依然存在:
配置了Cargo的自定义profile
我在Cargo.toml里定义了专门的trace profile,确保开启调试信息且不剥离符号:[profile.trace] inherits = "release" debug = true strip = "none"编译时也明确提示
Finishedtraceprofile [optimized + debuginfo] target(s),说明Cargo应该生成了调试符号,但用dsymutil检查时,除了标准库函数外看不到我自己代码的符号。使用了指定的DTrace命令
我用这个脚本启动程序并采集数据:sudo dtrace -n 'profile-99 { @[ustack()] = count(); }' \ -c "$bin $args" \ -o trace.folded 2>/dev/null执行时DTrace原本会输出
dtrace: error on enabled probe ID 1 (ID 18829: profile:::profile-99): invalid user access in action #2的错误,但我已经把错误输出重定向到/dev/null了,查了资料说这个错误可能无关紧要,所以暂时忽略。尝试了附加进程的方式
参考了相关Stack Overflow线程,我也试过用dtrace -p <pid>的方式附加到已启动的进程,但问题还是一样,而且这种方式很不方便——我必须在程序开头加sleep,才能给DTrace足够的时间attach上去。
现在我很困惑:
- 明明编译时显示生成了调试信息,为什么
dsymutil看不到自己代码的符号? - 为什么
debug = true的配置好像没让DTrace识别到我的代码符号? - 到底是Cargo没正确生成符号,还是DTrace在MacOS上读取Rust程序符号有特殊要求?
有没有遇到过类似问题的朋友能给点建议?
内容来源于stack exchange
相关产品推荐
相关产品推荐

