内存检测工具Dr. Memory的使用

Dr. Memory是一个内存调试工具,它是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memory的更多说明可以参考其主页:http://drmemory.org/

         下面简单说下其在Windows7上的使用过程:

1.      从https://github.com/DynamoRIO/drmemory/wiki/Downloads上下载最新版本1.10.1的压缩包DrMemory-Windows-1.10.1-3.zip (若官网下不下来可以从http://download.csdn.net/detail/fengbingchun/9545410下载),解压缩;

2.      新建DrMemory控制台工程,测试代码如下:

#include <iostream>

void test1(); // 内存泄露
void test2(); // 非法访问
void test3(); // 未初始化读
void test4(); // Heap 操作参数错误(Invalid Heap Argument)

int main()
{
	// reference: http://www.ibm.com/developerworks/cn/linux/1309_liuming_drmemory/
	test4();

	std::cout << "ok" << std::endl;
	return 0;
}

void test1()
{
	char *ptr;
	for (int i = 0; i<100; i++) {
		ptr = (char*)malloc(i);

		if (i % 2) free(ptr);
	}
}

void test2()
{
	char *x = (char*)malloc(8);
	char c = *(x + 8); // buffer overlow
	free(x);
	c = *x; // read free memory
}

typedef struct T_ {
	char a;
	char b;
}T;

void test3()
{
	T a, b;
	char x;
	a.a = 'a';
	a.b = 'b';
	b.a = x; // error C4700:使用了未初始化的局部变量x,若使vs2013能够正常编译,需将配置属性中的C/C++ SDL检查关闭
	if (b.a == 10)
		memcpy(&b, &a, sizeof(T));
}

void test4()
{
	char * ptr = NULL;
	ptr = new char;
	free(ptr);
	free(ptr); //
}

3.      将DrMemory解压缩后存放到E:\GitCode\DrMemory-Windows-1.10.1-3 下,通过命令提示符打开bin/drmemory.exe或bin64/drmemory.exe,然后输入命令如下图所示,目前DrMemory仅能检测32位程序,调用64位程序检测不出任何问题,如图1中红框所示。执行完后会在E:\GitCode\DrMemory-Windows-1.10.1-3\drmemory\logs\DrMemory-DrMemoryTest[dbg_x64_vc12].exe.972.000目录下生成相应的results.txt文本文件,里面记录了更多的细节。


4.      test1()的执行结果如下图:


test2()的执行结果如下图:

内存检测工具Dr. Memory的使用_第1张图片

test3()的执行结果如下图:

内存检测工具Dr. Memory的使用_第2张图片

test4()的执行结果如下图:


GitHub:https://github.com/fengbingchun/Messy_Test

你可能感兴趣的:(内存检测工具Dr. Memory的使用)