Programm läuft in VisualStudio, in Release aber nicht



  • Hallo liebe C++ Gemeinde,
    ich habe ein unfertiges C++-Programm vor die Nase gesetzt bekommen.
    Das Programm verwendet für die Oberfläche den "QT Creator", Glee-Libraries für OpenGL und 2 zusätzliche programmspezifische Libraries.

    Das Problem ist nun, dass das Programm sowohl im Release als auch im Debugmode von Visual Studio 2008 kompiliert und wenn direkt aus Visual Studio geöffnet wird, auch funktioniert.

    Wenn ich aber nun die .exe Version aus dem Releaseordner verwende, wird diese zwar noch gestartet, wenn ich dann aber eine gewisse Funktion starten will, stürzt das Programm mit folgender Fehlermeldung ab:

    "Runtime Error!
    This application has requested the Runtime to terminate it in an unusual way."

    Ich bin selber noch ein sehr unerfahrener Programmierer (habe nur die Grundlegende Ausbildung hinter mir und kann mit den Konzepten umgehen) und habe vorallem noch nie vorher mit Visual Studio gearbeitet. Trotzdem soll ich mich nun mit diesem Problem beschäftigen, ich wurde quasi ins kalte Wasser geschmissen.

    Meine Frage an euch:
    Welche typischen Fehlerquellen lösen diesen Fehler aus?
    Was kann ich überprüfen und wie sollte ich dabei vorgehen?

    Meine Vermutung ist, dass die wichtigen .dlls nicht in das Release-Verzeichnis gepackt werden und das Programm, beim Versuch diese zu laden, abstürzt.
    Anders kann ich mir nicht erklären, wieso es in Visual Studio funktioniert, außerhalb davon aber nicht.

    Ich bedanke mich schon mal für hoffentlich kommende Antworten.



  • den codepfad, der beim ausführen der fehlerhaften funktion zum absturz führt, mit logausgaben versehen. zuerst ganz grob, dann je nach ergebnis immer feiner. damit tastest du dich stück für stück ran, bis du den fehler eingegrenzt hast.



  • Tritt das Problem auch mit der Debug-Version auf? (Außerhalb des Studios)
    Tritt es auch auf, wenn du das Programm startest, dann aus dem Studio heraus den Debugger attachst und die fragliche Funktion ausführst?



  • Bashar schrieb:

    Tritt das Problem auch mit der Debug-Version auf? (Außerhalb des Studios)
    Tritt es auch auf, wenn du das Programm startest, dann aus dem Studio heraus den Debugger attachst und die fragliche Funktion ausführst?

    Hallo,
    zu 1. das Problem tritt sowohl in der Debug als auch in der Release Version außerhalb des Studios auf.
    siehe Edit2: Im Debugmode startet das Programm gar nicht und stürzt instantan ab.

    zu 2. Mir war nicht bewusst, dass dies funktioniert. Ich mache mich mal schlau und versuche dies dann.

    Edit:
    Ich nehme an, dass ich dies befolgen muss:
    http://msdn.microsoft.com/en-us/library/c6wf8e4z.aspx
    1
    Edit2:
    Ich war bei Frage 1 etwas voreilig. Das Programm stürtzt im Debugmode (außerhalb vom Studio) sofort ab. Man kann keine Funktionen nutzen, die im Releasemode noch ausführbar sind.

    Edit3:
    Habe mal im Releasemode den Debugger aus dem Studio geladen, Programm ist beim Aufruf der Funktion, mit dieser Fehlermeldung abgestürzt:

    "First-chance exception at 0x74b5b9bc in Viewer.exe: Microsoft C++ exception: cv::Exception at memory location 0x0053c52c.."



  • Phys1k3r schrieb:

    "First-chance exception at 0x74b5b9bc in Viewer.exe: Microsoft C++ exception: cv::Exception at memory location 0x0053c52c.."

    Das ist erstmal kein Absturz, das kann auch im normalen Ablauf vorkommen. Wenn du die Exception allerdings nicht fängst, ists aus für dein Programm.
    Schau mal, wo eine cv::Exception geworfen werden könnte (ist der namespace cv einer von euch oder gehört der zu einer der Libs?) und fang an den Modulgrenzen alle möglichen Exceptions, z.B. um die main-Funktion.



  • pumuckl schrieb:

    Phys1k3r schrieb:

    "First-chance exception at 0x74b5b9bc in Viewer.exe: Microsoft C++ exception: cv::Exception at memory location 0x0053c52c.."

    Das ist erstmal kein Absturz, das kann auch im normalen Ablauf vorkommen. Wenn du die Exception allerdings nicht fängst, ists aus für dein Programm.
    Schau mal, wo eine cv::Exception geworfen werden könnte (ist der namespace cv einer von euch oder gehört der zu einer der Libs?) und fang an den Modulgrenzen alle möglichen Exceptions, z.B. um die main-Funktion.

    Der namespace cv kommt von openCV:
    http://en.wikipedia.org/wiki/OpenCV

    Wir nutzen dies, um mit einer Kamera Gesichtsbewegungen zu tracken.



  • Das bedeutet, dass ihr an irgendeiner Stelle openCV-Funktionen benutzt, ohne Exceptions zu fangen, die dort geschmissen werden können.
    Ihr habt ja sicherlich sauber gearbeitet und die Funktionsaufrufe schön weggekapselt, also sollte es nicht allzu viel Mühe bereiten, die wenigen Ecken zu finden, wo ihr openCV einsetzt 😉



  • Hallo,
    schonmal danke für eure Antworten.

    Mit Standardausgaben habe ich mich in der Releasemethode bis zur Fehlermeldung durchgekämpft.

    Es ist folgende Zeile:

    CvSeq *faces = cvHaarDetectObjects( img, cascade_f, storage, 1.1, 3, 0 /*CV_HAAR_DO_CANNY_PRUNNING*/, cvSize( 40, 40 ) );
    

    Die Funktion cvHaarDetectObjects ist eine Funktion die in der Headerdatei ch.h von OpenCV liegt. hn
    Wenn ich diese Exception abfange, läuft das Programm weiter, aber verliert damit natürlich auch seinen Zweck, da es seiner wichtigsten Funktion beraubt wird.

    Im VisualStudio funktioniert dieser Aufruf noch, in der Releaseversion von außen nicht mehr.

    Da ich mich mit den Einbinden von externen Libraries und Funktionen noch gar nicht auskenne, kann ich aus dieser Information auch nichts ableiten.



  • Phys1k3r schrieb:

    Wenn ich diese Exception abfange, läuft das Programm weiter, aber verliert damit natürlich auch seinen Zweck, da es seiner wichtigsten Funktion beraubt wird.

    Das klingt jetzt so, als ob die Funktion verloren geht, weil du die Exception abfängst. Dem ist natürlich nicht so. Die Exception fliegt, weil die Funktion irgendetwas nicht so vorfindet wie sie es zum Funktionieren braucht. Du solltest daher die Exception auf jeden Fall fangen und den Text so weiterreichen, dass ein Anwender ihn auch verstehen kann.
    Was der Funktion jetzt nicht schmeckt, ist ein openCV-Problem, da kann man dir hier nicht gut weiterhelfen. Die Dokumentation der Funktion sollte da etwas zu sagen können, vor allem wenn du dir die Informationen der cv::Exception ausgeben lässt (wie du daran kommst steht auch in der openCV Dokumenation)


Anmelden zum Antworten