关闭仪器功能后,使用Callgrind会变得缓慢。

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

“尝试配置某些配置文件以尝试对应用程序的不同部分进行分析”是什么意思? - jpalecek
user779,你能用valgrind的“nul”工具Lackey工具来检查应用程序的速度吗? - osgx
@jpalecek: 我的意思只是用户可以通过配置启用/禁用功能,并通过启用其中一些功能(它将递归地深入一组对象以获取更多细节,这会导致更多计算),从而开始爬行。 - naumcho
@osgx:我刚试了一下,发现nulgrind也很慢。 - naumcho
1个回答

11

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)


PS:nulgrind(libVEX基本工具)的开销非常大。据估计,与本机代码相比,nulgrind的速度要慢2-10倍(例如在http://os.inf.tu-dresden.de/papers_ps/vee08-pohle.pdf中);任何其他vlagrind工具都比nulgrind慢。关闭模式的Callgrind将以nulgrind的速度运行;打开Callgrind将运行几倍慢。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接