我有一个 MinGW64 编译的 DLL(python 模块),加载时会出错:
ImportError: DLL load failed: Invalid access to memory location
DLL 仅链接到 64 位库(Dependency Walker 证实了这一点)并具有调试符号。代码是相当复杂的 c++11(大约 30 个源文件),我不能一分为二。我已经用 MinGW64 成功地编译和测试了其他模块,工具链工作正常。
网络上的一些人报告了使用 SSE2 指令的代码错误(我的硬件支持这些指令,我没有明确使用它们)或从尚未初始化的全局变量中读取(有一些函数带有__attribute__((constructor))
, 但是根据我所阅读的内容,这些应该在 MinGW64 中工作得很好;更新:我删除了所有构造函数以确保它不是原因 - 它没有区别)。
有什么方法可以分析错误来自哪里?
我尝试了什么:
当我在调试器中加载 DLL 时(ctypes.WinDLL(...)
使用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
(这是我的可执行文件):