eigene DLL und Crash bei Aufruf nur aus einer Sprache

Alles rund um die Programmierung mit Qt
Antworten
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

eigene DLL und Crash bei Aufruf nur aus einer Sprache

Beitrag von Willi2793 »

Hallo,

tue mich etwas schwer das problem in die richtige Forums-Kategorie einzusortieren und erst recht die passende Überschrift zu finden.

Also:

Wir haben ein Fremd-Produkt welches auch Qt verwendet (NCReport) und wollen dies auch in anderen Sprachen als C++ einsetzen. So weit, so gut. Ich habe also eine DLL erstellt die die von uns benötigten Funktionen "wrapped". Das Ganze habe ich dann mit einem reinen C-programm ohne Qt-Umgebung getestet und alles funktionierte ohne Probleme.

Dann habe ich die gleiche DLL (ohne weiteres umwandeln oder testen) versucht aus einem Programm aufzurufen das in einer anderen Sprache (XBase++) geschrieben ist aufzurufen. Im großen und Ganzen klappt das auch. Aber bei einer Funktion crasht es . Und zwar werden in dieser Funktion einige globale Werte für Qt instanziiert. Im speziellen geht es hier um die JavaScript-Unterstützung. Es crasht bei der Zeile:

Code: Alles auswählen

const int intVal = static_cast<int>(d);
im Source: ${QTSOURCE}\3rdparty\javascriptcore\JavaScriptCore\runtime\JSImmediate.h in der Zeile 490. Und zwar hat der Parameter den Wert "nan(0x8000000000000)". Wenn ich das Ganze aus dem C-programm aufrufe hat der Parameter an der Stelle einen Wert von 0+Epsilon (also 0).

Das Ganze mit Qt 4.6.2 commercial unter Win XP Prof SP3.

Ich stehe etwas auf dem Schlauch. Hat da jemand eine Idee oder gar ähnliches schon gehabt?

Grüße,
Willi
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

wenn dir richtig sicher bist, das es diese zeile iss ...
was fuer ein fehler wird geworfen ? bzw was gibt es da, ne exception, ne assertion oder verabschiedet sich dein Program ins nirvana ?

wenn exception,
mach nen try catch block drum, und wert mal den fehler aus !

was fuer ein c/c++ datentyp ist d genau ?
wenn double, dann ist 0x8000000000000 aber definitiv nicht 0 !

Ciao ...
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Vielen Dank für die Hinweise.

Ja, ich bin mir sicher das es dieses Statement ist. Und es ist eine Exception wegen ungültiger Arithmetischer Operation.

"d" ist double und ich weiß das 0x8000000000000000 nicht 0 ist. wenn ich meine DLL von einem C-Programm aufrufe hat "d" den Wert 0. Jedenfalls in ausreichender Genauigkeit. Wieso wird der Wert in einer DLL die nicht kopiert wurde (also exakt dasselbe ist) und an die keine Parameter übergeben werden bei Aufruf aus verschiedenen Sprachen verschieden initialisiert?

Das ganze passiert ja in einer Qt-Quelle.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

wenn ich meine DLL von einem C-Programm aufrufe hat "d" den Wert 0.
wird d irgendwo uebergeben, wer befuellt d ?
kann es sein, das d einfach nicht initialisiert wird ?

und kann sein, dass 0x8000000000000000 genau das minus 0 ist welches es eigentlich nicht geben darf. da kommts wahrscheinlich auf die Flags an, ob da nen fehler generiert wird.

Ciao ...
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Ja, "d" wird übergeben. Aber immer noh innerhalb der QT-Quellen initialisiert. Es ist keine Variable mit der ich in Berührung komme.

Darf ich fragen welche Flags Du da meinst?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Darf ich fragen welche Flags Du da meinst?
Compilerflags ... glaub mal gesehen zu haben das es da was gibt.

neg vorzeichen + 0 beim binaerbruch ist laut spec fuer flieskommazahlen nicht definiert. Man koennt nen fehler generieren, kann es aber auch als 0.0 annehmen ... Sauberer waer aber, wenn die runtime nen fehler bringt.
Aber immer noh innerhalb der QT-Quellen initialisiert.
Welche (globale) double variable wird innerhalb der QT implementation initialisiert ??? bzw welche QT funktion gibt die dir so uninitaialisiert raus ???
Oder meinst du innerhalb eines anderen modules das mit der qt implementiert ist ???

Ciao ...
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Okay, hier nochmal der genaue Wortlaut des Exception-Popups im Debugger:

Code: Alles auswählen

Der Prozess wurde nach Erhalt eines Signals vom Betriebssystem angehalten.

Name des Signals : SIGFPE
Bedeutung :           Arithmetic exception
Der Crash passiert wie gesagt in Zeile 490 von:
${QTSOURCE}\3rdparty\javascriptcore\JavaScriptCore\runtime\JSImmediate.h

der Callstack ist:
Zeile 122: ${QTSOURCE}\3rdparty\javascriptcore\JavaScriptCore\runtime\JSNumberCell.h
Zeile 284: ${QTSOURCE}\3rdparty\javascriptcore\JavaScriptCore\runtime\JSValue.h
Zeile 325: ${QTSOURCE}\3rdparty\javascriptcore\JavaScriptCore\runtime\JSNumberCell.h

Und das NaN ist eine globale Variable wobei diese eben scheinbar unterschiedlich initalisiert wird.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

mit dem java script zeugs kann ich mal gar nix anfangen ....

konzentrieren wir uns mal auf das ominoese d !

wo kommt das her ? wer initialisiert das ....
wenn die frage ned beantworten kannst, koennen wir dir ned helfen.

iss das "d" eine von dir verwendete variable, oder spuckt die dir nur der debugger aus ?

der code
const int intVal = static_cast<int>(d);
iss doch von dir .... ?
wo wird d initialisiert ??? wo wird dem nen wert zugewiesen ?

und ich kann mir scho vorstellen das die JAVA(script) Double (number) Klassen knallen, wenn den nen ungueltiges c-double unterschiebst.

Ciao ...
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Ah, jetzt weiß ich wo das Misverständnis liegt.

Weder die Zeile noch die Variable "d" sind von mir. Das ist alles QT-intern bei den JS-Sachen. Die werden ausgeführt durch das includieren der Includes da das globale Sachen sind.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

ok, dann setz mal nen breakpoint auf
const int intVal = static_cast<int>(d);
und geh im aufrufstack soweit zurueck, bist du in den eigenen code kommst, also das was du geschrieben hasst ....

poste und kommentiere mal die zeile/abschnitt.

kann natuerlich auch sein, das multithreading drinn hasst, dannn wird das alles maechtig komplex.
Ich denk trotzdem dass du irgendwas nicht initialisiert hasst ... bzw falsch aufgerufen ... und das zu son nem fehler kommt.

Ciao ...
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

So, ich habe die fragliche Zeile jetzt mal im Einzelstep durchlaufen. Einmal wenn ich die DLL aus einem C-Programm aufrufe. Dann funktioniert die DLL ja. Dann steht danach in "intVal" -2147483648. Wenn ich die DLL aus XBase++ aufrufe führt dieses Statement zum Abbruch. In beiden Fällen steht in "d" 0x8000000000000000.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

was verwendest du in den schnittstellen zu deiner Dll ? nur standard C ?
die richtigen aufrufkonventionen ?

Ciao..
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Ja. Aber wie gesagt: diese Variable ist nichts mit dem ich jemals in Berührung komme. Das ist alles QT-intern
Antworten