Wie man debug-DLL load failed: Ungültiger Zugriff auf Speicherbereich

Ich habe eine MinGW64-kompilierte DLL (python-Modul), die gibt Fehler beim beladen:

ImportError: DLL load failed: Invalid access to memory location

Der DLL verknüpft ist nur auf 64bit-Bibliotheken (Dependency Walker bestätigt) und hat die debugging-Symbole. Der code ist Recht Komplex, c++11 (rund 30 Quelle-Dateien), kann ich nicht halbieren Sie. Ich habe erfolgreich kompiliert und getestet anderen Modul mit MinGW64 schon, die toolchain funktioniert.

Einige Leute rund um die web gemeldet, dieser Fehler für den code mit SSE2-Anweisungen (diejenigen unterstützt werden, die auf meiner hw, und ich glaube nicht, verwenden Sie explizit) oder das Lesen von globalen vars, die noch nicht initialisiert wurde (es gibt ein paar Funktionen mit __attribute__((constructor)), aber diese sollte in den MinGW64 ganz gut, nach dem was ich gelesen habe; update: ich entfernte alle Konstruktor-Funktionen, um sicherzustellen, es war nicht die Ursache - es macht keinen Unterschied).

Was wären Methoden um zu analysieren, wo der Fehler herkommt?

, Was ich versucht habe:

Wenn ich laden Sie die DLL im debugger (mit ctypes.WinDLL(...)), den ich leider nur sinnlos stacktrace von gdb - offensichtlich, der Fehler ist gefangen von ntdll.dll - und signal ausgelöst wird, aber es gibt keine weiteren Hinweise, wie und wo der Fehler kam:

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 ?? ()

Ich auch mit dem object-Dateien mit einem "hello world" - executable, aber gdb stürzt bereits beim öffnen der Datei mit Reading symbols from woomain.exe (das ist meine ausführbare Datei):

Wie man debug-DLL load failed: Ungültiger Zugriff auf Speicherbereich

  • Eudoxos, haben Sie versuchen, eine Verknüpfung zu dll wirklich dynamisch erst zur Laufzeit? Spielen mit LoadLibraryEx und Ihre Fahnen. Die exe würde auf jeden Fall starten im debugger und scheitern nicht früher als LoadLibraryEx aufgerufen wird.
  • Das laden der DLL in python ist vollständig dynamisch (das war der erste Fall). Ich habe versucht, die Verknüpfung zu der .exe Datei direkt nur um zu sehen, ob es einen Unterschied macht - tut es aber nicht.
  • Ziemlich traurig, wenn ein Fehler stürzt der debugger. Blättern Sie bis die creek ohne ein Paddel. Benötigen Sie eine andere Paddel.
InformationsquelleAutor eudoxos | 2012-11-01
Schreibe einen Kommentar