【问题标题】:attaching callgrind/valgrind to program in mid-way of its execution在执行过程中将 callgrind/valgrind 附加到程序
【发布时间】:2020-05-11 13:30:35
【问题描述】:

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

有没有办法在 c++ 程序 ( Valgrind/Callgrind ) 中途执行时检测它,比如附加到进程?

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

【问题讨论】:

  • 即使有可能,通常也很难使用内存调试器,除非它们在问题点有完整的上下文。在运行程序的过程中要求报告会导致很多误报和漏报。复制您遇到的问题有多复杂?正常需要多长时间?即使这是一个漫长而复杂的设置,希望您只需执行两次(一次获取信息,一次验证修复)。花一两天时间来查找、修复和验证问题可能是值得的。
  • 你的意思是一个完全检测的版本需要太多时间才能到达中间?
  • @CrouchingKitten 完全是 :( 检测版本超级慢 + 我对可能在该位置之前弹出的其他缺陷不感兴趣:[
  • 是由多个模块组成的吗?我不确定这是否会加快速度,但您可以尝试仅在您感兴趣的模块上使用-g 编译器参数。

标签: c++ valgrind callgrind


【解决方案1】:

没有办法在已经运行的程序上使用 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 选项,它们都默认为“否”。如果您使用这些选项并禁用检测,那么我预计会对建模的准确性产生一些影响,因为缓存和预测器在切换时不会“温暖”。

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

    1. 使用客户端请求机制。这将要求您包含 Valgrind 标头并添加几行使用 Valgrind 宏 CALLGRIND_START_INSTRUMENTATION/CALLGRIND_STOP_INSTRUMENTATIONCALLGRIND_TOGGLE_COLLECT 来启动和停止检测/收集。 See the manual 了解详情。然后只需使用--instr-atstart=no --collect-atstart=no在 Valgrind 下运行您的应用程序

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

    3. callgrind_control,Valgrind 发行版的一部分。老实说我从来没有用过这个。

    我最近使用第一种没有缓存/分支模拟的技术进行了一些分析。当我在整个运行过程中使用 Callgrind 时,我发现与在 Callgrind 之外运行相比,运行时间增加了 23 倍。当我只分析我想分析的一个函数时,这下降到大约 5 倍的速度。显然,这将非常重要。

    【讨论】:

      【解决方案3】:

      感谢大家的帮助。 似乎已经在这里回答了: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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多