5

C++ コードを MEX ファイルにコンパイルしましたが、この MEX ファイルを呼び出すとクラッシュします。MATLAB で次のエラー メッセージが表示されます。

セグメンテーション違反が検出されました

C++ファイルでtry-catchを使用して、catchブロックにメッセージを出力しようとしました。

try {
    //my code;
}
catch(std::exception &e)
{
    mexPrintf(e.what());
    mexEvalString("drawnow;");
    return;
}

しかし、印刷メッセージは機能せず、コードは依然としてクラッシュします。

Google を見ると、ほとんどの場合、MathWorks から提供された何らかの形式のメッセージを指しています: http://www.mathworks.de/matlabcentral/newsreader/view_thread/25900

環境変数を設定するように指示します"MATLAB_MEM_MGR=debug"が、その使用方法を説明していませんか? 誰か説明してくれませんか?

4

2 に答える 2

4

まず、try/catch はセグメンテーション違反をキャッチしません。sigsegv などのシグナルではなく、C++ 例外のみをキャッチします。

第二に、「使用する」MATLAB_MEM_MGR

  1. MATLAB_MEM_MGROS シェル (Windows のコマンド プロンプトや Unix のターミナルなど) で環境変数を「debug」に設定します。
  2. 同じシェルから MATLAB を実行し、
  3. その MATLAB から MEX 関数を通常どおり実行します。

FAQ のQ3.5にあるように、(たとえば) MATLAB によって割り当てられたメモリ ブロックの末尾を超えて書き込むことによって MEX 関数がメモリを破損した場合、MATLAB はメモリ ブロックが解放されたときに破損を報告します。

代わりに、MEX 関数をデバッガーで実行してみることをお勧めします。このテクニカル ノートには、さまざまなプラットフォームでこれを行う方法を説明するリンクがいくつかあります。

EDIT:前のリンクは無効です。これが最新のドキュメントページです。

于 2011-06-01T18:01:16.513 に答える
0

を削除しmexEvalString("drawnow;")ます。これを理解するのに5時間かかりました。

于 2015-06-23T22:03:44.883 に答える