前言
前一阵子遇到了 vs2022
卡死的问题,在上一篇文章中重点分析了崩溃的原因 —— 当 vs2022
尝试分配 923MB
的内存时,物理内存+页文件大小不足以满足这次分配请求,于是抛出异常。
本篇文章将重点挖掘一下 vs2022
在崩溃之前已经分配的内容。
说明: 本文很早就写了草稿,一直没时间整理发布,Finally~
还是先从调用栈入手,找到关键参数,然后查看参数内容。
查找 vector 对象地址
栈帧 0b
对应的函数是 std::vector<T>::_Emplace_reallocate()
,栈帧 0c
会调用这个函数。根据调用约定可知,调用类成员函数时,rcx
会指向类对象,在这里 rcx
会指向 std::vector<std::shared_ptr<std::stringstream>>
类型的实例。可以通过查看栈帧 0c
的反汇编代码确定 rcx
的来源。

从图中可知,rcx
的值来自 rbp-0x70
。那 rbp
的值是多少呢?使用 uf
查看 vcpkg!code_store::a_store::a_thread_impl::append_code_item_name()
函数的反汇编代码。

由上图可知,先把 rsp-0x920
赋值给 rbp
,然后 rsp
会减小 0xa20
。所以可以通过 rsp+0xa20-0x920
计算出对应的 rbp
的值,再减去 0x70
即可得到 rcx
的值。由此可知 vector
对象的地址