2016-04-04 9 views
2

多くの場合、コードをデバッグするために多くのkeyboardコマンドを挿入します。しかし、もう少し柔軟性を持たせたいと思います。だからこそ私はstahpの機能を書いています。ファイルから抜け出した後にMATLABデバッグモードを開始

function stahp() 
disp('Stahp requested.'); 
dbstack 
disp('You can either'); 
disp(' 1 abort.'); 
disp(' 2 continue.'); 
disp(' 3 debug.'); 

in = input('Choose what to do:\n'); 

switch(in) 
    case 1 
     error('Stahp.'); 
    case 2 
     disp('Continue.') 
    case 3 
     disp('Debug.'); 
     keyboard % <------------------------------------ Here is my problem 
    otherwise 
     stahp(); 
end 
end 

アイデアは、彼が(将来的には他の何か多分、デバッグ、中止、継続)何をしたいのか、ユーザーが選択できるように、です。しかし、私はstahp関数の中でデバッグモードを開始しないことをお勧めします。例については、

function test_stahp 
a = 1 
stahp() 
b = 2 
end 

を実行している私は、右のb=2前にデバッグモードに入りたいと思います。私は、dbstep outは何とか使うことができると思いますが、これまでに試したやり方では、手動でstahp()から手を離さなければなりません。また、stahp()の再帰呼び出しがotherwiseにあると複雑になる可能性がありますが、その部分を削除することもできます。

ご協力いただきありがとうございます。ありがとうございました。

答えて

1

dbstackを使用すると、現在のスタックを取得し、stahpという名前の呼び出し元関数と行番号の名前を取得できます。この情報を使用して、dbstopを使用して、関数呼び出しを実行した関数にブレークポイントを作成できます。次のコードサンプルでは、​​b = 2行にブレークポイントをtest_stahpに設定しています。

function stahp() 
disp('Stahp requested.'); 
dbstack 
disp('You can either'); 
disp(' 1 abort.'); 
disp(' 2 continue.'); 
disp(' 3 debug.'); 

in = input('Choose what to do:\n'); 
r=dbstack; 
switch(in) 
    case 1 
     dbclear(r(2).name,num2str(r(2).line+1)); 
     error('Stahp.'); 
    case 2 
     dbclear(r(2).name,num2str(r(2).line+1)); 
     disp('Continue.') 
    case 3 
     disp('Debug.'); 
     dbstop(r(2).name,num2str(r(2).line+1)) 
    otherwise 
     stahp(); 
end 
end 
+0

この方法には1つの問題があります。 'debug'を選択すると、明示的に次の行にブレークポイントが置かれます。しかし、コードを再実行して「続行」を選択すると、もともと置かれたブレークポイントで停止します。 – k1next

+0

それを指摘してくれてありがとう。一つのオプションは 'dbclear'を使ってブレークポイントをクリアすることです。私はブレークポイント(もしあれば)を削除するように私の既存の答えを更新しました。 – mkfin

+0

ありがとう、しかし、今、 'stahp'は自己完結型ではありません。私は 'stahp'を追加するたびに' dbclear'を追加したくないです。 – k1next

関連する問題