Dec 20, 2013 – 学习 & 提升 – 程序设计  C语言  工具   – Bai

程序设计中内存泄露检测方法

内存泄露为计算机的专业用词,指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄漏会因为减少可用内存的数量从而降低计算机的性能,最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

因此,在程序设计过程中一定要注意内存的管理,尽量从源头上减少内存泄露的发生,而且也要及时利用相关方法和工具对内存使用进行检测,以改善程序的性能。

mtrace

mtrace 简介

mtrace是 GNU C 程序库中的内存调试函数,用于检测由mallocreallocfree管理分配的内存使用情况。在头文件<mcheck.h>中声明及定义,函数原型为:

void mtrace(void);
void muntrace(void);

其中mtrace函数为内存检测的起点,通常放在程序的起始处,而muntrace为终止内存检测,如果检测到程序末尾时可以省略。

mtrace 使用实例

设要检测的源程序为 test.c

1 #include <stdio.h>
2 #include <stblib.h>
3 int main(int argc, const char *argv[])
4 {
5     int *a = (int *)malloc(10);
6     return 0;
7 }

显然这个程序在结束前没有释放指针 a 指向的内存。首先需要在源文件中包含头文件<mcheck.h>,然后调用内存检测函数mtracemuntrace,此时源程序修改为:

 1 #include <stdio.h>
 2 #include <stblib.h>
 3 #include <mcheck.h>
 4 int main(int argc, const char *argv[])
 5 {
 6     mtrace(); //检测起点
 7     int *a = (int *)malloc(10);
 8     muntrace(); //检测终点,检测到程序末尾时可以省略不写这个
 9     return 0;
10 }

要正确使用mtrace需首先定义环境变量MALLOC_TRACE以设置日志(记录)文件:

$ export MALLOC_TRACE=test.log

然后在调试模式下编译 test.c

$ gcc test.c -o test -g

执行程序,内存检测函数会将检测结果写入日志文件:

$ ./test

但是,检测结果是计算机可阅读的格式,需要将其转换。只要安装mtrace,就会有一名为mtrace的 Perl 脚本程序存在,可将检测结果转换为一般人可阅读的格式,在 shell 输入以下指令:

$ mtrace test test.log

编译好的程序test会寻找环境变量MALLOC_TRACE并把内存泄漏检测情况输出到里面。mtracePerl 脚本程序只是一个分析日志文件的工具,上述源文件的测试结果为:

Memory not freed:
-----------------
   Address     Size     Caller
0x08a99378      0xa  at /home/hit9/c/test.c:7

其实上述过程可以写个 Makefile 简化操作:

all:
    gcc test.c -o test -g
    env MALLOC_TRACE=test.log ./test
    mtrace test test.log

Valgrind

Valgrind 是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。具体信息可访问 Valgrind 官网

参考链接

上一篇:

下一篇:

回顶部