9

我正在使用 callgrind 来分析一个 linux 多线程应用程序,并且大多数情况下它工作得很好。我从仪器关闭(--instr-atstart=no)开始它,然后一旦设置完成,我用callgrind_control -i on打开它。但是,当我更改某些配置以尝试分析应用程序的不同部分时,它甚至在我打开检测之前就开始运行非常缓慢。基本上,正常操作需要几秒钟的部分代码在 callgrind (仪器关闭)下需要一个多小时。关于为什么会这样以及如何调试/解决缓慢的任何想法?

4

1 回答 1

10

Callgrind 是一个基于 valgrind 的工具。Valgrind 基本上是一个动态二进制翻译器(libVEX,valgrind 的一部分)。它将解码每条指令并将它们 JIT 编译成同一 CPU 的一些指令流。

据我所知,没有办法为已经运行的进程启用这种翻译(在 valgrind 实现中),所以从程序开始就一直启用动态翻译。也关不掉。

通过添加一些检测代码,工具是在 valgrind 上构建的。“Nul”工具 (nulgrind) 是不添加任何工具的工具。但是每个工具都使用 valgrind 并且动态翻译始终处于活动状态。在 callgrind 中打开和关闭只是打开和关闭额外的仪器。

Valgrind 实现的虚拟 CPU 是有限的,有(不完整的)限制列表http://valgrind.org/docs/manual/manual-core.html#manual-core.limits大多数限制是关于浮点运算的,并且他们可以被错误地模仿。

更改是否与浮点运算有关?还是有其他列出的限制?

您还应该知道,“ Valgrind 将执行序列化,以便一次只运行一个线程”。(来自同一页面manual-core.html)

于 2012-02-09T19:38:46.513 回答