callgrind不会分析由解释器语言调用的C函数

时间:2018-05-18 14:42:08

标签: valgrind callgrind

我的主程序是由C编写的.C代码通过C API调用解释器语言,比如python。然后解释器语言回调其他C API。所有C代码都是可调试的,解释器语言的C接口也是可调试的。

我发现callgrind无法分析解释器语言调用的C代码。它的调用树在调用解释器语言的C代码处停止。

这是callgrind的任何已知限制吗? Oracle Solaris Studio适用于此案例。

1 个答案:

答案 0 :(得分:1)

callgrind逻辑以递增方式维护堆栈。这意味着它必须理解堆栈中所有内容的调用约定,检测它 电话和回报。

你可以使用gdb + vgdb与valgrind unwinder和gdb unwinder进行比较。

启动valgrind:valgrind --vgdb-error = 0 --vgdb = full ....

在解释器语言调用的C代码中放置一个断点, 并继续执行。

遇到断点时,比较以下2的结果 gdb命令:

  • 回溯
  • 监视v.info scheduler

以上将显示gdb和/或valgrind unwinders是否正常工作。

你可以尝试通过使用一些valgrind来理解callgrind的作用 调试选项,例如

valgrind --tool = callgrind -v -v -v -d -d -d --ct-verbose = 3

(根据您的喜好调整-v / -d / verbosity的nr。)

当然,如果你有一个旧版本的valgrind,你可能会 尝试使用最后一个版本甚至是git存储库,即使我怀疑 最近在这个领域发生了一些变化。