Mam MinGW64-skompilowany DLL (moduł Pythona), co daje błąd podczas ładowania:Jak debugować obciążenie DLL nie powiodło się: Nieprawidłowy dostęp do lokalizacji w pamięci
ImportError: DLL load failed: Invalid access to memory location
DLL jest związane wyłącznie z bibliotek 64-bitowych (Dependency Walker to potwierdza) i ma symbole debugowania. Kod jest dość złożony, C++ 11 (około 30 plików źródłowych), nie mogę go przeciąć. Udało mi się już skompilować i przetestować inny moduł z MinGW64, toolchain działa dobrze.
Niektóre osoby w internecie zgłosiły ten błąd w przypadku kodu za pomocą instrukcji SSE2 (są one obsługiwane w mojej hw i nie używam ich wyraźnie) lub odczytu z globalnych zmiennych, które nie zostały jeszcze zainicjowane (jest kilka funkcje z __attribute__((constructor))
, ale te powinny działać w MinGW64 dobrze, zgodnie z tym, co przeczytałem; aktualizacja: Usunąłem wszystkie funkcje konstruktora, aby upewnić się, że nie było to przyczyną - nie ma znaczenia).
Jakie metody analizowania przyczyn powstawania błędu?
Co próbowałem:
Kiedy załadować DLL debugger (używając ctypes.WinDLL(...)
), ja niestety dostać tylko bezsensowny StackTrace z gdb - oczywiście, błąd jest uwięzionych przez ntdll.dll
i sygnał jest podniesiona, ale nie robi daje żadnych dalszych wskazówek co do miejsca, gdzie był błąd z:
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 ??()
ja również powiązane pliki obiekt o „Hello World” wykonywalnego, ale wywala GDB już podczas otwierania pliku z Reading symbols from woomain.exe
(to moja wykonywalny):
Eudoxos, czy próbowałeś linkować do dll naprawdę dynamicznie, tylko w czasie wykonywania? Gra z [LoadLibraryEx] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx) i jego flagami.Twój exe na pewno zacznie od debuggera i nie powiedzie się, zanim 'LoadLibraryEx' zostanie wywołany jawnie. – Jarekczek
@Jarekczek: Ładowanie biblioteki DLL w pythonie jest w pełni dynamiczne (to był pierwszy przypadek). Próbowałem połączyć się bezpośrednio z plikiem '.exe', aby sprawdzić, czy robi różnicę - nie. – eudoxos
Bardzo smutne, gdy błąd zawiesza debager. Opuszcza strumień bez wiosła. Potrzebujesz innego wiosła. –