2016-05-05 7 views
0

main.mがfunc1.mを呼び出し、func1.mがfunc1.mの3つの部分でfunc2.mを呼び出すとします。MatLabの行番号を印刷する(上位関数の行番号を含む)か?

エラーがあるため、func2.mにいくつかの変数を出力しているとします。

は、だから私は、私はちょうど例について話しています

var2 = 3 
var2 = 5 
var2 = -1 

を印刷したとします。しかし、プログラムが非常に複雑な場合、func1.mは3つのポイントでfunc2.mを呼び出しているので、func1.mのどの部分がfunc2.mでvar2 = 3を生成しているのか混乱することがあります。

現在の行(上位関数の行番号を含む)の "行番号"を出力することができます。そうすれば、デバッグに非常に便利です。

そんなことはありますか?

答えて

1

dbstackを使用して、これと呼ばれる呼び出し元の関数の行を特定できます。コールスタックで具体的にfunc1を探すことができます。言われていること

stack = dbstack(); 
[~, ind] = ismember({stack.name}, 'func1'); 
disp(stack(ind).line) 

、それははるかより良い条件付きブレークポイントを設定し、何が悪かったのかを把握するために、親と子のワークスペースに移動しdbupdbdownまたはMATLABワークスペースブラウザーを使用することです。

+0

ありがとうございます。しかし、私はいくつかの専門家がdbupを使用し、dbdownがデバッグに適していると言う理由が不思議です。私はすでに上書きされた変数を追跡することはできません。特に、whileループの場合、変数がすばやく消去されます。ループの反復処理でどのように変化しているのかを見たいときは、dbupとdbdownはあまり役に立ちませんか? – user42459

+1

@ user42459よく書かれたコードは、独自の変数スコープを持つモジュール化されたコードに分割されています。そのため、関数内に変数名はほとんどなく、上書きされません。 – Suever

+1

@ user42459また、ループの前にブレークポイント*を置き、ループを手動で繰り返したり、特定のループ反復でトリガされる条件付きブレークポイントを設定したりします。 – Suever