我正在使用callgrind来分析Linux多线程应用程序,效果很好。我使用无仪器模式启动它(--instr-atstart=no),然后一旦设置完成,就使用callgrind_control -i on打开它。但是,当我更改某些配置以尝试分析应用程序的不同部分时,即使在打开仪器之前,它也开始运行得非常慢。基本上,正常操作只需要几秒钟的代码部分,在使用callgrind(关闭仪器)后需要一个小时以上。有什么想法可以解决这个问题,并如何进行调试/解决速度缓慢的问题?
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)