Windbg里识别CRT堆(拾遗)
在《Windbg里识别CRT堆》一文里,介绍了可以通过msvcrXX.dll!_crtheap来获取crt堆的句柄。但这种方法只针对VS2015前的crt版本有效。
这是因为从 Visual Studio .NET 到 Visual Studio 2013,C++ 编译器和工具的每个主版本都包含一个新的独立版本的 Microsoft C 运行 (CRT) 库。 CRT 的这些独立版本彼此独立,并在不同程度上彼此不兼容。 例如,Visual Studio 2012 使用的 CRT 库是第 11 版,名为 msvcr110.dll,而 Visual Studio 2013 使用的 CRT 是第 12 版,名为 msvcr120.dll。 从 Visual Studio 2015 开始,不再是这样。 Visual Studio 2015 及更高版本的 Visual Studio 都使用一个通用 CRT(Universal CRT,UCRT),是 Microsoft Windows 操作系统组件。
当vs2015还在CTP阶段时,微软的设想是将VC运行时库拆分成三部分:
- vcruntime140.dll 包含运行期需要处理的功能,如:进程启动、异常处理、以及耦合到相关编译器的功能。
- appcrt140.dll包含所有平台上都可用的所有功能,且以后保持这部分CRT的向后兼容性。包括:堆、数学库、stdio库、locale库、大多数字符串操作函数、时间库和一些其他功能等。
- desktopcrt140.dll包含所有只能由桌面应用程序使用的功能,且以后保持这部分CRT的向后兼容性。包括:处理多字节字符串、exec和spawn进程管理函数、direct-to-console I/O函数的功能等等。
在最终发布正式版的时候,微软将appcrt140.dll和desktopcrt140.dll合并为一个不带版本号的程序库:ucrtbase.dll。它对应的Debug版本的命名是ucrtbased.dll。这个后来被正式命名为“The Universal CRT”。
那么ucrtbase/ucrtbased自然是我们关注的焦点,crt堆句柄自然就在这里面,有一个导出的符号__acrt_heap,就是它
看debug版本,如下:
看Release版本,如下:
来了个这个,难道Release版没有这个符号,输入x ucrtbase!*看看
输入
dd 76ff12dc