2010-06-28 137 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,我認爲它會顯示您加載和卸載事件,並會爲您提供每個事件的堆棧跟蹤。

相關問題