我的主程序是由 C 编写的。C 代码通过其 C API 调用解释器语言,比如 python。然后解释器语言回调其他 C API。所有的 C 代码都是可调试的,解释器语言的 C 接口也是可调试的。
我发现 callgrind 无法分析解释器语言调用的 C 代码。它的调用树在调用解释器语言的 C 代码处停止。
这是 callgrind 的任何已知限制吗?Oracle Solaris Studio 在此案例中工作。
callgrind 逻辑以增量方式维护堆栈。这意味着它必须了解堆栈上所有内容的调用约定,检测调用和返回。
您可以与使用 gdb+vgdb 的 valgrind unwinder 和 gdb unwinder 进行比较。
使用以下命令启动 valgrind: valgrind --vgdb-error=0 --vgdb=full ....
在解释器语言调用的C代码中设置断点,继续执行。
遇到断点时,比较以下 2 个 gdb 命令的结果:
以上将显示 gdb 和/或 valgrind 展开器是否正常工作。
您可以尝试通过使用一些 valgrind 调试选项来了解 callgrind 的作用,例如
valgrind --tool=callgrind -v -v -v -d -d -d --ct-verbose=3
(根据您的喜好调整 -v/-d/verbosity 的 nr)。
当然,如果你有旧版本的 valgrind,你可能会尝试使用最后一个版本,甚至是 git 存储库,即使我怀疑这方面最近发生了一些变化。