调试实战 | 记一次有教益的 vs2022 内存分配失败崩溃分析(续)
💡
原文中文,约3900字,阅读约需10分钟。
📝
内容提要
本文分析了vs2022卡死问题,重点挖掘了崩溃前vs2022已分配的内容。通过查找vector对象地址和查看vector内容,得出vector中元素个数为40360465,验证了之前的分析。同时发现vector中每个元素的引用计数对象地址+0x10等于实际对象地址,推测vector中存储的对象是通过std::make_shared()创建的。文章总结了procdump的使用和64位进程的虚拟内存空间。
🎯
关键要点
- 本文分析了vs2022卡死问题,重点挖掘崩溃前已分配的内容。
- 崩溃原因是vs2022尝试分配923MB内存时,物理内存和页文件不足。
- 通过调用栈分析,找到vector对象地址和内容。
- vector中元素个数为40360465,验证了之前的分析。
- 发现vector中每个元素的引用计数对象地址+0x10等于实际对象地址,推测对象是通过std::make_shared()创建的。
- 总结了procdump的使用和64位进程的虚拟内存空间。
- 64位进程的虚拟内存空间为256TB,用户态可用128TB。
- 使用malloc()或new()分配内存超出堆阈值时,使用NtAllocateVirtualMemory()分配内存。
❓
延伸问答
vs2022崩溃的主要原因是什么?
vs2022崩溃是因为尝试分配923MB内存时,物理内存和页文件不足。
如何查找vector对象的地址和内容?
可以通过调用栈分析,找到vector对象的地址,并查看其内容。
vector中元素的数量是如何计算的?
通过起始地址和结束地址,以及每个元素的大小,可以计算出vector中的元素数量。
为什么vector中每个元素的引用计数对象地址与实际对象地址相差0x10?
这是因为vector中存储的对象是通过std::make_shared()创建的,引用计数对象地址加0x10等于实际对象地址。
procdump工具的使用方法是什么?
使用管理员权限运行procdump -i -ma d:\dumps\即可安装,-i表示安装,-ma表示执行完整转储。
64位进程的虚拟内存空间有多大?
64位进程的虚拟内存空间为256TB,用户态可用128TB。
➡️