调试实战 | 记一次有教益的 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。

➡️

继续阅读