[gelöst, die 2.] Seltsame Probleme mit DLL
Verfasst: 5. Februar 2010 15:37
Hallo Leute,
Ich habe ein sehr seltsames Problem mit meiner DLL. Ich bin mittlerweile völlig verzweifelt und hoffe mir kann jemand helfen. Leider muss ich dafür etwas weiter ausholen...
Ich habe meine Matrizen-DLL endlich schön erstellen können und sie wurde auch geladen. Die ersten Tests verliefen anstandslos. Anfangs hab ich meine Matrix einfach als Wert übergeben, danach wollte ich einen Pointer darauf zurückgeben, um mir das ständige Kopieren zu ersparen. Die Daten für die Matrix kommen aus einer Datenbankklasse, die während der gesamten Programmlaufzeit existiert. Darin hab ich einen Matrixpointer, der beim Lesen von der Datenbank entsprechend der Anzahl der Daten mittels new() ein Matrixobjekt zugewiesen bekommt. In das Objekt schreibe ich meine Daten und gebe schließlich den Pointer auf die Matrix zurück.
Mein Problem ist, dass jeder Zugriff auf die Matrix über den zurück gegebenen Pointer zum Programmabsturz führt. Wenn ich das Programm normal starte (aus dem QtCreator) dann wird mir ein Fehlerdialog von Windows gezeigt (bei der Stelle mit dem Zugriff auf die Matrix über den Pointer). Anschließend kann ich die Stelle mit dem VisualStudio-Debugger im Disassembly ansehen. Als Fehlermeldung bekomme ich: "Zugriffsverletzung beim Lesen an Position 0xffffffff." Das Disassembly bleibt bei einem Zugriff auf die SSE-Register stehen.
Wenn ich das Programm aus dem QtCreator mittels des Buttons "Debug" starte, hängt sich das Programm ebenfalls bei dem ersten SSE-Befehl auf, was sich mit dem Disassembly aus dem VS deckt.
So nun zu den seltsamen Sachen: Im QtCreator-Debugger ist das Objekt auf das in den SSE-Intrinsics zugegriffen wird vorhanden! Die Pointer darauf sind richtig (habe die Adresse der Matrix aus der Datenbankverbindung verglichen) und die Objekte enthalten die richtigen Member. Trotzdem bleibt er beim ersten Zugriff auf das Quellobjekt (bei Kopierkonstruktoren bspw. aber auch bei anderen Operationen) in der entsprechenden Zeile stehen. Der SSE-Intrinsic-Code wird aber noch ausgeführt (zumindest der Teil in emmintrin.h).
Der Speicher ist aber aligned.
Die gesamte Matrixklasse und die dazugehörige Vektorklasse wurden ausgiebig mittels QtTest getestet. Sowohl als Dll als auch mit reinkompiliert und haben funktioniert.
Kompiliere ich mein Programm und die Bibliothek im Release-Modus tritt der Fehler ebenfalls nicht auf. Und wenn ich das Programm unter Linux kompiliere und starte kommt es ebenfalls nicht zu einem Fehler. Somit sind (einfache) Programmierfehler schon mal ausgeschlossen und ich tippe auf einen Zusammenhang zwischen Windows und dem Erzeugen der Library / Linken.
Hat irgendjemand eine Idee, wodurch dieses seltsame Verhalten hervorgerufen wird? Selbst wenn ich die Matrixklasse mit in das Programm kompiliere, statt es zu linken?
Ein Freund von mir, der hauptsächlich C# programmiert, meint, dass Windows öfter mal Sachen im Speicher verschiebt. Ich kann mir vorstellen, dass sowas zu dem oben beschriebenen Phänomen führt. Bin mir aber nicht sicher, ob das auf Qt-Programme zutrifft und wie man dieses Verschieben verhindert. In C# gibts dafür den "fixed" Befehl, aber sowas gibt es ja nicht unter MinGW.
Bin für jede Idee dankbar, da ich mittlerweile echt am Verzweifeln bin.
Grüße,
Kay
Ich habe ein sehr seltsames Problem mit meiner DLL. Ich bin mittlerweile völlig verzweifelt und hoffe mir kann jemand helfen. Leider muss ich dafür etwas weiter ausholen...
Ich habe meine Matrizen-DLL endlich schön erstellen können und sie wurde auch geladen. Die ersten Tests verliefen anstandslos. Anfangs hab ich meine Matrix einfach als Wert übergeben, danach wollte ich einen Pointer darauf zurückgeben, um mir das ständige Kopieren zu ersparen. Die Daten für die Matrix kommen aus einer Datenbankklasse, die während der gesamten Programmlaufzeit existiert. Darin hab ich einen Matrixpointer, der beim Lesen von der Datenbank entsprechend der Anzahl der Daten mittels new() ein Matrixobjekt zugewiesen bekommt. In das Objekt schreibe ich meine Daten und gebe schließlich den Pointer auf die Matrix zurück.
Mein Problem ist, dass jeder Zugriff auf die Matrix über den zurück gegebenen Pointer zum Programmabsturz führt. Wenn ich das Programm normal starte (aus dem QtCreator) dann wird mir ein Fehlerdialog von Windows gezeigt (bei der Stelle mit dem Zugriff auf die Matrix über den Pointer). Anschließend kann ich die Stelle mit dem VisualStudio-Debugger im Disassembly ansehen. Als Fehlermeldung bekomme ich: "Zugriffsverletzung beim Lesen an Position 0xffffffff." Das Disassembly bleibt bei einem Zugriff auf die SSE-Register stehen.
Wenn ich das Programm aus dem QtCreator mittels des Buttons "Debug" starte, hängt sich das Programm ebenfalls bei dem ersten SSE-Befehl auf, was sich mit dem Disassembly aus dem VS deckt.
So nun zu den seltsamen Sachen: Im QtCreator-Debugger ist das Objekt auf das in den SSE-Intrinsics zugegriffen wird vorhanden! Die Pointer darauf sind richtig (habe die Adresse der Matrix aus der Datenbankverbindung verglichen) und die Objekte enthalten die richtigen Member. Trotzdem bleibt er beim ersten Zugriff auf das Quellobjekt (bei Kopierkonstruktoren bspw. aber auch bei anderen Operationen) in der entsprechenden Zeile stehen. Der SSE-Intrinsic-Code wird aber noch ausgeführt (zumindest der Teil in emmintrin.h).
Der Speicher ist aber aligned.
Die gesamte Matrixklasse und die dazugehörige Vektorklasse wurden ausgiebig mittels QtTest getestet. Sowohl als Dll als auch mit reinkompiliert und haben funktioniert.
Kompiliere ich mein Programm und die Bibliothek im Release-Modus tritt der Fehler ebenfalls nicht auf. Und wenn ich das Programm unter Linux kompiliere und starte kommt es ebenfalls nicht zu einem Fehler. Somit sind (einfache) Programmierfehler schon mal ausgeschlossen und ich tippe auf einen Zusammenhang zwischen Windows und dem Erzeugen der Library / Linken.
Hat irgendjemand eine Idee, wodurch dieses seltsame Verhalten hervorgerufen wird? Selbst wenn ich die Matrixklasse mit in das Programm kompiliere, statt es zu linken?
Ein Freund von mir, der hauptsächlich C# programmiert, meint, dass Windows öfter mal Sachen im Speicher verschiebt. Ich kann mir vorstellen, dass sowas zu dem oben beschriebenen Phänomen führt. Bin mir aber nicht sicher, ob das auf Qt-Programme zutrifft und wie man dieses Verschieben verhindert. In C# gibts dafür den "fixed" Befehl, aber sowas gibt es ja nicht unter MinGW.
Bin für jede Idee dankbar, da ich mittlerweile echt am Verzweifeln bin.
Grüße,
Kay