"已卸载"前缀在Windows堆栈跟踪中的含义是什么?

Cha*_*les 2 windows

我有一个地狱般的问题,第三方DLL似乎在卸载时导致递归堆栈溢出崩溃.我最终将这个模式放在堆栈上(使用windbg):

<Unloaded_ThirdParty.dll>+0xdd01
ntdll!ExecuteHandler2+0x26
ntdll!ExecuteHandler+0x24
ntdll!KiUserExceptionDispatcher+0xf
<Unloaded_ThirdParty.dll>+0xdd01
ntdll!ExecuteHandler2+0x26
ntdll!ExecuteHandler+0x24
ntdll!KiUserExceptionDispatcher+0xf
...
Run Code Online (Sandbox Code Playgroud)

正如您所猜测的,我没有ThirdParty.dll的源代码.

问:堆栈转储中的前缀"Unloaded_"是什么意思.我以前没碰过这个.

JSB*_*ոգչ 8

这意味着ThirdParty.dll不再被引用,并且在崩溃发生时已经从内存中删除了.要找出实际的堆栈跟踪,您需要使用以下命令将.dll重新加载到内存中的原始位置:

.reload /f ThirdParty.dll=0xaaaaaaaa
Run Code Online (Sandbox Code Playgroud)

当然,您需要替换0xaaaaaaaa模块的原始基址.这可能有点难以弄清楚模块是否已经卸载,但如果你有一个HMODULE谎言引用dll,那么它的值HMODULE就是基地址.最糟糕的情况是,您可以在代码中添加调试器跟踪语句,以便HMODULE在卸载之前记录dll.