無效訪問我有一個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
打開文件(這是我的可執行文件)時:
Eudoxos,你是否試圖鏈接到DLL真正動態,只在運行時?使用[LoadLibraryEx](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx)及其標誌。您的exe肯定會從調試器開始,並且不會比'LoadLibraryEx'明確調用失敗。 – Jarekczek
@Jarekczek:在python中加載DLL是完全動態的(這是第一種情況)。我試圖直接鏈接到'.exe'文件,看看它是否有所作爲 - 它不會。 – eudoxos
當一個錯誤崩潰調試器時非常難過。沒有槳讓你離開小溪。你需要一個不同的槳。 –