一.简介

win32下应用程序的内存最大限制为2G,如果new一块很大的内存即使没有超过系统限制也可能会引发崩溃,因为new出来的内存是连续的。

二.问题现象和跟踪分析

在调试一个内存越界的问题时,开启了gflags -p /enable *.exe /full,之后进程再也无法启动成功,查看此时进程内存,亦只有300多M,还剩余很多。另外产生的dump文件中,显示用户可用内存有100多M。
通过调试发现,此时进程停在了new的地方,具体调用栈如图1:
图片描述
图1 异常调用栈

查看03帧下size大小为0x20ce7000,大概为550多M,因为gflags设置内存对齐后,需要更大的内存。申请不到,因此程序在此时出现异常。(查看此值大小需要设定操作系统符号文件路径)
图片描述
图2 申请内存大小

三.问题解决

申请的内存大小变小后,未再出现异常。


one_piece
26 声望8 粉丝

引用和评论

0 条评论