malloc分配到一块内存,读写操作时却发生segmentation falt的奇怪问题。
期初现象:malloc一块内存,读写操作时发生segmentation falt。一般来讲malloc倘若失败应该抛出异常,所以malloc返回一个指针后,这个指针应该都是可用的,况且是进行读操作。 所以遇到这个问题时感觉很奇怪。
继续现象:经过地址打印确认该地址是前面操作过的一个地址。说明地址不在系统保护区。
继续现象:通过地址便宜发现该地址前面便宜几位就能够访问了,说明仅有该段内存出了问题。怀疑该段内存被某些代码做了手脚。
重现现象:安卓上munmap大于1835008后面再用这块内存就会core。
测试代码:
{
int test_size = 1835008;
std::cout<<"test_size:"<<test_size<<std::endl;
char * abc = (char *)malloc(test_size);
abc[1] = 'a';
std::cout<<(long long)abc<<std::endl;
std::cout<<abc[1]<<std::endl;
std::cout<<munmap(abc test_size)<<std::endl;
std::cout<<abc[1]<<std::endl;
free(abc);
abc = (char *)malloc(test_size);
std::cout<<(long long)abc<<std::endl;
std::cout<<abc[1]<<std::endl;
}
{
int test_size = 1835009;
std::cout<<"test_size:"<<test_size<<std::endl;
char * abc = (char *)malloc(test_size);
abc[1] = 'a';
std::cout<<(long long)abc<<std::endl;
std::cout<<abc[1]<<std::endl;
std::cout<<munmap(abc test_size)<<std::endl;
std::cout<<abc[1]<<std::endl;// 即使没有这句,下一句打印仍然会core的
free(abc);
abc = (char *)malloc(test_size);
std::cout<<(long long)abc<<std::endl;
std::cout<<abc[1]<<std::endl;
}
执行结果:
test_size:1835008
506508402240
a
-1
a
506508401344
test_size:1835009
506510442496
a
0
Segmentation fault
前面申请到内存506508402240时该内存还处于可用状态,后面再次申请到时就变成不可访问的了。
结论:感觉是安卓上超过1835008的内存就会用mmap方式分配(应该受限于glibc限定、ptmalloc实现时对具有长生命周期或特别大的内存分配会使用mmap。),此时该块内存可以被unmap掉,而unmap掉之后,该块内存就会引发Segmentation fault。这个在munmap使用说明有提到。(munmap该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。当映射关系解除后,对原来映射地址的访问将导致段错误发生。)
猜测也是munmap操作与glibc操作冲突导致glibc管理出现混乱无法对该机制内存进行再次map操作了。
malloc分配到一块内存,读写操作时却发生segmentation falt的奇怪问题。的更多相关文章
- VC++ 共享内存读写操作
此解决方案含两个工程文件,一个是写操作工程文件,即把任意字符串写入创建的共享内存里,另外一个读操作工程文件,则是读取共享内存里的数据,从而实现了进程之间的共享内存读写操作. 源码下载
- 如何减小SRAM读写操作时的串扰
静态存储器SRAM是一款不需要刷新电路即能保存它内部存储数据的存储器.在SRAM 存储阵列的设计中,经常会出现串扰问题发生.那么要如何减小如何减小SRAM读写操作时的串扰,以及提高SRAM的可靠性呢, ...
- Python文本文件读写操作时的字符编码问题
说明:文本文件的字符编码问题只存在t模式中,如:open('a.txt', mode='rt') 编码(encode): 我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先 ...
- 关于malloc申请的动态内存的问题
http://bbs.bccn.net/thread-331344-1-1.html #include<stdio.h>#include<stdlib.h>int main(v ...
- python里文件读写操作
文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码.内存缓冲.指针位置等等.如果忽视这些问题就会引起很多不必要的麻烦.简单来说,文件的读写分为几个过程: 打开文件,并定义操作文件 ...
- NIO流—理解Buffer、Channel概念和NIO的读写操作
NIO流与IO流的区别 面向流与面向块 IO流是每次处理一个或多个字节,效率很慢(字符流处理的也是字节,只是对字节进行编码和解码处理). NIO流是以数据块为单位来处理,缓冲区就是用于读写的数据块.缓 ...
- PHP文件读写操作之文件写入代码
在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...
- Python中json的简单读写操作
Python中json的简单读写操作 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
随机推荐
- 5 dex文件
Dex文件中数据结构 类型 含义 u1 等同于uint8_t,表示1字节无符号数 u2 等同于uint16_t,表示2字节的无符号数 u4 等同于uint32_t,表示4字节的无符号数 u8 等同于u ...
- Golang Web应用 创建docker镜像笔记(win 平台)
记录的是 本地编译好了再创建容器镜像的方法 ,这样子生成的镜像文件比较小,方便分发部署 win 平台需要设置golang交叉编译 生成linux可执行文件 CMD下: Set GOOS="l ...
- prometheus学习系列三:node_exporter安装部署
node_exporter简介 node_exporter安装部署 [root@node00 ~]# cd /usr/src/ [root@node00 src]# wget https://gith ...
- Centos6.5配置防火墙
1.查看防火墙状态 [root@instance-xfl1djr7 ~]# /etc/init.d/iptables status 2.启动/关闭防火墙 开启防火墙 [root@instance-xf ...
- Django之mysql数据库配置
在settings.py中配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'my ...
- SpringCloud2.0 Hystrix Dashboard 断路器指标看板
原文:https://www.cnblogs.com/songlu/p/9973856.html 1.启动基础工程 1.1.启动[服务中心]集群,工程名称:springcloud-eureka-ser ...
- python基础语法13 内置模块 subprocess,re模块,logging日志记录模块,防止导入模块时自动执行测试功能,包的理论
subprocess模块: - 可以通过python代码给操作系统终端发送命令, 并且可以返回结果. sub: 子 process: 进程 import subprocess while Tru ...
- 磁盘提示“X:拒绝访问”问题解决
cacls "D:\*.*" /T /E /G Administrators:F cacls "D:\*.*" /T /E /G Users:F cacls & ...
- oc语言源代码
? https://opensource.apple.com/source/objc4/objc4-493.9/runtime/
- swift的柯里化demo
func baseFunc(go:String, goo:String) -> String { return "hello" + go + goo; } func Curr ...