4

matlabでは、dbstackを使用して現時点で呼び出しスタックを取得できますが、dbstackはスタンドアロンのコンパイル済みバージョンのmatlabプログラムでは使用できません。呼び出しスタックを取得する代替手段、または少なくとも現在の関数を呼び出す関数はありますか?誰から呼び出されたかを知る必要のあるファシリティ関数を書きたいのですが、完全な呼び出しスタックが望ましいでしょう。

4

1 に答える 1

11

これまでのところ、ソリューションは次のとおりです。

  • おっしゃるように、関数DBSTACK、MATLABコンパイラでサポートされていない関数のリストに含まれているため、使用できません。
  • また、コメントで、関数EVALINがサポートされていない関数リストに含まれていなくても、コンパイラーはそれを使用できないと述べました。それは私が提案した以前の解決策のいくつかを拒否することになった。
  • 関数呼び出しのチェーンに沿って引数を渡すことによって(または、場合によってはグローバル変数に引数を格納することによって)独自のスタックトレースを維持する必要があることは、維持に必要な複雑さと余分な作業のため、理想的なオプションではありません。

ただし、これまでで「最もクリーンな」解決策と思われる解決策がもう1つあります。それは、エラー処理メカニズムを使用してスタックトレースを取得することです。これは、使用しているMATLABのバージョンによって異なります...

MATLABバージョン7.5(R2007b)以降:

MExceptionクラスの形式の新しいエラー処理機能は、バージョン7.5で導入されました。stack「ダミー」例外を作成してスローし、すぐにそれをキャッチしてフィールドにアクセスすることにより、MExceptionオブジェクトからスタックトレースに関する情報を取得できます。関数で次のことを行う場合:

try
  throw(MException('phony:error',''));
catch ME
  callerStack = {ME.stack.name};
end

次に、セル配列callerStackには、呼び出しスタック内のすべての関数の名前が含まれ、最初の要素に現在の関数名が含まれ、最後の要素に最上位の呼び出し元の名前が含まれます。

MATLABバージョン7.1(R14SP3)から7.4(R2007a):

これらの以前のバージョンでは、 ERROR関数を使用してエラーをスローし、LASTERROR関数を使用してエラーをキャプチャしてスタック情報を取得できます。

try
  error('phony:error','');
catch
  s = lasterror;
  callerStack = {s.stack.name};
end

MATLABバージョン7.0.4(R14SP2)以前:

残念ながら、LASTERROR関数はMATLABバージョン7.1でのみスタックトレース情報を返し始めたため、以前のバージョンのMATLABで思いつくことができる上記のソリューションのバージョンはありません。

于 2010-01-19T15:39:57.780 に答える