内存泄漏,我们经常会遇到,如何检测内存泄漏,除了我们之前讲过的 valgrind,还可以使用 gcc 自带的工具 sanitizer。
从 gcc 4.8 开始,sanitizer 就被加入到 gcc 中,使用起来非常方便,可以检测内存泄漏、内存越界、野指针等等。
下面来简单演示下怎么使用。
void leak_memory()
{
char *ptr = (char *)malloc(128);
}
比如这段代码,一眼看出内存泄漏。
# gcc test.c -o test -g -fsanitize=address
编译的时候加上 -g 选项,方便后续调试,再加上 -fsanitize=address,得到二进制文件。
root@Turbo:~# ./test
=================================================================
==374040==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 128 byte(s) in 1 object(s) allocated from:
#0 0x7d41794fd9c7 in malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
#1 0x62d90d0dc25e in leak_memory /root/test.c:5
#2 0x62d90d0dc4e7 in main /root/test.c:43
#3 0x7d417902a1c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#4 0x7d417902a28a in __libc_start_main_impl ../csu/libc-start.c:360
#5 0x62d90d0dc184 in _start (/root/test+0x1184) (BuildId: a2e83d98f01d2da94cd327af18f596c19fc367bb)
SUMMARY: AddressSanitizer: 128 byte(s) leaked in 1 allocation(s).
root@Turbo:~#
运行程序,会提示一大堆错误。虽然全是英文,但是阅读起来也没什么难度,只要你有英语三级的水平,应该能发现,内存泄漏了。
再来个代码,栈内存越界访问。
void stack_overflow()
{
int array[5] = {0};
array[5] = 1;
}
同样的方法,编译运行,提示栈内存溢出。
至于其他的内存问题,释放不合法的内存、内存被释放了又继续使用、两次释放同一块内存,这些问题统统可以检查。
非常实用的工具,调试代码的时候,可以帮我们节省很多时间。
全部0条评论
快来发表一下你的评论吧 !