2010-01-27 149 views
0

我喜歡在matlab中使用命令進行調試。一些問題:在matlab中調試

  1. 如果選擇一個堆棧,是否有可能直接跳到特定堆棧而不是使用dbup和dbdown一個接一個地移動堆棧?
  2. 跳轉到中間堆棧後,如果我執行一些命令,爲什麼它會自動返回到最內層堆棧?我可以留在中間堆棧,直到我發出命令離開另一個堆棧?
+0

有趣。我會說每個人都不一樣,而且我也習慣從命令行進行調試。不過,我最近很少這麼做,更喜歡使用編輯器。我希望能夠順利地將鼠標放在變量上以查看內容。這是快速和方便的。而且由於在代碼中只需要鼠標點擊就可以了,我花的時間更少。我的長期目標是創建更多的錯誤,因此完全不需要調試器。仍在繼續努力。 – 2010-01-27 14:09:54

回答

2

1)不是從鍵盤上。如果您使用編輯器並顯示編輯器工具欄,則會顯示一個「堆棧」下拉菜單,向您顯示整個調用堆棧,您可以跳轉到任意級別。通過查看下拉菜單中的內容,您可能能夠一起破解n級dbup/dbdown,但由於調試器與用於腳本編寫的M代碼的交互,調試器控制很難從Matlab進行腳本編寫。 2)如果你從「K >>」調試器提示符發出一個命令,當它完成時它應該返回你從你發出的堆棧級別,就像你期望的一樣。你是否還有設置在代碼底部的斷點?也許你實際上在嵌套的調用堆棧中從斷點看到了輔助調試器「K >>」提示符。你基本上可以擁有多個嵌套的調試器上下文。

例如:

function f1 
f2(); 
function f2() 
f3(); 
function f3() 
f4(); 
function f4() 
disp('Hello world'); 

如果你在這樣的調試器扔掉它,你會在這本身就是從原來的調試器會話發起調用堆棧底部命中斷點。

>> dbstop in f1 at 8 
>> f1() 
8 disp('Hello world'); 
K>> dbup 
In workspace belonging to f1>f3 at 6 
K>> dbup 
In workspace belonging to f1>f2 at 4 
K>> f1() 
8 disp('Hello world'); 
K>> dbstack 
> In f1>f4 at 8 
    In f1>f3 at 6 
    In f1>f2 at 4 
    In f1 at 2 
    In f1>f4 at 8 
    In f1>f3 at 6 
    In f1>f2 at 4 
    In f1 at 2 
K>> 

做一個dbquit(走出嵌套調試會話),讓你回到你離開了原來的調用堆棧的中間。

K>> dbquit 
K>> dbstack 
    In f1>f4 at 8 
    In f1>f3 at 6 
> In f1>f2 at 4 
    In f1 at 2 
K>> 

如果dbcont出你的「K >>」,然後控制流程會從調用堆棧,其中斷點最初提出的底部恢復,不管什麼堆棧幀K個>>期待在。您不能使用調試器來更改正在執行的主線代碼的控制流。

+0

我曾嘗試在我的泛型異常處理程序中顯示彈出窗口,它將顯示錯誤消息和代碼行,並在調用dbup後獲得一個按鈕,該按鈕的回調跳轉到相關代碼行(使用opentoline函數)脫離錯誤處理程序並返回到用戶代碼中)。不幸的是,我發現Matlab自動忽略了回調中的dbup調用。嘆... – 2010-01-27 22:56:10