如何调试DLL加载失败:对内存位置的无效访问(How to debug DLL load faile

2019-08-02 04:18发布

我有一个MinGW64编译DLL(Python模块),在加载时其给出错误:

ImportError: DLL load failed: Invalid access to memory location

该DLL仅与64位库(依赖沃克确认),并具有调试符号。 该代码是相当复杂的C ++ 11(约30源文件),我不能对分了。 我没有成功编译和测试等模块MinGW64已,工具链工作正常。

在网络上有人报这个错误使用代码SSE2指令(那些支持我的硬件,我没有明确使用它们)或从尚未被初始化全局变量读取(有有一些功能__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 (这是我的可执行文件):

Answer 1:

问题是,蟒蛇编译模块时链接到不同的msvcrt比MinGW的-它是在报道http://bugs.python.org/issue16472 。



Answer 2:

那么,这可能不适合您的解决方案,只是一个提示。 ImportError: DLL load failed: Invalid access to memory location. 32位的Windows:试图使自己的Python扩展用C编程平台时,我遇到了同样的错误。

这是一个真正的痛苦,因为这个错误的互动,以及在非交互模式随机出现在所有的Python环境(Spyder的,笔记本电脑,普通的控制台...)。 我用MinGW和Python的的distutils(命令编译我的代码python setup.py install )。 编译没有给出警告或错误而产生的PYD文件到正确的目录。 但是,试图导入该模块时import example亲我的Python代码它不规则崩溃(通常只有五分之一的尝试导入模块成功)。

奇怪的是,在另一台计算机上工作就好了......好吧,我终于找到了一个解决办法 - 我下载的MinGW的新版本(我使用的是挤满使用Qt SDK发行之前的版本),然后重新编译模块。 然后,它没有更多的崩溃工作。 但是我没有找到任何系统的解决方案或解释。 所以,我可能有一些做的编译器(也许没有它的DLL的?我不知道到底),这是用于生成PYD文件。



Answer 3:

我得到同样的错误,而进口WIN32API,我只是做进口的ctypes之前做进口WIN32API和错误是不存在。



文章来源: How to debug DLL load failed: Invalid access to memory location