我正在使用callgrind来分析一个Linux多线程应用程序,而且大多数它工作得很好。我用仪器关闭( - instr-atstart = no )启动它,然后一旦设置完成,我用 callgrind_control -i on 打开它。但是,当我更改某些配置以尝试分析应用程序的不同部分时,它甚至在我开启仪器之前就开始运行得非常慢。基本上,部分代码需要几秒钟才能正常运行,需要花费一个多小时的时间来调用callgrind(关闭仪器)。关于为什么会这样以及如何调试/解决缓慢的任何想法?
答案 0 :(得分:10)
Callgrind是一个基于valgrind构建的工具。 Valgrind基本上是一个动态二进制翻译器(libVEX,valgrind的一部分)。它将解码每条指令并将它们编译成同一CPU的某些指令流。
据我所知,没有办法为已经运行的进程启用此转换(在valgrind实现中),因此从程序启动开始一直启用动态转换。它也不能关闭。
通过添加一些检测代码,在valgrind上构建工具。 “Nul”工具(nulgrind)是不添加任何仪器的工具。但是每个工具都使用valgrind并且动态转换始终处于活动状态。在callgrind中打开和关闭只是打开和关闭其他仪器。
由Valgrind实现的虚拟CPU是有限的,有(不完整的)限制列表http://valgrind.org/docs/manual/manual-core.html#manual-core.limits大多数限制都是关于浮点运算,并且它们可以被模拟错误。
更改是否与浮点运算相关联?或者列出其他限制?
另外你应该知道,“ Valgrind序列化执行,以便一次只运行一个线程”。 (来自同一页面的manual-core.html)