RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器

調試器

自從RP Fiber Power V7版本,有一個功能強大的調試器,它允許您分步驟執行腳本代碼,并在任何步驟之后檢查系統的狀態。這在搜索復雜仿真腳本中的錯誤時非常有用。

調試實際上可以通過兩種不同的方式進行:

您可以一個命令一個命令地執行腳本,也就是說,您可以在執行每個命令之后檢查系統。

您還可以在表達式計算中檢查系統狀態。如果您正在開發復雜的表達式,由許多細節組成,可能包含控制結構,它將非常有用。

下面的示例代碼用于解釋兩種調試方法之間的差異:

calc

  begin

    a := 1;

while f(a) < 1 do

      a := 1.1 * a;

  end

整個過程是一個命令(calc),它導致表達式的計算(這里是一個begin-end塊)。在第一個方法中,整個命令將在一個步驟中執行。在調試表達式(第二種方法)時,您可以一步一步地執行while循環,并查看變量a的值在不斷變化。注意,賦值(例如a : = 1.1*a)不是命令,而是子表達式(表達式的一部分)。在本例中,可以使用單獨的命令執行相同的操作:

a := 1

while f(a) < 1 do

  a := 1.1 * a

這可以用第一個方法一步一步地執行。這里,while循環被實現為一個語句,調用賦值命令(a: = 1.1*a)作為其循環體。

調試命令

在本節中,將演示如何按命令執行腳本命令。(有關調試數學表達式,請參見第4.8.3節。)

軟件可以處于以下執行模式之一:

lEditing mode:可以編輯腳本或表單內容。軟件尚未執行任何操作。

lRunning mode:當前執行腳本時,通常只需等待執行完成并顯示結果。即使在執行期間,您也會看到當前狀態的顯示(見下文),除非您正在處理表單。

lDebug mode:在此模式下,軟件已中斷執行,并等待您決定如何繼續執行。它顯示執行腳本中的當前位置,您可以在決定下一個操作之前檢查系統的狀態,例如,執行下一個命令、在運行模式下繼續或中止執行。

lInspectors(放大鏡):這將調用檢查工具(參見下一節),您可以在其中檢查變量的當前值。

通常,當執行腳本或表單內容時,軟件將從編輯模式切換到運行模式,執行后將返回編輯模式。但是,有以下方法進入調試模式

在開始執行時,可以通過按住Ctrl鍵(例如,使用Ctrl-F8而不是F8)直接啟動調試模式。

在運行模式下,您可以按 Ctrl-B (為了“break”)或單擊主表單上“End execution”按鈕下方的“Break”按鈕(見下文)。在運行模式下,工具欄中還會出現一個藍色的中斷按鈕。

請注意,軟件首先需要完成當前命令的執行;因此,對于某些命令,需要一段時間才能進入調試模式。

當軟件在執行的腳本中遇到斷點(見下文)時,它也會進入調試模式。

下面的屏幕截圖顯示主窗口在調試模式下的外觀:

RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖1RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖2

圖片2.png

在工具欄下面,您能找到顯示一些信息的“Execution and debugging”面板:

狀態(執行模式)“debug”

當前執行的文件(當軟件進入或完成一個include文件時,在執行過程中會發生更改)

當前行號(以及開放循環結構的其他有用信息,如果適用)

自執行開始以來的總執行時間(不包括調試模式下的等待時間)

還有各種按鈕用于確定下一個操作:

lAbort(中止):執行肯定結束,軟件返回編輯模式。您將選擇這樣做,例如,當您在腳本中發現錯誤時,首先需要修復該錯誤,然后才能從頭開始執行。

lBreak(中斷):此按鈕可在運行模式下用于中斷執行并進入調試模式。例如,如果執行似乎進入了一個無止境的命令循環,并且您想要找出發生在哪里,那么您可以這樣做。

請注意,軟件首先需要完成當前命令的執行;因此,對于某些命令,需要一段時間才能進入調試模式。如果表達式中有一個無休止的循環,則中斷將不起作用,因為當前命令的執行無法完成;然后可能必須中止。

lSingle command(單命令):只執行下一個命令,然后返回調試模式。

如果下一個命令是include命令,導致執行include文件,則在按下按鈕“single command”時按住Shift鍵,可以一步執行整個文件。

lResume(繼續):繼續執行(在運行模式下)直到腳本結束或下一個斷點(見下文)。

如果正在執行include文件,則在按下“Resume”按鈕時按住SHIFT鍵,最多只能繼續到該文件的末尾。然后,軟件將再次進入調試模式,您可以逐步檢查調用腳本。

在這些按鈕下面,有一個復選框,您可以用它忽略進一步的斷點。

在調試模式下,您還可以找到代碼的顯示,其中要執行的下一行顯示為藍色,綠行表示斷點。代碼顯示在運行模式下是隱藏的,因為它通常變化得太快而無法讀取,但您仍然可以在上面的控件中看到當前的行號、執行時間等。

定義斷點有兩種方法(即軟件進入調試模式的點(見上文),而不是繼續執行):

最快的方法是在編輯器中的一行前面單擊。該行將顯示為綠色,文本左側的裝訂線區域將顯示一個綠色圓圈。請注意,這樣的斷點是臨時的;如果關閉編輯器,它們將消失。

條件斷點可以通過在裝訂線區域中單擊鼠標右鍵并輸入表達式來定義。只有滿足條件,即表達式返回非零值時,執行才會在該點停止。

另一種方法是插入以“@”開頭的行(可能在一些空格之后)。在“@”符號之后,括號中可以有一個數值表達式;這會再次給您一個條件斷點。這樣一個條件斷點的示例:@ (E_p() >= 1 nJ)

您不僅可以在編輯器中設置或刪除斷點,還可以在調試窗口的代碼顯示中設置或刪除斷點。

如果腳本執行期間發生錯誤,則無法返回調試模式;執行肯定已完成。通常,我們會更正錯誤并再次執行腳本。但是,還有一種可能,如果您可能會損失大量的計算時間,那么您可能需要使用它:您可以生成另一個腳本,只包含來自缺陷代碼行的命令,您可以更正這些命令,并且在第一行中使用“keep all”。如果執行該操作,它將把所有變量和數組定義、計算模型詳細信息等保存在內存中,然后繼續執行。(詳見第5.8節。)

檢查工具

RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖4當腳本執行在調試模式下完成或剛剛中斷時,您可以使用檢查工具檢查系統的狀態。您可以通過菜單中的View | Inspectors、F12或調試面板中具有放大鏡符號的按鈕來獲得。

RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖5

圖片3.png

不同方面的檢查有不同的選項卡:

lVariables:檢查所有定義變量的值。您可以使用表下面的復選框選擇是否也要查看預定義的值。

lArrays:顯示所有定義的數組及其索引范圍。包含的值(可能有數百萬!)不顯示;要顯示某個數組組件的值,請使用“Expression to evaluate”欄(請參見下文)。

lUser-defined functions:顯示執行腳本定義的所有函數。

lFibers:這顯示了腳本定義的所有光纖模型,包括它們的詳細信息,如相應的光纖信道。

lBeam propagation:顯示所有光束傳播設備及其光信道。

在下面部分,您可以看到“expression to evaluate”欄。在這里,您可以輸入任何表達式(或用逗號分隔的表達式列表),以獲得變量或陣列分量值或從中計算出的值、光纖中的光功率或計算出的光脈沖的屬性。

您可以在調試腳本時保持該檢查窗口處于打開狀態。每次遇到斷點或腳本執行完成時,都會自動更新檢查表單。您可以通過按表單右上角附近的“Update”按鈕在其他時間更新內容。

調試表達式

該軟件具有強大的表達式引擎。這樣,即使在數學表達式的層次上,也可以做相當復雜的事情,例如,在執行單個命令(例如,將表達式值賦給變量)的過程中。因此,即使在表達式中也常常需要進行調試。

您可以在表達式中設置斷點,而不是使用“@”字符,例如命令級別上的斷點,而是通過插入對函數debug()的調用來設置斷點。該函數只有一個字符串參數。如果它不是空字符串,則表示此時要進入表達式調試模式;傳遞的字符串將在調試窗口中顯示為消息,幫助您了解當前正在查看的代碼。如果使用空字符串參數調用函數,則表達式調試模式將結束,即通常在調用后恢復表達式的計算。一旦到達包含debug()調用的塊的末尾,調試模式也將結束。

使用debug()函數而不是簡單的斷點符號(例如“@”)的概念為您提供了更多的靈活性。特別是,只有滿足某個條件時才可以調用函數,這樣實際上就有了一個條件斷點。您還可以使用計算的消息字符串,更好地通知您當前的狀態。

具有斷點的代碼示例:

RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖7 

圖片4.png
圖片5.png

RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖10 

當計算達到該斷點時,軟件將顯示檢查工具(見第4.8.2節),但現在顯示選項卡“Debug expression”(在命令級別上調試時該選項卡不可見):

RP Fiber Power 光纖激光器及光纖器件設計軟件——調試器的圖11

圖片6.png

在調試表達式時,檢查工具作為一個“模式”窗口工作:您不能將它放在一邊并與用戶界面的其他部分一起工作,因為軟件在那里等待您的反饋以繼續執行。

在表單中,您可以看到以下內容:

用debug()函數傳遞的消息

下一行要計算的代碼用藍色背景標記。

顯示上次計算表達式結果的欄

局部變量(頂部變量是在最高級別表達式中最后聲明的一個變量)

用于計算表達式或表達式列表(可能依賴于全局變量或局部變量)的欄。

一些按鈕:

lNext expression:計算下一個表達式,保持調試模式。

lEnd debug mode:繼續執行,直到到達下一個調試點。

lAbort:中止表達式的計算,然后執行整個腳本。

 用于檢查全局變量、數組等的其他選項卡。

上面的屏幕截圖不直接顯示到達斷點后的狀態,而是在按下“Next expression”兩次后,使當前位置移動到“for”循環的主體中。

還有一些其他有用的特性和技巧:

檢查表單的其他選項卡允許檢查全局變量、數組等。

 在代碼顯示的底部,有一個深灰色的分隔線,您可以抓取并拉動它來重新分配顯示代碼和局部變量之間的可用屏幕空間。

當計算單個表達式時,其結果顯示在代碼區域下方的欄中。

最后一行代碼只包含一個點。雖然在執行另一個步驟時不會再計算其他代碼,但它很有用,因為它允許您在最后檢查系統的狀態。當到達該點時,該點將替換為塊的最終結果的顯示。

 在按住Ctrl鍵的同時,可以通過單擊調試器窗口中相應的代碼行來設置臨時斷點。然后計算將繼續進行,不會中斷到該行,除非事先發現了常規斷點。這可能非常有用;例如,您可以使用它快速完成一個循環(對循環體執行許多操作),然后繼續調試。

 如果在某個循環體中調用debug()函數,例如,通常只會看到該循環體的代碼。如果您還希望看到那周圍的的代碼,請確保在進入循環之前調用debug()函數,即使您使用的是空字符串參數,因此此時還沒有打開顯示。

 如果顯示的代碼包含對用戶定義函數的調用,則該函數將在一個步驟中執行,除非在其定義中還包含對debug()函數的調用。(可以在不同的表達式中組合調試。)

如果使用以減號開頭的消息字符串調用debug()函數,則只有當用戶按下了 Ctrl-Alt-B時,調試模式才會打開。例如,您可以在循環中放置這樣的調用,以便在循環執行時間過長,可能是由于無限循環,的情況下,使用Ctrl-Alt-B 開始調試。

請注意,如果不準備調用debug()函數,則在表達式中允許這樣的中斷是不明智的,因為用戶幾乎不知道當前對具有復雜計算的腳本的哪些表達式進行了計算。

 

關于在檢查工具中顯示局部變量的一些注釋:

 只顯示屬于所顯示代碼的局部變量。

 不僅可以看到那些已明確聲明的局部變量(使用var語句),還可以看到那些由for循環自動生成的局部變量。(上面的屏幕截圖包含一個例子。)此外,用戶定義函數的參數也作為局部變量列出。

可能會在列表中多次找到某個變量名。在這種情況下,位于最高位置的(第一列中的最小索引號)與執行相關;它對應于執行代碼最內部塊中的變量聲明。在對應于不同塊的變量之間,可以看到一條雙分隔線。

武漢墨光公眾號宣傳圖片.jpg
登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP