2011-11-25 45 views
2

我的應用程序中出現間歇性崩潰的情況,我們使用延遲加載DLL。有幾個不同的調用堆棧,我們已經看到了崩潰,但在__delayLoadHelper2中調用0xC06D007E: Module not found時總是崩潰。延遲加載DLL:當應用程序啓動多次時出現「異常0xC06D007E:模塊未找到」

當連續多次調用進程(串聯)時引發異常。這裏是一個示例調用堆棧:

KERNELBASE.dll!RaiseException() + 0x3d bytes 
MYDLL.dll!__delayLoadHelper2(const ImgDelayDescr * pidd=0x000000000012f650, __int64 (void)* * ppfnIATEntry=0x000000000012f570) Line 331 C++ 
MYDLL.dll!__tailMerge_MyDelayLoadDLL_dll() + 0x3f bytes Unknown 
MYDLL.dll!MyUserFunction() Line 91 + 0x5 bytes C++ 

C++應用程序正在使用延遲加載DLL來加載.NET代碼。

發生崩潰的計算機是功能非常強大的機器(12核CPU,48 gig ram),我不確定它是否對它有影響。但是,由於崩潰並非一直髮生,它看起來像是一種競爭狀態或資源問題。

本次論壇主題介紹了我的情況,但目前還沒有解決 http://social.msdn.microsoft.com/Forums/en/clr/thread/9f00bdf0-3ea7-4a1f-b5a7-9b5bbc009888

任何想法,這可能是爲什麼發生?

回答

0

我的應用程序中有同樣的崩潰,並且callstack也完全一樣。 但是,我的崩潰是不同的,原生DLL有延遲加載依賴於另一個本地DLL。

我永遠不會延遲加載.NET程序集。 .NET程序集應該使用託管程序集加載器函數進行加載。它們也不應該通過在它們上調用LoadLibrary來加載。最後,我不確定是什麼導致了崩潰,但是我會爲.NET程序集徹底刪除延遲加載。

0

當我嘗試在另一臺機器上運行我的程序的調試版本時,出現此問題,該機器沒有該機器上的Visual Studio C++運行時的調試版本。 (調試dll通常命名有點不同,在程序集名稱的某處有一個額外的「D」)

我的程序的發佈配置工作正常,因爲我有可再發行的VS C++運行時。

爲了完整起見,我將這個問題的明顯答案,但我真誠地不意味着它似乎居高臨下......模塊加載程序無法找到它依賴的模塊!我越解決這樣的問題,我告訴自己越來越多,以「相信錯誤信息」

依賴性沃克(depends.exe)應該是你的朋友在這種情況下,雖然我不能有信心地說如何處理延遲加載的模塊。

相關問題