两个内存调试工具
2015-03-06 15:41
288 查看
一.动态内存分配是一个很容易出现程序漏洞的领域,且一旦出错不易查找.这些错误通常由两种原因引起:
1.指针malloc()分配的内存的指针值发生变化,又没有别的指针指向它,那么这块内存在程序退出将变得无法访问.
2.在一个已分配的内存块前或后写数据,很可能会损坏malloc函数库用于记录分配情况的数据结构.出现这种情况后,过一段时间后,再调用malloc或free都可能失败而引起程序崩溃,要找这类错误的发生地点和准确时间是困难的,因为错误的发生是在很久以前.
有很多工具可以帮助发现这些错误,例如Electricfence和valgrind
二.
1.Electricfence
Electricfence尝试用linux的虚拟内存机制来保护malloc和free所使用的内存,当它发现内存被破坏时停止程序运行.这个程序不是linux自带的,我们需要从网上下载(可以使用ubuntu的Synaptic Package Manager软件安装)
下面的程序efnece.c调用malloc分配了1024字节的内存,程序试图写这块内存后的第一个字节
/*efence_test.c*/
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(1024);
ptr[0] = 0;
ptr[1024] = 0;
return 0;
}
gcc编译运行后没有发现任何异常,但malloc所分配的内存可能已被破坏,我们迟早会遇到麻烦
安装Electricfence后,就可以在编译时加入efence库
gcc -g -o efence_test efence_test.c -lefence
2.valgrind
valgrind工具能检测到前面所说的错误,还能检测到数组越界错误,这个软件也不是linux自带的,需要到http://developer.kde.org/~sewardj上找到.(ubuntu系统也可以通过Synaptic Package Manager软件安装)
使用valgrind工具不需要重新编译,它还可以用来调试一个正在运行的程序
/*checher.c*/
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(1024);
char ch;
ch = ptr[1024];
ptr[1024] = 0;
ptr = 0;
return 0;
}
编译好checher后,直接用命令valgrind --leak-check=yes -v ./checker
内存条测试工具 Windows Memory Diagnostic
1.指针malloc()分配的内存的指针值发生变化,又没有别的指针指向它,那么这块内存在程序退出将变得无法访问.
2.在一个已分配的内存块前或后写数据,很可能会损坏malloc函数库用于记录分配情况的数据结构.出现这种情况后,过一段时间后,再调用malloc或free都可能失败而引起程序崩溃,要找这类错误的发生地点和准确时间是困难的,因为错误的发生是在很久以前.
有很多工具可以帮助发现这些错误,例如Electricfence和valgrind
二.
1.Electricfence
Electricfence尝试用linux的虚拟内存机制来保护malloc和free所使用的内存,当它发现内存被破坏时停止程序运行.这个程序不是linux自带的,我们需要从网上下载(可以使用ubuntu的Synaptic Package Manager软件安装)
下面的程序efnece.c调用malloc分配了1024字节的内存,程序试图写这块内存后的第一个字节
/*efence_test.c*/
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(1024);
ptr[0] = 0;
ptr[1024] = 0;
return 0;
}
gcc编译运行后没有发现任何异常,但malloc所分配的内存可能已被破坏,我们迟早会遇到麻烦
安装Electricfence后,就可以在编译时加入efence库
gcc -g -o efence_test efence_test.c -lefence
2.valgrind
valgrind工具能检测到前面所说的错误,还能检测到数组越界错误,这个软件也不是linux自带的,需要到http://developer.kde.org/~sewardj上找到.(ubuntu系统也可以通过Synaptic Package Manager软件安装)
使用valgrind工具不需要重新编译,它还可以用来调试一个正在运行的程序
/*checher.c*/
#include <stdlib.h>
int main()
{
char *ptr = (char *)malloc(1024);
char ch;
ch = ptr[1024];
ptr[1024] = 0;
ptr = 0;
return 0;
}
编译好checher后,直接用命令valgrind --leak-check=yes -v ./checker
内存条测试工具 Windows Memory Diagnostic
相关文章推荐
- 两个内存调试工具
- 两个内存调试工具
- linux 内存调试工具MEMWATCH
- linux 内存调试工具MEMWATCH
- Valgrind--Linux下的内存调试和代码解剖工具
- JS 内存溢出,调试工具
- 两个web页面调试工具如何使用
- Valgrind--Linux下的内存调试和代码解剖工具
- linux 内存调试工具MEMWATCH
- VC程序调试技术,一些工具上和具体的问题,包括内存检测
- linux下调试内存泄露的工具Valgrind
- Linux 内存泄露调试工具
- Linux 内存调试工具- Valgrind
- 内存泄露调试之 visual leak detector 工具的使用
- 内存调试工具Valgrind使用介绍
- 内存调试工具Electric Fence
- 内存越界和内存泄漏的调试工具
- 介绍两个检测内存越界的工具pagehedap和gflags
- Linux 内存调试工具- Valgrind 使用初探(转)
- 对于驱动调试有用的两个小工具(devmem2、devkmem)