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 ...
随机推荐
- WebApplicationContext初始化的两种方式和获取的三种方式
原博客地址:http://blog.csdn.net/lmb55/article/details/50510547 接下来以ContextLoaderListener为例,分析它到底做了什么? app ...
- GitPython模块
GitPython模块 安装: pip3 install gitpython Gitpython 操作 import os from git.repo import Repo import json ...
- Fiddler抓包工具简介
1.Fiddler工具: 个人认为Fiddler实际上是一款在浏览器与服务器之间设置代理,对两者之间的通信会话(数据包)进行抓取和处理的一款工具: Fiddler是一个http协议调试代理工具,它能够 ...
- koa-session 知识点
github 网址:https://github.com/koajs/session session 是一个对象
- woocommerce调用产品相册gallery图片如何操作?wordpress技巧
wordpress官网有很多woocommerce模板,但有些客户要求定制模板,这时可能会碰到产品相册图片调用的问题,如果根据自带的Storefront主题来改很麻烦,那我们就自己定义吧!下来就随yt ...
- Pycharm激活方法使用的是(license server)
pycharm所有版本 http://www.jetbrains.com/pycharm/download/previous.html打开激活窗口 选择 Activate new license wi ...
- 关于vue+axios上传文件的踩坑分析
上传文件是每个前端开发者都会遇到的问题,在之前实习期做了一个上传文件的功能,当时没有彻底搞明白问题所在,现在重新复盘下. 1.使用formData来上传文件,没有使用axios上传文件,之前在学校有做 ...
- Goland在go mod vendor模式下无法识别某些库
症状:go build可以正常编译,但代码编辑器里面提示找不到相关lib,后来发现是因为go.mod中没有用require这个库,补上库地址和版本.因为项目的mod vendor模式,版本一般不需要写 ...
- web前端如何性能优化提高加载速度
前端优化有以下几种途径: 一.减少HTTP请求数量和次数: 二.使用CDN: 三.添加Expires头: 四.压缩组件: 五.将样式表放在头部: 六.将脚本放在底部: 七.避免CSS表达式: 八.使用 ...
- win10系统绑定本地IP和mac地址
第一步:找到自己的IP和mac地址 1.按着win键+R键,输入cmd(大小写都一样) 2.命令: ipconfig /all #查看所有地址 然后按“回车键” 3.这样 ...