如何调试DLL加载失败:对内存位置的无效访问

eud*_*xos 5 debugging dll mingw mingw-w64

我有一个MinGW64编译的DLL(python模块),加载时出错:

ImportError: DLL load failed: Invalid access to memory location
Run Code Online (Sandbox Code Playgroud)

DLL仅链接到64位库(Dependency Walker确认)并具有调试符号.代码是相当复杂的c ++ 11(大约30个源文件),我不能将它平分.我已经用MinGW64成功编译和测试了其他模块,工具链工作正常.

网络上的一些人报告了使用SSE2指令的代码的错误(我的hw支持的那些,我没有明确地使用它们)或从尚未初始化的全局变量中读取(有一些函数__attribute__((constructor)),但是根据我读过的内容,那些应该在MinGW64中运行得很好; 更新:我删除了所有构造函数以确保它不是原因 - 它没有区别).

分析错误来自何处的方法是什么?

我尝试了什么:

当我在调试器(使用ctypes.WinDLL(...))中加载DLL时,遗憾的是,我从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 ?? ()
Run Code Online (Sandbox Code Playgroud)

我还将目标文件与"hello world"可执行文件链接起来,但是在打开文件时gdb崩溃了Reading symbols from woomain.exe(这是我的可执行文件):

gdb崩溃对话

eud*_*xos 6

问题是python在编译模块时链接到不同的msvcrt而不是MinGW - 它在http://bugs.python.org/issue16472上报告.