2012-10-02 2 views
8

ich zur Zeit von einigen seltsamen Ausnahmen leiden werde, dass die meisten wahrscheinlich sind wegen mir, während mit OpenCV der Interaktion etwas falsch zu tun: Ich habe bereits aktivierte das Thrown Feld im Debug -> Exceptions MenüWie finde ich heraus, was "cv :: Exception at memory location" verursacht?

First-chance exception at 0x7580b9bc in xxx.exe: Microsoft C++ exception: cv::Exception at memory location 0x00c1c624..

, aber ich kann wirklich nicht herausfinden, wo in meinem Code die Ausnahme geworfen wird.

Wie kann ich dies debuggen?

EDIT der Stapelrahmen wie folgt liest (meine App wird nicht einmal in der Liste auftauchen!):

  • KernelBase.dll 7580b8bc()
  • [Frames unten sein kann! falsche oder fehlende]
  • KernelBase.dll! 7580b8bc()
  • opencv_core242d.dll! 54eb60cc()
+0

Haben Sie mit einem Debugger einsteigen und gesehen, welche Zeile die Ausnahme verursacht? –

+0

@TonyTheLion Ich würde das gerne machen, aber leider weiß ich nicht einmal wo in meinem Code die Ausnahme geworfen wird. Alles, was ich sehen kann, ist die Demontage. – memyself

+0

Beendet die Ausnahme Ihr Programm tatsächlich oder wird es behandelt? – Benj

Antwort

10

Sie könnten Ihren gesamten main in einen try catch-Block schreiben, der die Ausnahmedetails ausgibt. Wenn die offene API CV Ausnahmen auslösen können, müssen Sie über den Umgang mit ihnen sowieso als Teil Ihres Entwurfs denken:

try 
{ 
    // ... Contents of your main 
} 
catch (cv::Exception & e) 
{ 
cerr << e.msg << endl; // output exception message 
} 
+2

das ist ein Anfang! Ich musste 'e.what()' anstelle von 'e.msg()' verwenden. Jetzt bekomme ich zumindest den opencv Fehler, aber ich weiß immer noch nicht wo in meinem Programm dieser Fehler verursacht wird. Gibt es eine Möglichkeit, es herauszufinden? – memyself

+0

@memyself Sie sollten das herausfinden können, indem Sie im Debugger durchgehen, bis Sie plötzlich im catch-Block landen. Wenn das passiert, schauen Sie sich die letzte offene CV-Funktion an, die von Ihrem Code aufgerufen wurde. – Benj

+0

das Problem ist, dass das Programm zufällig auftritt, und nur wenn der Benutzer etwas mit der Maus macht. Es ist ziemlich aufwendig, bis der Fehler auftritt. Ich dachte, dass es eine Möglichkeit geben sollte, mir die Zeilennummer zu geben, sobald der Debugger im 'catch' Block ist - oder ist das nicht möglich? – memyself

2

Ive got dieses Problem durch OpenCV mit Webcam. Das Problem in meinem Fall ist, dass das Programm versucht, ein Bild zu lesen, wenn die Cam nicht initialisiert wurde.

meine Fehlercode:

// open camera 
capture.open(0); 
while (1){ 
    //store image to matrix // here is the bug 
    capture.read(cameraFeed); 

Die Lösung

// open camera 
capture.open(0); 
while (1){ 

    //this line makes the program wait for an image 
    while (!capture.read(cameraFeed)); 

    //store image to matrix 
    capture.read(cameraFeed); 

(traurig über mein Englisch) Dank

1

OpenCV hat diese praktische Funktion cv::setBreakOnError

Wenn Sie angerufen setzen das Folgende in Deinem Haupt vor allem opencv Anrufe:

cv::setBreakOnError(true); 

dann Ihr Programm abstürzen, weil OpenCV wird eine ungültige Operation tun (dereferencing einen Null-Zeiger), kurz bevor es cv :: Exception normalerweise werfen würde. Wenn Sie Ihren Code in einem Debugger ausführen, wird er bei dieser unzulässigen Operation angehalten, und Sie können den gesamten Aufruf-Stack mit all Ihren Codes und Variablen zum Zeitpunkt des Fehlers sehen.

Verwandte Themen