仪器关闭时调用缓慢

Posted

技术标签:

【中文标题】仪器关闭时调用缓慢【英文标题】:callgrind slow with instrumentation turned off 【发布时间】:2012-01-27 19:30:22 【问题描述】:

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

【问题讨论】:

什么是“尝试分析应用程序不同部分的某些配置”? user779,你能用"nul" tool of valgrind和Lackey tool of valgrind检查应用程序的速度吗? @jpalecek:我的意思是用户可以通过配置和启用某些功能来启用/禁用功能(它将递归地深入了解一组对象的更多详细信息,并导致更多的计算)它开始爬行。 @osgx:我刚试过,我发现 nulgrind 也一样慢 【参考方案1】:

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 倍(例如在os.inf.tu-dresden.de/papers_ps/vee08-pohle.pdf 中); vlagrind 上的任何其他工具都比 nulgrind 慢。关闭模式的 Callgrind 将以 nulgrind 的速度运行;开启 callgrind 会慢几倍。

以上是关于仪器关闭时调用缓慢的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在内存不足后关闭。仪器截图里面

自动化脚本结束后如何强制仪器不关闭应用程序?

在 C#/C++ 中托管 VST/DX 仪器? [关闭]

想知道如何在 Xcode 中仅显示地址的仪器时间分析器中知道符号

AVCaptureSession 废弃内存 - 分配 - 仪器

为啥在我使用导入的 .lib 运行项目时调用“用户断点”,而不是在代码内联时调用?