定位堆内存越界问题
堆内存崩溃俗称采坑。也就是说在前面某些地方埋了坑,却不知道代码位置,但是等崩溃出现了,却看到的是踩坑的代码。
这时候我们需要找到埋坑的地方。然后修复埋坑的代码。
#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 保护值。
如果内存越界了,就会将0xfd保护值破坏。每次读写内存时候,dbgheap.c 会检查0xfd保护值。当保护值被篡改就会断到。如上代码,比如我们删除这个指针的时候:
这时候,针对这块保护值,借用条件断点。就能知道越界的代码位置了。
如果是Release版,我们可以借用gflags。 打开gflags /p /enable,可以在内存越界时候触发断点。外面帖子很多,不再截图了。
Xcode:
我们Xcode 打开scheme,具体为 Project->Scheme->Edit Scheme。里面在Run选项里面 Diagnostics, Memory Management 里面有几个选项,其中就是关于越界的。
我们打开,运行,就能在memset 那一行触发断点了。
ps: 补充一点,IOS 只支持模拟器。否则会有运行错误。暂时还不清楚为什么。
Android native 内存检测,有个知乎大神贴,我自己没试过
https://zhuanlan.zhihu.com/p/29176806