求推荐一个工具 能在 Ubuntu 上分析 C++程序内存使用情况 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ZxxWww
V2EX    程序员

求推荐一个工具 能在 Ubuntu 上分析 C++程序内存使用情况

  •  
  •   ZxxWww 2024-08-13 15:58:51 +08:00 2392 次点击
    这是一个创建于 473 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一个机器人项目,用了开源的代码实现部分功能。但是测试发现随着程序运行时间变长,占用的内存也会越来越大

    请教一下各位佬,有没有什么工具能比较直观地看到是哪一个变量或者那一部分程序导致的问题?

    15 条回复    2024-08-14 18:16:00 +08:00
    InkStone
        1
    InkStone  
       2024-08-13 16:05:15 +08:00
    valgrind
    sryanyuan
        2
    sryanyuan  
       2024-08-13 16:05:18 +08:00
    gperftools 的 heap profiler ,可以根据分配的总内存大小来不断生成内存分配描述文件,然后 diff 一下就能知道内存分配在哪里了
    ZxxWww
        3
    ZxxWww  
    OP
       2024-08-13 16:09:27 +08:00
    coderluan
        4
    coderluan  
       2024-08-13 16:10:12 +08:00
    啥也不用装,编译的时候加上-fsanitize=address 就行了。
    jworg
        5
    jworg  
       2024-08-13 16:21:10 +08:00
    要不搜一下 heaptrack 带图形界面
    shylockhg
        6
    shylockhg  
       2024-08-13 17:05:36 +08:00
    在 Ubuntu 上分析 C++ 程序的内存使用情况,有几种工具可以推荐:

    1. **Valgrind**:
    - Valgrind 是一个著名的内存调试和分析工具,其中的 Massif 工具可以用来分析程序的内存使用情况。它可以帮助你识别内存泄漏和内存使用模式。

    2. **gperftools**:
    - gperftools (之前称为 Google Performance Tools )提供了一个堆分析器和 CPU 分析器。它的 `heap-profiler` 功能可以生成程序的内存分配情况的详细报告。

    3. **Memcheck (Valgrind 的一部分)**:
    - Memcheck 是 Valgrind 中的一个工具,专门用于检测内存泄漏、内存越界等问题。

    4. **Massif (Valgrind 的一部分)**:
    - Massif 是 Valgrind 工具集中的一个堆分析工具,它可以生成堆使用的图表,帮助你理解内存使用情况。

    5. **GCC/g++ 的 `-ftime-report` 选项**:
    - 编译时加上 `-ftime-report` 选项,GCC 会在编译结束后输出程序的时间消耗报告,其中包含了一些内存使用信息。

    6. **Clang 的 `-fsanitize=memory` 选项**:
    - 使用 Clang 编译器的内存 sanitizer 可以帮助检测内存泄漏和越界问题。

    7. **KCachegrind**:
    - KCachegrind 是一个图形化的分析器,可以读取 Callgrind 工具生的文件,它提供了一个直观的界面来查看程序的性能数据。

    8. **Callgrind (Valgrind 的一部分)**:
    - Callgrind 是 Valgrind 工具集中的一个分析工具,它可以生成程序调用的详细报告,包括函数级别的内存分配情况。

    9. **Brendan Gregg's "Memory Profiler"**:
    - 这是一个简单的工具,可以监控程序的内存使用情况,并且生成火焰图。

    10. **perf**:
    - `perf` 是 Linux 内核提供的性能分析工具,它也可以用来分析内存访问模式。

    使用这些工具时,您可能需要对程序进行编译,以便包含额外的调试信息,例如使用 `-g` 选项。然后,运行相应的分析工具,并根据生成的报告来识别内存使用问题。

    例如,使用 Valgrind 的基本命令如下:

    ```shell
    valgrind --tool=massif ./your_program
    ```

    这将启动 Massif 并分析 `your_program` 的内存使用情况。分析完成后,Valgrind 会显示内存使用图表和数据。
    msg7086
        7
    msg7086  
       2024-08-13 17:27:42 +08:00
    @shylockhg 只贴 AI 生成内容的账号会被站长直接永封。
    shylockhg
        8
    shylockhg  
       2024-08-13 17:29:05 +08:00
    @msg7086 这么吓人,可惜不能删除
    zanderwang1
        9
    zanderwang1  
       2024-08-13 20:25:01 +08:00
    vtune
    terryching
        10
    terryching  
       2024-08-13 22:21:08 +08:00
    感觉 ASAN 是最适合的
    kwest
        11
    kwest  
       2024-08-13 22:24:34 +08:00
    valgrind 就够用了
    LwZiye
        12
    LwZiye  
       2024-08-14 09:13:48 +08:00
    @jworg heaptrack 使用起来还不错
    desstiony
        13
    desstiony  
       2024-08-14 09:17:46 +08:00
    ros?
    nevermoreluo
        14
    nevermoreluo  
       2024-08-14 09:30:09 +08:00
    valgrind 瑞士军刀,就是要折腾
    intel vtune 无脑好用,能定位到性能损耗最大的部分,但是具体内存占用的这部分是否真的泄露了,要你自己判断
    owt5008137
        15
    owt5008137  
       2024-08-14 18:16:00 +08:00 via Android
    补充一个。jemalloc
    开 perf 之后直接 jeperf 输出
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2648 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 14:49 PVG 22:49 LAX 06:49 JFK 09:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86