Crash durch code, der nicht verwendet wird
-
Hi,
ich habe hier einen seltsamen Effekt, für den ich keinerlei Erklärung habe - deswegen wäre jeder auch noch so absurde Hinweis oder Tipp willkommen!
Ich habe ein Programm, welches gegen zwei Bibliotheken liba.dll und libb.dll linkt. Wenn ich nur einen Aufruf
liba_init()drin habe, dann funktioniert alles. Ich vermute mal, in diesem Fall wird gar nicht erst gegen die nicht benutze libb.dll gelinkt. Nehme ich jetzt einen Aufruf an die libb.dll hinzu:
liba_init() libb_init()...dann stürzt mir mein Programm an einer ganz anderen Stelle ab - allerding schon im Aufruf von liba_init()! Um das klar zu stellen: liba_init() schmiert ab, wenn libb_init() im Programm vorkommt, aber ohne dass libb_init() zu diesem Zeitpunkt überhaupt schon mal aufgerufen wurde (und dabei hätte Schaden anrichten können).
Das einzige, was mir momentan auffällt, ist die Tatsache, dass libb_init() variable Parameterlisten verwendet:
__declspec(dllexport) unsigned long __cdecl libb_init_if(int *var,...)Die libb.dll wird bereits mit __cdel-Konvention gebaut (auch in den Codesettings des VS). Und: das Problem tritt nur unter Windows auf, unter Linux läuft der gleiche Code komplett problemlos.
Hat jemand einen Tipp oder eine Idee, was das sein könnte?
Danke!
-
- Programm/Libs nicht mit dem gleichen Compiler und den gleichen Flags übersetzt
- Symbole mit gleichem Namen in den Dlls
-
manni66 schrieb:
- Programm/Libs nicht mit dem gleichen Compiler und den gleichen Flags übersetzt
Würde das nicht erst beim Aufruf der libb-Funktionen zu Problemen führen?
manni66 schrieb:
- Symbole mit gleichem Namen in den Dlls
Die Namen passen, in so einem Fall sollte aber auch der Linker warnen bzw. einen Fehler ausgeben?
-
Könnte sein dass die
DllMainFunktion der Library B das Problem verursacht. Die wird nämlich ausgeführt sobald die DLL geladen wird, nicht erst wenn man wirklich ne Funktion aufruft.
Überprüf mal ob die Library B ohne den init Aufruf noch referenziert wird (=> Dependency Walker).Sonst kannst du noch probieren das Linken mit der DLL zu erzwingen ohne dass du die Init-Funktion dann wirklich aufrufst.
Einfache Möglichkeit:if (GetTickCount() == 0) // Wird so-gut-wie nie erfüllt sein libb_init();Wenn das so dann nicht crasht, dann würde ich mal z.B. per Debug-Ausgaben sicherstellen dass der Crash nicht ganz woanders passiert als vermutet (gibt Situationen wo der Callstack im Debugger nicht stimmt, auch wenn das recht selten ist).
-
So, ich habe noch ein paar Infos:
weder liba.dll noch libb.dll verwenden eine DLLMain, daher kann es also nicht kommen. Beide DLLs verwenden intern aber wxWidgets, allerdings mit einem großen Unterschied:
- liba.dll verwendet nur ganz wenige Funktionen von wxWidgets
- libb.dll ist eine ausgewachsene Software, welche wxWidgets intensiv benutztMeine Idee jetzt: eventuell wird da irgendwo ein statisches wxWidgets-Objekt erzeugt, bevor liba.dll oder libb.dll wxwidgets ordnungsgemäß initialisieren könnten. Gefunden jabe ich aber noch keinne Schuldigen dafür

-
Ohne wxwidgets jetzt zu kennen - ist es eventuell ein Problem, wenn wxwidgets 2x initialisiert wird?
-
Zonggg schrieb:
weder liba.dll noch libb.dll verwenden eine DLLMain
Och die haben ziemlich sicher ne
DllMain, bloss halt keine "selbst geschriebene".Weil: Jede DLL die statische Objekte hat welche dynamisch initialisiert werden müssen hat automatisch ne
DllMain.
Und alles wo das nicht zutrifft hat trotzdem immer noch neDllMain, bloss u.U. eine die recht wenig tut