質問

Matlab では、dbstack を使用して現時点でのコール スタックを取得できますが、スタンドアロンのコンパイル済みバージョンの Matlab プログラムでは dbstack を使用できません。コール スタック、または少なくとも現在の関数を呼び出している関数を取得する代替手段はありますか?誰によって呼び出されたかを知る必要がある機能関数を作成したいのですが、完全な呼び出しスタックが望ましいと考えられます。

役に立ちましたか?

解決

これまでの解決策は次のとおりです。

  • あなたが言ったように、機能は DBスタック 上にあります MATLAB コンパイラでサポートされていない関数のリスト, なので使えません。
  • コメントでは、関数が エバリン サポートされていない関数リストに含まれていないため、コンパイラではまだ使用できません。その結果、私が提案した以前の解決策のいくつかが拒否されることになりました。
  • 関数呼び出しのチェーンに沿って引数を渡すことによって (または、場合によっては引数を グローバル変数) は、複雑さと保守に余分な作業が必要となるため、理想的なオプションではありません。

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

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

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

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

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

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

これらの以前のバージョンでは、 エラー エラーをスローする関数と ラスターローラー エラーをキャプチャしてスタック情報を取得する関数:

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

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

残念ながら、 ラスターローラー 関数はスタック トレース情報を返すことのみを開始しました MATLAB バージョン 7.1, したがって、以前の MATLAB バージョン用に思いつく上記の解決策のバージョンはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top