定位堆内存越界问题

简介: 定位堆内存越界问题 堆内存崩溃俗称采坑。也就是说在前面某些地方埋了坑,却不知道代码位置,但是等崩溃出现了,却看到的是踩坑的代码。 这时候我们需要找到埋坑的地方。然后修复埋坑的代码。 Windows: 如果是Debug版,dbgheap.c 在堆内存前后会加 8个0xcd 保护值。
定位堆内存越界问题

堆内存崩溃俗称采坑。也就是说在前面某些地方埋了坑,却不知道代码位置,但是等崩溃出现了,却看到的是踩坑的代码。

这时候我们需要找到埋坑的地方。然后修复埋坑的代码。
#include <iostream>

class A{
public:
    char t[16];
};


int main(int argc, const char * argv[]) {
    
    A * pA = new A;

    memset(pA->t, 0, 17);
    
    delete pA;
    
    return 0;
}
Windows:

如果是Debug版,dbgheap.c 在堆内存前后会加 8个0xfd 保护值。
2892f298b12578a791499f93429e0e5f8baca4ac
如果内存越界了,就会将0xfd保护值破坏。每次读写内存时候,dbgheap.c 会检查0xfd保护值。当保护值被篡改就会断到。如上代码,比如我们删除这个指针的时候:
35d623cec1a9de26cca7ce2c1ade4437a300175e
这时候,针对这块保护值,借用条件断点。就能知道越界的代码位置了。
29bce82e49f3ffefaa8ff7955b01ad0a794430f4 c8d3265eda904bf6474be3f064cadbcf08e4ed3f

如果是Release版,我们可以借用gflags。 打开gflags /p /enable,可以在内存越界时候触发断点。外面帖子很多,不再截图了。

Xcode:

我们Xcode 打开scheme,具体为 Project->Scheme->Edit Scheme。里面在Run选项里面 Diagnostics, Memory Management 里面有几个选项,其中就是关于越界的。
fb464f72b6f812880c7f1939d86e6f10b06ac9f5
我们打开,运行,就能在memset 那一行触发断点了。
e659430ecd9b47eb0741fc92e9ec0de501cf975a
ps: 补充一点,IOS 只支持模拟器。否则会有运行错误。暂时还不清楚为什么。

Android native 内存检测,有个知乎大神贴,我自己没试过
https://zhuanlan.zhihu.com/p/29176806

Linux 有很多工具软件,比 Valgrind 之类的。没怎么用过,还是不介绍了。




目录
相关文章
|
4月前
|
存储 Java 编译器
【面试知识】Java内存分配之常量池、堆、栈
【面试知识】Java内存分配之常量池、堆、栈
|
4月前
|
存储 Java 测试技术
记一次堆内外内存问题的排查和优化
记一次堆内外内存问题的排查和优化
128 0
|
3月前
|
存储 Java 数据库
jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
61 0
|
1月前
|
存储 Linux 程序员
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
76 0
|
1月前
|
存储 安全 Java
【JVM】Java堆 :深入理解内存中的对象世界
【JVM】Java堆 :深入理解内存中的对象世界
53 0
|
1月前
|
存储 缓存 Rust
【Rust】——所有权:Stack(栈内存)vs Heap(堆内存)(重点)
【Rust】——所有权:Stack(栈内存)vs Heap(堆内存)(重点)
22 0
|
3月前
|
存储 缓存 算法
对象和数组并不是都是在堆上分配内存的
对象和数组并不是都是在堆上分配内存的
25 0
|
3月前
|
Dragonfly 算法 安全
RT-Thread快速入门-动态内存堆管理方法
RT-Thread快速入门-动态内存堆管理方法
30 0
|
3月前
|
缓存 架构师 算法
Java内存溢出如何解决,Java oom排查方法,10个定位解决办法
在Java开发过程中,有效的内存管理是保证应用程序稳定性和性能的关键。不正确的内存使用可能导致内存泄露甚至是致命的OutOfMemoryError(OOM)。
|
4月前
|
存储 缓存 算法
JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)
JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)
33 0