2017-01-03 2 views
7

私はdbstop errorをMatlabで作業するときに多く使用します。時間の間違いで間違いが起きると、の組み込み[m-file]関数の中にエラーがスローされ、Matlabは実行を停止してファイルを開きます。しかし、ビルトインファイルの内部をデバッグすることは決して役に立たないので、ワークフローが邪魔になります。 Matlabがデバッガ内の組み込みファイルから抜け出すように設定する方法があるかもしれませんが(関数を呼び出すことはありません)、私を関数呼び出しのままにしておきますか?エラーの場合は、dbstop中にMatlabが組み込み関数にステップインしないようにしてください。

+3

+1:これは一般的に*これに取り組む方法を見つけたことはありません...私はいつも私が組み込みの中に入っていることを受け入れるとすぐに 'dbup'と打ちます(そしてそれを繰り返す)関連する文脈に行くために...私はこの迷惑に対する解決策を見つけることも非常に興味があります。 –

+0

コードがエラーを生成するときに手動で 'dbstack'経由でスタックを調べる以外に、私はあなたが求めていることをする方法も見つけていません。これは私がMATLABでしばらく望んでいたものですが、それを行う組み込みの方法はわかりません。 – rayryeng

答えて

0

Mathworks社からRody'sの回答やフィードバックに基づいて、これはあなたがこの時点(R2016b)で取得することができます最も近い:

S = dbstack('-completenames'); 

builtins = ~cellfun('isempty', strfind({S(:).file}, matlabroot())); 
stack_depth = find(~builtins, 1, 'first'); 

hDocument = matlab.desktop.editor.findOpenDocument(S(1).file); 
matlab.desktop.editor.openAndGoToLine(S(stack_depth).file,S(stack_depth).line); 
hDocument.close(); 

if stack_depth == 2 
    dbup(); 
end 

このショートカットはします:

  1. は、最も近いユーザ関数を開き正しい行に移動します。
  2. エラーが発生したときに開いた組み込み関数を閉じます。
  3. エラーがユーザ機能からわずか1レベル離れた場合は、そのワークスペースに切り替えます。

問題はdbup()が1回しか動作しないことです。呼び出し後、スクリプトの実行が停止します。スタック内の任意の場所に切り替える機能はありません。

4

私はきちんとこの問題に取り組むための方法を見つけたことがありませんが、それは一緒に回避策をハックするのはとても簡単です:

  1. は、これらの線に沿って何かを含むスクリプトを作成します。

    S = dbstack(); 
    
    file_paths = cellfun(@which, {S.file}, 'UniformOutput', false); 
    builtins = ~cellfun('isempty', strfind(file_paths, matlabroot())); 
    stack_depth = find(~builtins, 1, 'first'); 
    
    for ii = 1:stack_depth-1 
        dbup(); end 
    
  2. あなたに合った場所に保存し、shortcut to it in the MATLAB toolbarを置きます。

この問題が発生すると、ちょっとしたショートカットをクリックするだけで、自動的にデバッグスタックの最初の非組み込み関数に移動します。

+0

これはMathworksが提案したものです。これは、dbup()を呼び出すと直ちにコールバックが実行を停止するため、stack_depth == 2の場合にのみ有効です。私はスタック内の任意の場所に移動する方法を見つけることができないようです。 – Evan

関連する問題