0

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

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

这是 callgrind 的任何已知限制吗?Oracle Solaris Studio 在此案例中工作。

4

1 回答 1

1

callgrind 逻辑以增量方式维护堆栈。这意味着它必须了解堆栈上所有内容的调用约定,检测调用和返回。

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

使用以下命令启动 valgrind: valgrind --vgdb-error=0 --vgdb=full ....

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

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

  • 回溯
  • 监控 v.info 调度程序

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

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

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

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

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

于 2018-05-19T07:42:16.290 回答