调试 – 如何调试DLL加载失败:对内存位置的无效访问
我有一个MinGW64编译的DLL(
python模块),加载时出错:
ImportError: DLL load failed: Invalid access to memory location DLL仅链接到64位库(Dependency Walker确认)并具有调试符号.代码相当复杂c 11(大约30个源文件),我不能将它平分.我已经用MinGW64成功编译和测试了其他模块,工具链工作正常. 网络上的一些人报告了使用SSE2指令的代码的错误(我的hw支持的那些,我没有明确地使用它们)或者从尚未初始化的全局变量中读取(有一些带__attribute的函数__( (构造函数)),但那些应该在MinGW64中工作得很好,根据我读过的内容;更新:我删除了所有构造函数以确保它不是原因 – 它没有区别). 分析错误来自何处的方法是什么? 我尝试了什么: 当我在调试器中加载DLL时(使用ctypes.WinDLL(…)),我很遗憾地从gdb中获得了无意义的堆栈跟踪 – 显然,错误被ntdll.dll捕获并且信号被引发,但是它没有给出任何进一步的信息.提示错误的来源: Program received signal SIGTRAP,Trace/breakpoint trap. 0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16 () from C:Windowssystem32ntdll.dll (gdb) warning: HEAP[python.exe]: warning: Invalid address specified to RtlSizeHeap( 00000000003B0000,0000000002306830 ) (gdb) bt #0 0x0000000077c23522 in ntdll!ExpInterlockedPopEntrySListFault16 () from C:Windowssystem32ntdll.dll #1 0x0000000077c0c241 in ntdll!RtlZeroHeap () from C:Windowssystem32ntdll.dll #2 0x0000000077c0c250 in ntdll!RtlZeroHeap () from C:Windowssystem32ntdll.dll #3 0x0000000077c3c130 in ntdll!LdrLoadAlternateResourceModuleEx () from C:Windowssystem32ntdll.dll #4 0x00000000003b0000 in ?? () #5 0x0000000002306830 in ?? () #6 0x00000000003b0000 in ?? () #7 0x00000000792e21c0 in ?? () #8 0x00000000003b0000 in ?? () #9 0x0000000077c3c0ba in ntdll!LdrLoadAlternateResourceModuleEx () from C:Windowssystem32ntdll.dll #10 0xffffffffffffffff in ?? () #11 0x0000000050000061 in ?? () #12 0x0000000000000000 in ?? () 我还将目标文件与“hello world”可执行文件链接起来,但是当使用来自woomain.exe的读取符号(这是我的可执行文件)打开文件时,gdb已经崩溃了: 解决方法
问题是python在编译模块时链接到不同的msvcrt而不是MinGW – 它在
http://bugs.python.org/issue16472报告.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何从Win32中的func ptr获取Module HANDLE?
- 使用IIS 7.5和Windows 7安装DotNetNuke 5.6.3时出
- active-directory – Import-Module:未加载指定
- 如何在.NET Core类库中使用System.Windows.Forms
- windows 安装 MySQL
- .net – 如何从VBScript调用Windows服务的方法?
- xaml – Xamarin在按钮内部形成子控件
- windows-service – 无法使用sc命令删除现有服务
- iis – Azure VM:无法访问/ ping端口80
- .net-4.0 – 使用CurrentDomain.SetData(“APP_C