内存检测工具 内存问题检测就用它 - 华清远见(3)
比如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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




