在linux系统下使用内存技术,检测堆越界错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linux系统下使用内存技术,检测堆越界错误相关的知识,希望对你有一定的参考价值。
参考技术A 一般使用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下的段错误
linux下一般进程不都共享一个大段吗?为什么指针读取错还是会有段错误?
你好!有幸回答你的问题! 首先我得告诉你,进程之间是不直接共享内存的,他们的数据通信都是要专门的通信机制的,比如:内存共享、消息队列,信号量等等,这儿的内存共享是linux进程的一种通信机制,为了好理解,你就想成一种通信工具吧,
另外,段错误一般是指你访问了错误地址,非法地址,越界访问等错误操作。回首去看你的代码吧,看哪儿访问了非法地址! 参考技术A 共享大段??
印象里所有软件的内存都是独立的,共享仅仅是系统内核级别的事情吧?
至于段错误,都是严重错误。指针操作不是可以随便用的。
不然你直接覆盖了系统内核或者驱动的内存,这就不一定是系统挂掉的问题了。
以上是关于在linux系统下使用内存技术,检测堆越界错误的主要内容,如果未能解决你的问题,请参考以下文章