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

时间:2012-11-01 09:12:12

标签: debugging dll mingw mingw-w64

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

ImportError: DLL load failed: Invalid access to memory location

DLL仅链接到64位库(Dependency Walker确认)并具有调试符号。代码是相当复杂的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”可执行文件链接起来,但是当用Reading symbols from woomain.exe打开文件时,gdb已经崩溃了(这是我的可执行文件):

gdb crash dialogue

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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文件。

答案 2 :(得分:0)

我在导入win32api时遇到同样的错误,我只是在导入win32api之前导入了ctypes并且错误不存在。

答案 3 :(得分:0)

对我来说,我在opencv2上遇到这样的错误:

from .cv2 import *

ImportError: DLL load failed: Invalid access to memory location.

解决方案: 为此,我只是卸载了opencv模块,然后再次将其重新安装。

卸载:

pip uninstall opencv-python

安装:

pip install opencv-python

现在它对我有用。