在执行过程中将callgrind / valgrind附加到程序中

问题描述 投票:0回答:3

我从一开始就使用Valgrind通过运行程序来检测问题。现在,我在程序的特定时刻遇到了内存/性能问题。不幸的是,从一开始就没有可行的方法可以为这个地方创建捷径。

是否有一种方法可以在执行过程中对c ++程序(Valgrind / Callgrind)进行检测,就像附加到进程一样?

已经在这里回答:How use callgrind to profiling only a certain period of program execution?

c++ valgrind callgrind
3个回答
2
投票

无法在已经运行的程序上使用valgrind。

但是对于callgrind,您可以通过稍后在执行期间仅记录数据来稍微加快速度。

为此,您可能会查看callgrind选项

    --instr-atstart=no|yes    Do instrumentation at callgrind start [yes]
    --collect-atstart=no|yes  Collect at process/thread start [yes]
    --toggle-collect=<func>   Toggle collection on enter/leave function

您还可以从程序中控制这些方面。

有关更多详细信息,请参阅valgrind / callgrind用户手册。


2
投票

Callgrind有两件事会减慢执行速度。

  • 计数操作(收集部分)
  • 模拟缓存和分支预测变量(检测部分)。这取决于--cache-sim--branch-sim选项,它们都默认为“ no”。如果您使用这些选项并禁用了检测功能,那么我预计会对建模的准确性产生一定的影响,因为在切换缓存和预测变量时它们不会“变暖”。

还有其他几种方法可以使用。

  1. 使用客户端请求机制。这将要求您包括Valgrind标头,并添加几行使用Valgrind宏CALLGRIND_START_INSTRUMENTATION / CALLGRIND_STOP_INSTRUMENTATIONCALLGRIND_TOGGLE_COLLECT来启动和停止检测/收集。详细信息See the manual。然后只需使用--instr-atstart=no --collect-atstart=no

  2. 在Valgrind下运行您的应用程序
  3. 使用gdb monitor commands。在这种情况下,您将有两个终端。首先,您将使用--instr-atstart=no --collect-atstart=no --vgdb=yes运行Valgrind。在第二个终端中,运行gdb yourapplication,然后从gdb提示符(gdb) target remote | vgdb中运行。然后,您可以按照手册中的描述使用监视命令,包括收集和检测控件。

  4. callgrind_control,Valgrind分布的一部分。老实说,我从未使用过。

我最近使用第一种没有缓存/分支模拟的技术进行了性能分析。当我在整个运行过程中使用Callgrind时,与在Callgrind之外运行相比,运行时间增加了23倍。当我仅分析要分析的一个函数时,速度下降了大约5倍。显然,这将在很大程度上视情况而定。


0
投票

谢谢大家的帮助。似乎已经在这里回答:How use callgrind to profiling only a certain period of program execution?但由于某些原因未标记为已回答。

摘要:在关闭工具的情况下启动callgrind

valgrind --tool=callgrind --instr-atstart=no <PROG>

控制工具(可以在其他shell中执行)

callgrind_control -i on/off
© www.soinside.com 2019 - 2024. All rights reserved.