没有合适的资源?快使用搜索试试~ 我知道了~
内存检测工具 内存问题检测就用它-华清远见.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 187 浏览量
2022-07-11
16:29:20
上传
评论
收藏 539KB PDF 举报
温馨提示
试读
15页
。。。
资源推荐
资源详情
资源评论
内存检测工具 内存问题检测就用它
内存问题在 C/C++等底层语言中,是非常难解决的问题。对于一个 c/c++程序员来说,内存泄漏是一个
常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题。平时写 c++程序,内存泄漏问题
都比较难以排查,一般都要等到程序出 bug 了,才能慢慢的检查出来。本篇文章就来给大家介绍一下内存检
测工具,内存问题检测就用它吧。
一般内存问题检测,初学者最常用的是逐步打印 log 信息但其效率不是太高,也比较的繁琐,尤其是
在运行成本高或重现概率低的情况下。另外,静态检查也是一类方法,有很多工具(lint, cppcheck,
klockwork, splint, o, etc.)。但缺点是误报很多,不适合针对性问题。另外误报率低的一般还需要收费。
最后,就是动态检查工具。下面介绍几个 Linux 平台下主要的运行时内存检查工具。绝大多数都是开源免
费且支持 x86 和 ARM 平台的。
首先,比较常见的内存问题有下面几种:
• memory overrun:写内存越界
• double free:同一块内存释放两次
• use after free:内存释放后使用
• wild free:释放内存的参数为非法值
• access uninitialized memory:访问未初始化内存
• read invalid memory:读取非法内存,本质上也属于内存越界
• memory leak:内存泄露
• use after return:caller 访问一个指针,该指针指向 callee 的栈内内存
• stack overflow:栈溢出
针对上面的问题,主要有以下几种方法:
1. 为了检测内存非法使用,需要 hook 内存分配和操作函数。hook 的方法可以是用 C-preprocessor,
也可以是在链接库中直接定义(因为 Glibc 中的 malloc/free 等函数都是 weak symbol),或是用 LD_PRELOAD。
另外,通过 hook strcpy(),memmove()等函数可以检测它们是否引起 buffer overflow。
2. 为了检查内存的非法访问,需要对程序的内存进行 bookkeeping,然后截获每次访存操作并检测是
否合法。bookkeeping 的方法大同小异,主要思想是用 shadow memory 来验证某块内存的合法性。至于
instrumentation 的方法各种各样。有 run-time 的,比如通过把程序运行在虚拟机中或是通过 binary
translator 来运行;或是 compile-time 的,在编译时就在访存指令时就加入检查操作。另外也可以通过在
分配内存前后加设为不可访问的 guard page,这样可以利用硬件(MMU)来触发 SIGSEGV,从而提高速度。
3. 为了检测栈的问题,一般在 stack 上设置 canary,即在函数调用时在栈上写 magic number 或是随
机值,然后在函数返回时检查是否被改写。另外可以通过 mprotect()在 stack 的顶端设置 guard page,这
样栈溢出会导致 SIGSEGV 而不至于破坏数据。
以上方法有些强于功能,有些胜在性能,有些则十分方便易用,总之各有千秋。以下是几种常用工具
在 Linux x86_64 平台的实验结果,注意其它平台可能结果有差异。
另外也可能由于版本过老,编译环境差异,总之各种原因造成遗漏,如有请谅解
Tool\Problem memory overrun double free use after free wild free access uninited read invalid
memory memory leak use after return stack overflow
Memory checking tools in Glibc Yes Yes Yes Yes(if use memcpy, strcpy, etc)
TCMalloc(Gperftools) Yes
Valgrind Yes Yes Yes Yes Yes Yes Yes Yes Yes
Address Sanitizer(ASan) Yes Yes Yes Yes (Memory Sanitizer) Yes Yes Yes Yes
Memwatch Yes Yes Yes
Dr.Memory Yes Yes Yes Yes Yes Yes Yes Yes
Electric Fence Yes Yes Yes Yes
Dmalloc Yes Yes Yes Yes Yes
下面简单介绍一下这些工具以及基本用法。更详细用法请参见各自 manual。
Memory checking tools in Glibc
Glibc 中自带了一些 Heap consistency checking 机制。
MALLOC_CHECK_
用 mallopt()的 M_CHECK_ACTION 可以设置内存检测行为,设 MALLOC_CHECK_环境变量效果也是一样的。
从 Glibc 2.3.4 开始,默认为 3。即打印出错信息,stack trace 和 memory mapping,再退出程序。设置
LIBC_FATAL_STDERR_=1 可以将这些信息输出到 stderr。比如运行以下有 double free 的程序:
$ MALLOC_CHECK_=3 ./bug
会打印如下信息然后退出:
*** Error in `./bug': free(): invalid pointer: 0x00000000010d6010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7338f)[0x7f367073238f]
/lib/x86_64-linux-gnu/libc.so.6(+0x81fb6)[0x7f3670740fb6]
./bug[0x400845]
./bug[0x400c36]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f36706e0ec5]
./bug[0x400729]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:01 2893041 /home/jzj/code/bug
00601000-00602000 r--p 00001000 08:01 2893041 /home/jzj/code/bug
00602000-00603000 rw-p 00002000 08:01 2893041 /home/jzj/code/bug
010d6000-010f7000 rw-p 00000000 00:00 0 [heap]
7f36704a8000-7f36704be000 r-xp 00000000 08:01 4203676 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f36704be000-7f36706bd000 ---p 00016000 08:01 4203676 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f36706bd000-7f36706be000 r--p 00015000 08:01 4203676 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f36706be000-7f36706bf000 rw-p 00016000 08:01 4203676 /lib/x86_64-linux-gnu/libgcc_s.so.1
…
Aborted (core dumped)
mcheck
mcheck 是 Glibc 中的堆内存一致性检查机制。使用时只要加上头文件:
#include
再在要开始检查的地方加上:
if (mcheck(NULL) != 0) {
fprintf(stderr, "mcheck() failed\n");
剩余14页未读,继续阅读
资源评论
G11176593
- 粉丝: 6643
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功