除錯

Julia 擴充套件支援除錯所有類型的 Julia 程式和應用程式。

對於一般的除錯功能,例如檢查變數、設定中斷點,以及其他與語言無關的活動,請檢閱 VS Code 除錯

範例

  1. 在 VS Code 中開啟一個 Julia 檔案。
  2. 按一下執行按鈕。現在您會看到預設除錯器起始面板
  3. 按一下執行和除錯(或選取F5)以在除錯器中執行積極的 Julia 檔案。輸出顯示在 Julia 除錯終端機中。

Debugger

在這個範例中,整個程式一口氣執行完,沒有任何問題就完成了。讓我們在第 11 行設定一個中斷點,讓這個範例更有用。我們只要用滑鼠點一下程式碼編輯器最左欄中的這行即可

Debugger

紅點表示我們現在已設定一個中斷點。接下來,我們再度啟動程式(按一下執行和除錯或按下F5)。當程式執行到第 11行時,會暫停

Debugger

黃色線表示如果我們繼續執行程式,接下來會執行的程式碼位置。我們也可以看到我們在呼叫堆疊中的位置和所有中斷點的清單。現在我們在文字編輯器上方看到工具列中包含常用除錯動作的指令:繼續逐行執行進入離開等等。讓我們按一下逐行執行一次,然後按一下進入。我們現在暫停在 bar 函式的第一行

Debugger

現在變數檢視顯示在此函式中有什麼局部變數以及它們目前的數值。當我們逐行執行程式並最終到達 bar 函式的末尾時,局部變數清單會變長,也就是說,我們現在也會看到 cd 的值

Debugger

讓我們在15行設定另一個中斷點,然後繼續執行程式,直到執行到這個中斷點。然後我們按一下除錯主控台,並看到像這樣的檢視

Debugger

在此檢視中,我們可以在目前函式的環境下評估隨意的 Julia 程式碼。例如,我們可以透過在此處執行 log(x) 來計算 x 的對數

Debugger

我們也可以在程式暫停時變更任何局部變數的值。例如,若要變更 x 的值,我們可以在變數區段中按兩下 x 旁邊的值 27,然後輸入任何隨意的 Julia 表達式。這個表達式傳回的值將會變成變數 x 的新值。在以下範例中,我們將 x 的值變更為一個字串

Debugger

這完成了非常基本的簡介。現在我要重點說明一些其他功能。

啟動除錯器的途徑

有兩種不同的方式來啟動除錯器。

  • 第一種是你已經在教學過程中學到的:你在除錯器中執行一個 Julia 檔案。
  • 第二種方法允許你除錯互動式 REPL 中的程式碼。

執行 Julia 檔案

在我們的範例中,我們在除錯器中啟動了目前啟用的 Julia 檔案。這是啟動除錯最基本的方法,但是還有更多你可以設定在 VS Code launch.json 檔案中的選項。範例包含設定一個固定的 Julia 檔案作為啟動檔案、設定指令列參數等等。launch.json 的功能在 VS Code 除錯器文件中有更詳細的說明。

從 REPL 除錯程式碼

你也可以從 REPL 啟動除錯器。在那種情況下,除錯器將會附加到已經執行的 REPL。若要啟動這種除錯的階段,你在 REPL 中使用兩個巨集:@enter@run 巨集。兩個都很簡單:它們會在傳遞給巨集的程式碼上啟動除錯器。@run 巨集會執行程式碼,直到執行到一個斷點為止,而 @enter 巨集會在程式碼的第一行暫停除錯器。例如,你可以透過輸入 @enter println("Test") 來從 REPL 中開始除錯 println 函式。

中斷點

你已經學到了如何輕鬆地設定原始碼中的中斷點。中斷點還有另外兩個選項:函數中斷點和中斷點條件。

函數中斷點

如果你在 中斷點 檢視中按一下小小的 + 符號,你可以加入一個函數中斷點。只要輸入你想要中斷的函數名稱即可。你也可以設定它,只在特定的方法上中斷,方法是指定一個簽章,例如 foo(::String, ::Number)

中斷點條件

如果你在編輯器中用滑鼠右鍵按一下一個中斷點,你可以選擇一個選項 編輯中斷點...,然後你可以加入一個中斷點條件。你可以輸入任何傳回 Bool 值的有效 Julia 表達式。你當然可以完全存取這個表達式中的所有局部變數。

變數檢視器

複合變數、陣列和字典在變數檢視器中擁有完整的樹狀鑽取支援。

Debugger

檢視區段

檢視區段允許你輸入任意 Julia 表達式,這些表達式會在程式暫停時評估,而結果會顯示出來。

Debugger

呼叫堆疊

呼叫堆疊區段允許你看任何堆疊框架的內容,也就是說,當你按一下那裡的不同函數時,它會顯示出選取堆疊框架的局部變數。你也可以重新啟動任何堆疊框架中的程式碼執行,方法是在此處給定輸入旁按一下小的重新啟動圖示。

Debugger

请注意,此最终功能可能会非常脆弱,特别是如果你的函数修改了任何全局状态。

异常

如果你的代码抛出异常,你将获得一个好的异常视图

你也可以在用户界面中断点部分配置异常中的调试器行为。

编译模式

断点视图有另一个选项,称为「启用编译模式」

Debugger

以下为该选项的功能

如果你选择此选项,在当前堆栈帧中调用的任何函数中设置的断点将不再暂停执行代码。在我们的示例中,如果你在函数 foo 中暂停,然后选择此选项,bar 中的断点将不再暂停执行。foo 中的断点仍会暂停调试器。

你为什么要使用此功能?

启用此选项后,你的代码将运行得快得多。

故障排除

如果你在使用调试器时遇到任何问题,请通过 Julia VS Code 代码库让我们知道。

用于加快调试器的设置

ALL_MODULES_EXCEPT_MAIN

为了使调试器运行得更快,我们想要最大程度地减少需要解释的程序包/模块的数量。假设你需要调试你编写的代码以及 Statistics 程序包提供的功能。点击调试器的「默认编译」扩展设置。

Debugger

按照以下方式配置此设置。

"julia.debuggerDefaultCompiled": [    
        "ALL_MODULES_EXCEPT_MAIN",   
        "-Statistics.",     
    ]

ALL_MODULES_EXCEPT_MAIN 将使所有模块在编译模式下运行,但不包括包含你编写的代码的 Main 模块。我们还会使用「-Statistics」从编译模块的列表中删除此模块及其所有子模块,以便解释它。

使用自定义 sys 映像

在调试时也可以使用自定义 julia sys 映像。转至 julia-vscode 扩展设置,然后单击以编辑「其他参数」。

Debugger

在设置中,使用「-J」选项,然后输入到自定义 sys 映像的路径。请注意,此「其他参数」设置目前仅在 REPL 模式下调试时使用,请参见下例中的 @run 宏。

"julia.additionalArgs": [
        "-JC:\\temp\\sys_custom.so",
    ],

快速调试的示例

在以下代码中,我们使用了 GLMakie 和 Statistics 程序包。GLMakie 是一个绘图程序包,据了解,它的首幅图绘图时间 (TTFP) 相当慢,特别是对于早于 1.9 的 julia 版本。在调试时,解释 GLMakie 肯定不是我们想要做的事情。使用上述设置,GLMakie 设置为在编译模式下运行,我们也从 sys 映像加载它。确保在根函数中使用 @run 宏并在 REPL 模式下进行调试。

Debugger

当调试器点击所需的代码行时,我们可以在 mean 函数(Statistics)内执行单步并进行调试。

Debugger