5

我有一个 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(这是我的可执行文件):

gdb 崩溃对话

4

4 回答 4

6

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

于 2013-10-07T10:45:14.083 回答
0

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

这是一个真正的痛苦,因为在所有 Python 环境(Spyder、Notebook、普通控制台......)中,这个错误随机出现在交互模式和非交互模式中。我使用 MinGW 和 Python 的 distutils (command) 编译了我的代码python setup.py install。编译没有给出警告或错误,并将 pyd 文件生成到正确的目录。但是,当我尝试导入这个模块import examplepro 时,我的 Python 代码不规则地崩溃了(通常只有五分之一的导入模块尝试成功)。

奇怪的是,在另一台计算机上它工作得很好......好吧,我终于找到了一个解决方法 - 我下载了一个更新版本的 MinGW(在我使用 Qt SDK 分发包中的版本之前)并再次编译了模块。然后它不再崩溃。但是我没有找到任何系统的解决方案或解释。所以我可能与用于生成 pyd 文件的编译器有关(可能没有它的 DLL?我不知道确切)。

于 2013-10-07T07:10:27.057 回答
0

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

于 2016-05-08T04:37:27.723 回答
0

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

from .cv2 import *

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

解决方案:为此,我刚刚卸载了 opencv 模块并重新安装了它。

卸载:

pip uninstall opencv-python

安装:

pip install opencv-python

现在它对我有用。

于 2020-11-26T06:41:49.003 回答