debugging - 如何调试 DLL 加载失败 : Invalid access to memory location

标签 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 指令的代码错误(我的硬件支持这些指令,我没有明确使用它们)或从尚未初始化的全局变量读取(有一些函数 __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

最佳答案

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

关于debugging - 如何调试 DLL 加载失败 : Invalid access to memory location,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13173944/

相关文章:

r - 使用 `subset` 函数按列名进行矩阵子集化

c++ - 由于 sizeof() 无法输出 int

javascript - 寻找 javascript 中的瓶颈?

python - 有没有办法调试在 `multiprocessing.Process` 上运行的 Python 代码?

java - 在 IntelliJ IDEA 中调试 JDT Core BatchCompiler

java - Hello.dll 丢失

c# - 从 C# 线程调用非托管代码

c# - 在 C# 中公开 DLL 的方法

c++ - MinGW 和 std::thread

c++ - 交叉编译qt(linux/mingw -> windows): various undefined references