MATLAB - 除錯



除錯有助於識別和修復程式碼中的錯誤或問題,確保程式正確執行。

在瞭解如何開始除錯的詳細資訊之前,讓我們列出 Matlab 程式中常見的錯誤型別。

  • 語法錯誤 - 這些錯誤是由於程式碼結構不正確引起的,例如缺少或不匹配的括號、逗號或分號。
  • 執行時錯誤 - 這些錯誤發生在程式碼執行期間,通常是由於諸如除以零或訪問不存在的變數等問題引起的。
  • 邏輯錯誤 - 這些錯誤最棘手,因為它們不會觸發錯誤訊息,但會產生錯誤的結果。除錯這些錯誤通常需要仔細檢查演算法的邏輯。

讓我們詳細瞭解 Matlab 中的除錯。

使用 MATLAB 編輯器

MATLAB 的整合開發環境 (IDE) 包括 MATLAB 編輯器,它提供了許多功能來幫助除錯 -

  • 語法高亮 - 它透過以不同的顏色顯示程式碼元素來幫助您發現語法錯誤。
  • 程式碼摺疊 - 整理您的程式碼以提高可讀性和更輕鬆地進行除錯。
  • 程式碼建議 - MATLAB 可以為函式和變數提供自動建議,減少打字錯誤。

以下是一些示例。

calculate and displaysum

語法高亮顯示了程式碼中的問題,如上圖所示。我在第 3 行錯過了分號。它還提供了詳細資訊選項,單擊它後您將看到以下內容 -

suggested action

單擊“修復”按鈕將在第 3 行新增一個現在缺少的分號。

讓我們再舉一個語法錯誤的例子 -

error message

這裡在第 6 行,我錯過了 fprintf() 的閉合括號。錯誤突出顯示了出現的問題,如上圖所示。

Matlab 中的斷點

斷點就像放置在 Matlab 程式碼中的標記,用於在標記點中斷執行。當代碼到達斷點時,它會暫停,允許您檢查變數、檢查程式狀態和分析程式碼的行為。

您可以如下新增斷點 -

function call stack

單擊您希望新增斷點的行號。該行號將如上圖所示突出顯示。在右側,您會看到“斷點”部分,其中包含有關函式 calculateAndDisplaySum.m 的斷點詳細資訊。

現在,當您呼叫函式 calculateAndDisplaySum 時,它將在執行期間在第 6 行停止。您可以檢查斷點之前的所有行號,以確保函式中的變數和邏輯是否給出正確的結果。

Matlab 中斷點的暫停和檢查

程式碼執行在斷點處停止,允許您檢查變數、檢查其值並在命令視窗或“變數”面板中評估表示式。

以下是 Matlab 中的執行流程 -

breakpoints

sum result

當您將游標放在變數上時,它會顯示函式中使用的變數的值,如上圖所示。

斷點處的操作

debugger

程式碼在斷點處暫停後,您可以使用偵錯程式控制元件(單步執行、步入、步出)逐行單步執行程式碼。

使用紅色突出顯示的“繼續”按鈕從斷點恢復程式碼執行。

在 Matlab 中使用執行進行除錯

要執行程式碼直到指定行然後暫停,請選擇該行左側的“執行到游標”按鈕。如果所選行無法立即訪問,則 Matlab 將繼續執行程式碼,直到到達檔案末尾或遇到斷點。

示例

plotgraph

在除錯過程中,“執行到此處”按鈕將轉換為“繼續到此處”按鈕。在函式和類中,僅在除錯期間才能透過“繼續到此處”按鈕訪問執行到特定行並暫停的功能。

當 Matlab 進入暫停狀態時,會發生一些更改 -

  • 編輯器或即時編輯器選項卡中的“執行”按鈕將轉換為“繼續”按鈕。
  • 命令視窗提示符將變為 K>>,表示 Matlab 的除錯模式,其中鍵盤控制。
  • Matlab 用綠色箭頭標記暫停的行,並將其以綠色突出顯示,以便於識別。
command window

Matlab 暫停的行將保持非活動狀態,直到您選擇繼續執行程式碼。要恢復,只需單擊“繼續”按鈕。然後,Matlab 將繼續執行檔案,直到到達其結尾或遇到斷點。或者,您可以選擇所需程式碼行左側的“繼續到此處”按鈕以恢復到該點的執行。

一些有助於程式碼除錯的有用方法

以下是一些可幫助您更有效地除錯程式碼的實用技巧 -

使用 codeIssues() 方法

在 Matlab 中,codeIssues 是一個容器物件,其中包含程式碼分析器識別的問題資訊。issues 變數用於儲存或引用來自 codeIssues 物件的資訊。

語法

issues = codeIssues  : this takes care of issues with code related to the current folder and returns codeIssues object.

issues = codeIssues(names) : Here you can specify the name of the folder or file name for which you wish to issue the code issues.

示例

在本例中,我們希望檢視與 add.m 檔案相關的問題。

issues = codeIssues("add.m")

執行後,您將獲得以下輸出 -

>> issues = codeIssues("add.m")

issues = 

   codeIssues with properties:
   
      Date: 01-Dec-2023 16:48:56
      Release: "R2023b"
      Files: "/MATLAB Drive/add.m"
      CodeAnalyzerConfiguration: "active"
      Issues: [0x10 table]
      SuppressedIssues: [0x11 table]
   
>> 

現在我們看到 add.m 檔案沒有任何問題。讓我們犯一些錯誤,看看在使用 codeIssues() 方法時是否會顯示相同的內容。

考慮 add.m 檔案,其中第 2 行缺少分號,如下面的螢幕截圖所示 -

semicolon missing

執行 issues = codeIssues("add.m") 後,在 Matlab 命令視窗中提供以下詳細資訊 -

codeissues

使用 checkcode() 方法

此方法顯示給定檔名可能存在的問題。

語法

checkcode(filename) :  give the filename here for which you wish to see the code issues.

示例

checkcode 函式檢查 Matlab 指令碼檔案 add.m 中是否存在潛在問題。

checkcode('add.m')

在 Matlab 命令視窗中執行後,您將獲得以下輸出 -

>> checkcode('add.m')
L 2 (C 12): Add a semicolon after the statement to hide the output (in a function).
廣告
© . All rights reserved.