2012-11-01 62 views
5

無效訪問我有一個MinGW64編譯的DLL(Python模塊),加載時提示錯誤:如何調試DLL加載失敗:對內存位置

ImportError: DLL load failed: Invalid access to memory location 

DLL將只與64位庫(依賴沃克證實)並且有調試符號。代碼是相當複雜的c + + 11(約30個源文件),我不能把它分開。我已經用MinGW64成功編譯並測試了其他模塊,工具鏈運行良好。

網絡上的一些人使用SSE2指令(我的hw支持這些指令,並且我沒有明確使用它們)或者從尚未初始化的全局變量中讀取代碼來報告此錯誤(有幾個功能與__attribute__((constructor)),但這些應該在MinGW64工作很好,根據我讀過的; 更新:我刪除了所有的構造函數,以確保它不是原因 - 它沒有區別)。

什麼是分析錯誤來自哪裏的方法?

我的嘗試:

當我加載在調試器中的DLL(使用ctypes.WinDLL(...)),我遺憾的是隻得到從gdb的意義堆棧跟蹤 - 顯然,錯誤是由ntdll.dll和信號被困升高,但它不給出任何進一步的提示到哪裏來自的錯誤:

Program received signal SIGTRAP, Trace/breakpoint trap. 
0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16() 
    from C:\Windows\system32\ntdll.dll 
(gdb) warning: HEAP[python.exe]: 
warning: Invalid address specified to RtlSizeHeap(00000000003B0000, 0000000002306830) 


(gdb) bt 
#0 0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16() 
    from C:\Windows\system32\ntdll.dll 
#1 0x0000000077c0c241 in ntdll!RtlZeroHeap() 
    from C:\Windows\system32\ntdll.dll 
#2 0x0000000077c0c250 in ntdll!RtlZeroHeap() 
    from C:\Windows\system32\ntdll.dll 
#3 0x0000000077c3c130 in ntdll!LdrLoadAlternateResourceModuleEx() 
    from C:\Windows\system32\ntdll.dll 
#4 0x00000000003b0000 in ??() 
#5 0x0000000002306830 in ??() 
#6 0x00000000003b0000 in ??() 
#7 0x00000000792e21c0 in ??() 
#8 0x00000000003b0000 in ??() 
#9 0x0000000077c3c0ba in ntdll!LdrLoadAlternateResourceModuleEx() 
    from C:\Windows\system32\ntdll.dll 
#10 0xffffffffffffffff in ??() 
#11 0x0000000050000061 in ??() 
#12 0x0000000000000000 in ??() 

我還掛有一個「Hello World」的可執行的目標文件,但gdb的崩潰已經與Reading symbols from woomain.exe打開文件(這是我的可執行文件)時:

gdb crash dialogue

+0

Eudoxos,你是否試圖鏈接到DLL真正動態,只在運行時?使用[LoadLibraryEx](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx)及其標誌。您的exe肯定會從調試器開始,並且不會比'LoadLibraryEx'明確調用失敗。 – Jarekczek

+0

@Jarekczek:在python中加載DLL是完全動態的(這是第一種情況)。我試圖直接鏈接到'.exe'文件,看看它是否有所作爲 - 它不會。 – eudoxos

+0

當一個錯誤崩潰調試器時非常難過。沒有槳讓你離開小溪。你需要一個不同的槳。 –

回答

0

那麼,這可能不是您正確的解決方案,只是一個提示。 ImportError: DLL load failed: Invalid access to memory location.當我嘗試使用C編寫自己的Python擴展程序時遇到了同樣的錯誤。平臺:Windows 32位。

這是一個真正的痛苦,因爲這個錯誤在所有Python環境(Spyder,Notebook,純控制檯...)中以交互式以及非交互式模式隨機出現。我使用MinGW和Python的distutils(命令python setup.py install)編譯我的代碼。編譯沒有給出警告或錯誤,並生成pyd文件到正確的目錄。但是當試圖導入這個模塊import example贊成我的Python代碼它不規則地崩潰(通常只有五次嘗試導入模塊成功)。

奇怪的是,在另一臺電腦上它工作得很好......嗯,我終於找到了一個解決方法 - 我下載了一個較新版本的MinGW(在我使用Qt SDK發行版中包裝的版本之前)模塊。然後它不再發生崩潰。但是我沒有找到任何系統的解決方案或解釋。所以我可能與編譯器有關(可能缺少它的DLL?我不知道)是用來生成pyd文件的。

+0

嘿,對不起,我發現與dfiferent運行時鏈接的問題後沒有回覆。我把鏈接放到了我在下面的答案中提到的python問題。我在使用msvc *的distutils中手動進行了更改,併爲我解決了這個問題。 – eudoxos

0

我得到同樣的錯誤,而進口win32api,我只是在導入win32api之前導入ctypes和錯誤不存在。