教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

内存检测工具 内存问题检测就用它 - 华清远见(3)

来源:网络收集 时间:2026-09-09
导读: 比如memory overrun和double free就可以得到如下结果: Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens Segmentation fault (core dumped) Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens El

比如memory overrun和double free就可以得到如下结果: Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens Segmentation fault (core dumped)

Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens

ElectricFence Aborting: free(7fc1c17c8c00): address not from malloc(). Illegal instruction (core dumped)

它无法在log中打出详细信息,但如果运行前打开了coredump: $ ulimit -c unlimited

就可以gdb打开coredump来分析了: $ gdb ./bug -c core

注意因为多数平台在分配时遇到block size不是word size整数倍时会通过加padding byte进行word alignment。如果是在padded area中出现overrun则无法检测。这里可以通过在程序中设置EN_ALIGNMENT=1来防止byte padding,从而更容易检测off by one的问题。

DUMA(http://duma.sourceforge.net/)从Electric Fence中fork出来并加入一些其它特性,比如leak detection,Windows支持等。 Dmalloc

比较经典的内存检测工具,虽然N年没更新了。dmalloc通过在分配区域增加padding magic number的做法来检测非法访问,因此它能够检测到问题但不能检测出哪条指令出的错。Dmalloc只能检测越界写,但不能检测越界读。另外,Dmalloc只检测堆上用malloc系函数(而不是sbrk()或mmap())分配的内存,而无法对栈内存和静态内存进行检测。 本质上它也是通过hook malloc(), realloc(), calloc(),free()等内存管理函数,还有strcat(), strcpy()等内存操作函数,来检测内存问题。它支持x86, ARM平台,语言上支持C/C++,并且支持多线程。

使用时可以先从官网下载源码包(http://dmalloc.com/releases/),然后编译安装: $ tar zxvf dmalloc-5.5.2.tgz $ cd dmalloc-5.5.2 $ ./configure

$ make && make install

少量修改源代码。只需要加上下面的头文件: #ifdef DMALLOC#include \

然后编译时CFLAGS加上 -DDMALLOC -DDMALLOC_FUNC_CHECK,如:

$ g++ -Wall -g -DDMALLOC -DDMALLOC_FUNC_CHECK problem.cpp -o bug -ldmalloc dmalloc的配置选项可以通过设置环境变量DMALLOC_OPTIONS来实现,例如: $ export

DMALLOC_OPTIONS=log=logfile,check-fence,check-blank,check-shutdown,check-heap,check-funcs,log-stats,log-non-free,print-messages,log-nonfree-space 这些用法可参见:

http://dmalloc.com/docs/latest/online/dmalloc_26.html http://dmalloc.com/docs/latest/online/dmalloc_27.html

也可以用dmalloc这个命令来设置。直接dmalloc -v可用于查看当前设置。 发生错误时会给出类似以下输出:

1434270937: 2: error details: checking user pointer1434270937: 2: pointer '0x7fc235336808' from 'unknown' prev access 'problem.cpp:35'1434270937: 2: ERROR: _dmalloc_chunk_heap_check: free space has been overwritten (err 67)1434270937: 2: error details: checking pointer admin1434270937: 2: pointer '0x7fc235336808' from 'problem.cpp:37' prev access 'problem.cpp:35'1434270937: 2: ERROR: free: free space has been overwritten (err 67)

1434271030: 3: error details: finding address in heap1434271030: 3: pointer '0x7f0a7e29d808' from 'problem.cpp:27' prev access 'unknown'1434271030: 3: ERROR: free: tried to free previously freed pointer (err 61)

另外Dmalloc还提供一些函数,如dmalloc_mark(),dmalloc_log_changed()和dmalloc_log_unfreed()等来打印内存信息和分析内存变化:

http://dmalloc.com/docs/5.3.0/online/dmalloc_13.html Dr. Memory

重量级内存监测工具之一,用于检测如未初始化内存访问,越界访问,已释放内存访问,double free,memory leak以及Windows上的handle leak, GDI API usage error等。它支持Windows, Linux和Mac操作系统, IA-32和AMD64平台,和其它基于binary instrumentation的工具一样,它不需要改目标程序的binary。有个缺点是目前只针对x86上的32位程序。貌似目前正在往ARM上port。其优点是对程序的正常执行影响小,和Valgrind相比,性能更好。官网为http://www.drmemory.org/。Dr. Memory基于

DynamioRIO Binary Translator。原始代码不会直接运行,而是会经过translation后生成code cache,这些code cache会调用shared instrumentation来做内存检测。 Dr. Memory提供各平台的包下载。

https://github.com/DynamoRIO/drmemory/wiki/Downloads 下载后即可直接使用。首先编译要检测的测试程序:

$ g++ -m32 -g -Wall problem.cpp -o bug -fno-inline -fno-omit-frame-pointer (在64位host上编译32位程序需要安装libc6-dev-i386和g++-multilib) 然后把Dr.Memory的bin加入PATH,如:

$ export PATH=/home/jzj/tools/DrMemory-Linux-1.8.0-8/bin:$PATH 之后就可以使用Dr.Memory启动目标程序: \\$ drmemory – ./bug

更多用法参见 drmemory -help或http://drmemory.org/docs/page_options.html。 像遇到double-free和heap overflow问题的话就会给出类似下面结果: ~~Dr.M~~

~~Dr.M~~ Error #1: INVALID HEAP ARGUMENT to free 0x08ceb0e8

~~Dr.M~~ # 0 replace_free [/work/drmemory_package/common/alloc_replace.c:2503] ~~Dr.M~~ # 1 double_free [/home/jzj/code/problem.cpp:23] ~~Dr.M~~ # 2 main [/home/jzj/code/problem.cpp:157] ~~Dr.M~~ Note: @0:00:00.127 in thread 26159 ~~Dr.M~~ Note: memory was previously freed here:

~~Dr.M~~ Note: # 0 replace_free [/work/drmemory_package/common/alloc_replace.c:2503] ~~Dr.M~~ Note: # 1 double_free [/home/jzj/code/problem.cpp:22] ~~Dr.M~~ Note: # 2 main [/home/jzj/code/problem.cpp:157] ~~Dr.M~~

~~Dr.M~~ Error #1: UNADDRESSABLE ACCESS beyond heap bounds: writing 0x0988f508-0x0988f509 1 byte(s)

~~Dr.M~~ # 0 overrun [/home/jzj/code/problem.cpp:32] ~~Dr.M~~ # 1 main [/home/jzj/code/problem.cpp:154] ~~Dr.M~~ Note: @0:00:00.099 in thread 26191

~~Dr.M~~ Note: prev lower malloc: 0x0988f0e8-0x0988f4e8 ~~Dr.M~~ Note: instruction: mov $0x6a -> (êx) Stack protection

前面的工具大多用于堆内存检错,对于栈内存GCC本身提供了一些检错机制。加上-fstack-protector后,GCC会多加指令来检查buffer/stack overflow。原理是为函数加guard variable。在函数进入时初始化,函数退出时检查。相关的flag有-fstack-protector-strong -fstack-protector -fstack-protector-all等。使用例子:

$ g++ -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all problem.cpp -o bug 运行时会检测到stack overflow:

*** stack smashing detected ***: ./bug terminated Aborted (core dumped)

对于线程的栈可以参考pthread_attr_setguardsize()。 Rational purify & Insure++

Rational purity是IBM的 …… 此处隐藏:3618字,全部文档内容请下载后查看。喜欢就下载吧 ……

内存检测工具 内存问题检测就用它 - 华清远见(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/445357.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)