V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ZxxWww
V2EX  ›  程序员

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

  •  
  •   ZxxWww · 102 天前 · 1567 次点击
    这是一个创建于 102 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    15 条回复    2024-08-14 18:16:00 +08:00
    InkStone
        1
    InkStone  
       102 天前
    valgrind
    sryanyuan
        2
    sryanyuan  
       102 天前
    gperftools 的 heap profiler ,可以根据分配的总内存大小来不断生成内存分配描述文件,然后 diff 一下就能知道内存分配在哪里了
    ZxxWww
        3
    ZxxWww  
    OP
       102 天前
    coderluan
        4
    coderluan  
       102 天前
    啥也不用装,编译的时候加上-fsanitize=address 就行了。
    jworg
        5
    jworg  
       102 天前
    要不搜一下 heaptrack 带图形界面
    shylockhg
        6
    shylockhg  
       102 天前
    在 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  
       102 天前
    @shylockhg 只贴 AI 生成内容的账号会被站长直接永封。
    shylockhg
        8
    shylockhg  
       102 天前
    @msg7086 这么吓人,可惜不能删除
    zanderwang1
        9
    zanderwang1  
       102 天前
    vtune
    terryching
        10
    terryching  
       102 天前
    感觉 ASAN 是最适合的
    kwest
        11
    kwest  
       102 天前
    valgrind 就够用了
    LwZiye
        12
    LwZiye  
       101 天前
    @jworg heaptrack 使用起来还不错
    desstiony
        13
    desstiony  
       101 天前
    ros?
    nevermoreluo
        14
    nevermoreluo  
       101 天前
    valgrind 瑞士军刀,就是要折腾
    intel vtune 无脑好用,能定位到性能损耗最大的部分,但是具体内存占用的这部分是否真的泄露了,要你自己判断
    owt5008137
        15
    owt5008137  
       101 天前 via Android
    补充一个。jemalloc
    开 perf 之后直接 jeperf 输出
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:16 · PVG 08:16 · LAX 16:16 · JFK 19:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.