2012-10-02 12 views
8

私は現在のOpenCVとの対話中に、誤って何かをして、おそらく私のためにされているいくつかの奇妙な例外に苦しんだ:"cv :: Exception in memory location"の原因を調べる方法は?

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

私はすでに、私はしかし、Debug -> ExceptionsメニューでThrownフィールドを有効にしています私のコードのどこに例外がスローされるのか本当に分かりません。

これをどのようにデバッグできますか? EDITは フレームは次のように読み込むスタックが(私のアプリもリストに表示されません!)

  • KernelBase.dll 7580b8bc()
  • [フレームは以下の可能性があります! KernelBase.dll!7580b8bc()
  • opencv_core242d.dll!54eb60cc()
+0

あなたはデバッガをステップインして、どの行で例外が発生しているのか見ましたか? –

+0

@TonyTheLion私はそれをしたいと思っていますが、残念ながら私のコードのどこに例外がスローされたのか分かりません。私が見ることができるのは分解です。 – memyself

+0

例外は実際にあなたのプログラムを終了するか、それとも処理されますか? – Benj

答えて

10
  • ]正しくないか不足しています

    メイン全体をtry catchブロックにラップすると、例外の詳細が表示されます。オープンCV APIは例外を投げることができる場合、あなたのデザインの一部として、とにかくそれらを扱う考える必要があります:

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

    これはスタートです! e.msg()の代わりに 'e.what()'を使わなければなりませんでした。今私はopencvのエラーを最小限に抑えていますが、私のプログラムでこのエラーがどこで発生したのか分かりません。それを理解する方法はありますか? – memyself

    +0

    @memyself突然catchブロックで終わるまで、デバッガでステップインすることでそれを理解できるはずです。それが起こると、あなたのコードから呼び出された最後のOpen CV関数を注意深く見てください。 – Benj

    +0

    問題は、プログラムがランダムに発生し、ユーザーがマウスで何かをした場合のみです。だからエラーが発生するまでそれをステップ実行することは非常に精巧です。デバッガが 'catch'ブロックに入ったら、私に行番号を与える方法があるべきだと思っていましたか?そうではありませんか? – memyself

    2

    I'veは、ウェブカメラでのOpenCVを使用することによって、この問題を得ました。私の場合の問題は、カムが初期化されていないときにプログラムが画像を読み取ろうとしていることです。

    私のエラーコード:

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

    おかげ

    1

    OpenCVのはcv::setBreakOnError

    あなたが入れた場合と呼ばれるこの便利な機能を持っている(私の英語について申し訳ありません)ソリューション

    // 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); 
    

    前にあなたのメインに次のようにOpenCVの呼び出し:それは通常のcv :: Exceptionを投げるでしょう直前にOpenCVのは、無効な操作(NULLポインタデリファレンスを)やるになるので

    cv::setBreakOnError(true); 
    

    は、あなたのプログラムは、クラッシュします。デバッガでコードを実行すると、この不正な操作で停止し、エラーの発生時にすべてのコードと変数で呼び出しスタック全体が表示されます。

    関連する問題