在linux系统下使用内存技术,检测堆越界错误

在linux系统下使用内存技术,检测堆越界错误,第1张

一般使用c或cpp编程时,堆栈越界访问(read/write)往往会引起很多意想不到的错误,比如延后的进程崩溃等。因此,如果有一种方法,可以让越界访问立即触发系统错误(让进程抛出异常而终止,再生成coredump文件),就可以立即检测出内存越界行为,并将对这种隐藏的错误,及时作出反应,以免在生产环境下造成更大的损失。 我们知道,在windows系统下面,我们可以使用VirtualAlloc系列函数,通过申请2页内存,并设置某页的保护参数(比如,可读,可写等),就可以实现类似的保护机制。这样,当我们对新增加的类(数据结构),就可以重载operator new/delete,将类的边界设置到一页的边缘,再将相邻页设置为不可读不可写。这样就能有效监测堆越界读写问题。而且可以,设置某个编译宏,比如PROTECT_CLASSX。演示代码如下: 在linux下,则需要借助mmap和mprotect来实现这个机制。具体步骤如下,首先用mmap使用PROT_NONE映射一个特殊文件,比如/dev/zero(或者使用MAP_ANONYMOUS),然后再用mprotect提交内存。上面的例子,可以继续使用,但是只列出来核心的代码,什么重载 *** 作符就不写了,另外,内存映射文件j句柄最好用内存池来hold,最后在close掉。演示代码只说明大致用法,并不能直接拿来用。 下面补充mprotect的用法: 再把mmap函数的用法示例如下:

是不是说没有一种内存检查工具能够在linux使用呢,也不是,像valgrind工具还是相当不错的。他的下载地址是 下载一个valgrind 3.2.3 (tar.bz2) 工具,按照里面的README提示,安装后就可以使用这个工具来检测内存泄露和内存越界等。这是一个没有界面的内存检测工具,安装后,输入valgrind ls -l 验证一下该工具是否工作正常(这是README里面的方法,实际上是验证一下对ls -l命令的内存检测),如果你看到一堆的信息说明你的工具可以使用了。 在编译你的程序时,请设置-g参数,编译出后使用如下的命令来判断你的程序存在内存泄露: valgrind --tools=memcheck --leak-check=full yourProg在输出信息中就会看到你的内存问题了。

经常碰到系统跑着跑着一段时间内存满了,出现内存泄漏的问题,系统软件太庞大,这类问题又不好直接从源码中分析,所以需要借助工具来分析了,kmemleak就是这样的一个工具。

在Kernel hacking中打开CONFIG_DEBUG_KMEMLEAK =y即使能了kmemleak,其实就是开了一个内核线程,该内核线程每10分钟(默认值)扫描内存,并打印发现新的未引用的对象的数量。kmemleak的原理其实就是通过kmalloc、vmalloc、kmem_cache_alloc等内存的分配,跟踪其指针,连同其他的分配大小和堆栈跟踪信息,存储在PRIO搜索树。如果存在相应的释放函数调用跟踪和指针,就会从kmemleak数据结构中移除。下面我们看看具体的用法。

查看内核打印信息详细过程如下:

1、挂载debugfs文件系统

   mount -t debugfs nodev /sys/kernel/debug/

2、开启内核自动检测线程

   echo scan > /sys/kernel/debug/kmemleak

3、查看打印信息

   cat /sys/kernel/debug/kmemleak

4、清除内核检测报告,新的内存泄露报告将重新写入/sys/kernel/debug/kmemleak

   echo clear > /sys/kernel/debug/kmemleak

内存扫描参数可以进行修改通过向/sys/kernel/debug/kmemleak 文件写入。 参数使用如下:

  off 禁用kmemleak(不可逆)

  stack=on 启用任务堆栈扫描(default)

  stack=off 禁用任务堆栈扫描

  scan=on 启动自动记忆扫描线程(default)

  scan=off 停止自动记忆扫描线程

  scan=<secs>设置n秒内自动记忆扫描,默认600s

  scan 开启内核扫描

  clear 清除内存泄露报告

  dump=<addr>转存信息对象在<addr>

通过“kmemleak = off”,也可以在启动时禁用Kmemleak在内核命令行。在初始化kmemleak之前,内存的分配或释放这些动作被存储在一个前期日志缓冲区。这个缓冲区的大小通过配CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE设置。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8353810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存