https://github.com/teawater/cma
|
|
什么是CMA?
|
分析和记录C/C++程序动态内存状态的GDB Python脚本。 CMA 对C/C++程序的性能影响比较小。
CMA 支持 X86_32, X86_64 和 ARM。
|
|
如何使用CMA?
|
- 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
|
- 取得CMA。
wget https://raw.githubusercontent.com/teawater/cma/master/cma.py
|
-
分析的C/C++程序编译的时候要使用GCC的“-g”选项,这样可以取得内存分配和释放时的行信息。
-
GDB控制要分析的C/C++程序。
这里有一些方法:
- 和GDB一起打开应用程序。不需要执行程序因为CMA脚本将自动根据需要执行程序。
-
Attach一个运行中的程序。
或者
-
在GDB中启动CMA脚本。
其将让你输入一些选项,然后执行程序并分析其内存的分配和释放。
-
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文件的截图。
|