2010-06-28 141 views
2

我有一个第三方DLL出现导致递归堆栈溢出崩溃,当它被卸载的地狱问题。我风与堆栈上的这种模式(使用WinDbg的):在Windows堆栈跟踪中,“Unloaded”前缀是什么意思?

<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 
... 

如你所猜,我没有源代码ThirdParty.dll。

问:什么前缀“Unloaded_”指的是在堆栈转储。我之前没有碰到过这个。

回答

8

这意味着ThirdParty.dll不再被引用,已经从内存在发生崩溃的时间删除。要了解实际的堆栈跟踪,你需要在它原来的地方用下面的命令来重新加载.dll文件存储:

.reload /f ThirdParty.dll=0xaaaaaaaa 

当然,你需要与模块的初始基址,以取代0xaaaaaaaa。如果模块已经被卸载,这可能有点难以确定,但是如果你有一个指向dll的HMODULE,那么HMODULE的值就是基地址。最糟糕的情况是,你可以在你的代码中添加一个调试器跟踪语句,在你卸载它之前记录dll的HMODULE

1

我以前没有崩溃就这样,和JS指出,这意味着该DLL已崩溃前卸载。但是,将堆栈跟踪到该dll中可能不一定会为您提供诊断问题所需的信息。

的东西在你的代码正在卸载库,因为它认为它的完成它,但你仍然有它的指针(或在其内部的函数)的地方。我的猜测会是一个回调,也许来自另一个线程。我建议通过您的来源搜索任何对FreeLibrary()的调用,并在FreeLibrary符号上设置断点。找出库的卸载位置,然后确保所有引用dll的数据都已被重置。如果您有多个线程,请使用互斥锁。

一个可能对此非常有用的工具是优秀的Process Monitor,我认为它会显示您加载和卸载事件,并会为您提供每个事件的堆栈跟踪。

相关问题