C++-如何排查内存写坏
C++-如何排查内存写坏问题
- 内存写坏问题
- mprotect
- 函数原型
- 注意事项
- mmap
- 函数原型
- 例子
内存写坏问题
c++内存写坏问题,有很多原因造成,包括野指针、指针越界、并发场景等,出现很难排查,有很多内存分析工具可以使用,比如Valgrind1等很多方式
本文总结一种容易排查定位的方法:
mprotect+信号量处理【比如利用backtrace打印堆栈调用方式】,从而定位到哪里写坏内存
mprotect
mprotect是一种系统调用,mprotect
简单而言,mprotec可以指定一块内存保护为指定的模式,比如只读模式,这样当有场景破坏该模式的时候,就可以发送信号量SIGSEGV,这时候程序中捕获SIGSEGV,就可以获取到相关信息
函数原型
#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
其中addr和len指定保护的内存区域,其中prot是模式,比如
PROT_NONE The memory cannot be accessed at all.PROT_READ The memory can be read.PROT_WRITE The memory can be modified.PROT_EXEC The memory can be executed.
注意事项
其中需要注意的一点,mprotect要求保护的addr需要内存地址页对齐。因此如果保护的地址不是内存地址页对齐,需要改造比如填充保证对齐,或者使用mmap分配内存,保证一定是对齐的
mmap
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。具体可以参考认真分析mmap:是什么 为什么 怎么用
函数原型
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
例子
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>static int alloc_size;
static char* memory;void segv_handler(int signal_number)
{printf ("memory accessed!\n");mprotect (memory, alloc_size, PROT_READ | PROT_WRITE);
}int main ()
{int fd;struct sigaction sa;// 初始化segv_handler为SIGSEGV的句柄memset (&sa, 0, sizeof (sa));sa.sa_handler = &segv_handler;sigaction (SIGSEGV, &sa, NULL);// 使用映射/dev/zero分配内存页。最初映射的内存为只写alloc_size = getpagesize();fd = open ("/dev/zero", O_RDONLY);// 分配内存memory = static_cast<char *>(mmap (NULL, alloc_size, PROT_WRITE, MAP_PRIVATE, fd, 0));close (fd);// 写页来获得一个私有复制memory[0] = 0;// 使内存为不可写mprotect (memory, alloc_size, PROT_READ);// 写分配内存区域memory[0] = 1;// 释放内存printf ("free mem\n");munmap (memory, alloc_size);return 0;
}
g++ main.cpp -o main
执行后,./main
./main
memory accessed!
free mem
应用 Valgrind 发现 Linux 程序的内存问题 ↩︎
C++-如何排查内存写坏相关推荐
- Linux用户态进程监控内存写排查踩内存
高铁北京回杭州的路上,想到一个简单的话题. 在一个复杂的程序中,发生踩内存是一件非常恶心的事情,很难通过什么线索直到谁在哪个函数中往哪个地址写了什么,比方说数组越界写什么的. 去年,我曾经长篇大论了一 ...
- securecrt遇到一个致命的错误且必须关闭_谈谈如何利用 valgrind 排查内存错误
导读 Valgrind 最为开发者熟知和广泛使用的工具莫过于 Memcheck,它是检查 c/c++ 程序内存错误的神器,报告结果非常之精准. 本文主要分享作者在使用该神器解决内存问题的过程中积累的一 ...
- 这些排查内存问题的命令,你用过多少?
我相信大家都遇到过内存占用率过高的情况,在排查过程中,我们会用到一些命令或工具,下面来看下这些你都用过吗? top 命令 首先比较常用的就是 top 命令,是性能监控的常用命令,该命令可以实时显示系统 ...
- 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )
文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...
- jvm监控工具(排查内存溢出和内存泄漏)
Visual VM可以实时监控jvm的运行情况 按Perform GC会立即进行一次GC 按Heap Dump会生成内存信息报告 还可以监控SQL 使用visualVM排查内存泄漏 模拟内存溢出: i ...
- 谈谈如何利用 valgrind 排查内存错误
谈谈如何利用 valgrind 排查内存错误 - 云+社区 - 腾讯云 (tencent.com) 高性能服务器开发关于Socket编程的内容 - 云+社区 - 腾讯云 (tencent.com)
- C++内存写越界导致堆内存被破坏致使new失败的问题定位总结
问题描述: C++内存写越界导致堆内存被破坏致使new失败的问题定位总结. 报错信息:test_CRGraph: malloc.c:2379: sysmalloc: Assertion `(old_t ...
- 如何排查内存溢出问题
如何排查内存溢出问题 一.前言 二.如何识别 1.当前常见的内存溢出分类 2.内存溢出已出现 3.内存溢出出现的路上 三.如何定位 1.内存溢出已出现 2.内存溢出出现的路上 四.如何解决 1.内存真 ...
- 在线排查内存泄漏的步骤
一.在线排查内存泄漏的步骤 想到内存泄漏问题的排查,很多开发会想到使用 Valgrind.使用 Valgrind 有几个局限: 需要安装 Valgrind 需要启停服务进程 影响服务进程性能 依赖于测 ...
- arthas 排查内存溢出_【spark-tips】spark2.4.0触发的executor内存溢出排查
版本升级背景 spark 2.4.0 最近刚发版,新增了很多令人振奋的特性.由于本司目前使用的是spark 2.3.0版本,本没打算这么快升级到2.4.0.无奈最近排查出的两个大bug迫使我们只能对s ...
最新文章
- html标签(2)--有序列表与无序列表
- 了解Java中的检查与未检查异常
- ASP.NET Core EFCore 之Code First
- 网络共享服务(三)之SAMBA
- mysql中模糊查询的四种用法
- libcurl post数据
- Python画图实战之画K线图【附带自动下载股票数据】
- PyCharm 下提示 'no module named time'
- sql的执行顺序(from平凡世界)
- WINDOWS下,找包含特殊字串的文件的解决办法
- SlickEdit配置保存路径
- 华为od与中软外包哪个更好_华为外包,不是OD,OD也烂,呆了8个月。今天离职再见,…...
- vue2中watch的使用
- 京东云618年中大促开始啦!
- imazing显示无法连接服务器,为什么苹果手机连接不上iMazing
- Linux开源存储全栈详解:从Ceph到容器存储
- Nginx项目部署笔记
- linux之sed命令详解
- 美国软件开发实习生月薪排行榜
- 5G FWA市场一跃而上,四信多款5G终端赋能FWA典型应用
热门文章
- linux sin()编译
- 20.溢出文本用省略号表示
- 3D游戏中镜头的运用
- 美国人口统计数据MATLAB,根据表的数据,完成下列数据拟合问题:美国人口统计数据 年份 1790 1800 1810 1820 1830 1840...
- 计算几何(中线长计算三角形面积) - Medians - UVA 10347
- 工业设备数字孪生白皮书
- php注入过程详解,PHP注入代码详解
- 全国计算机技术与软件专业技术资格(水平)考试2019年上半年考试公告(湖北省)
- educoder1-2Python 计算思维训练——公式计算
- ubuntu hashcat 安装