英文

https://github.com/teawater/cma

什么是CMA?
分析和记录C/C++程序动态内存状态的GDB Python脚本。
CMA 对C/C++程序的性能影响比较小。
CMA 支持 X86_32, X86_64 和 ARM。

如何使用CMA?
  1. CMA只能和GDB 7.5或者更新版本。你可以用Get-GDB检查当前系统的GDB版本并根据需要GDB 7.5或者更新版本。
    wget https://raw.githubusercontent.com/teawater/get-gdb/master/get-gdb.py
    python get-gdb.py
  2. 取得CMA。
    wget https://raw.githubusercontent.com/teawater/cma/master/cma.py
  3. 分析的C/C++程序编译的时候要使用GCC的“-g”选项,这样可以取得内存分配和释放时的行信息。
    gcc -g xxx
    g++ -g xxx
  4. GDB控制要分析的C/C++程序。 这里有一些方法:
    • 和GDB一起打开应用程序。不需要执行程序因为CMA脚本将自动根据需要执行程序。
      gdb xxx
    • Attach一个运行中的程序。
      gdb -p pid
      或者
      gdb
      attach pid
  5. 在GDB中启动CMA脚本。
    其将让你输入一些选项,然后执行程序并分析其内存的分配和释放。
    source cma.py
  6. CMA脚本和程序执行的时候,可以用CTRL-C打断他们的执行。然后可以让CMA脚本将记录保存在一个CSV文件中。
    CSV文件可以被Openoffice或者Excel打开。
    [0] 记录内存信息到“/home/teawater/tmp/cma.csv”。
    [1] 继续。
    [2] 退出。
    哪个操作?[0]
    内存信息存入“/home/teawater/tmp/cma.csv”。
    Continuing.
CMA脚本生成的CSV文件
在没被释放掉的动态内存和释放掉的动态内存之间有一个空行。

列:
  • 类型
    动态内存的类型是new或者malloc。CMA脚本可以同时记录他们。
  • 地址
    动态内存的地址。
  • 长度
    动态内存的长度。
  • 存在时间(秒)
    动态内存的存在秒数。
    如果这个动态内存已经被释放掉了,其是动态内存从分配到释放的时间。
    如果这个动态内存没被释放掉,其是动态内存从分配到当前的时间。
  • 分配行
    分配动态内存的代码行信息。
  • 释放行
    释放动态内存的代码行信息。
    如果这个动态内存没有被释放掉,则这个列是空的。
  • 分配backtrace
    分配动态内存的分配行的backtrace信息。
  • 释放backtrace
    分配动态内存的释放行的backtrace信息。
    如果这个动态内存没有被释放掉,则这个列是空的。

截图
这是一个CSV文件的截图。

我的主页