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