除錯
Julia 擴充套件支援除錯所有類型的 Julia 程式和應用程式。
對於一般的除錯功能,例如檢查變數、設定中斷點,以及其他與語言無關的活動,請檢閱 VS Code 除錯。
範例
- 在 VS Code 中開啟一個 Julia 檔案。
- 按一下執行按鈕。現在您會看到預設除錯器起始面板
- 按一下執行和除錯(或選取
F5
)以在除錯器中執行積極的 Julia 檔案。輸出顯示在 Julia 除錯終端機中。
在這個範例中,整個程式一口氣執行完,沒有任何問題就完成了。讓我們在第 11
行設定一個中斷點,讓這個範例更有用。我們只要用滑鼠點一下程式碼編輯器最左欄中的這行即可
紅點表示我們現在已設定一個中斷點。接下來,我們再度啟動程式(按一下執行和除錯
或按下F5
)。當程式執行到第 11
行時,會暫停
黃色線表示如果我們繼續執行程式,接下來會執行的程式碼位置。我們也可以看到我們在呼叫堆疊中的位置和所有中斷點的清單。現在我們在文字編輯器上方看到工具列中包含常用除錯動作的指令:繼續
、逐行執行
、進入
、離開
等等。讓我們按一下逐行執行
一次,然後按一下進入
。我們現在暫停在 bar 函式的第一行
現在變數
檢視顯示在此函式中有什麼局部變數以及它們目前的數值。當我們逐行執行程式並最終到達 bar 函式的末尾時,局部變數清單會變長,也就是說,我們現在也會看到 c
和 d
的值
讓我們在15
行設定另一個中斷點,然後繼續執行程式,直到執行到這個中斷點。然後我們按一下除錯主控台
,並看到像這樣的檢視
在此檢視中,我們可以在目前函式的環境下評估隨意的 Julia 程式碼。例如,我們可以透過在此處執行 log(x)
來計算 x 的對數
我們也可以在程式暫停時變更任何局部變數的值。例如,若要變更 x 的值,我們可以在變數
區段中按兩下 x 旁邊的值 27,然後輸入任何隨意的 Julia 表達式。這個表達式傳回的值將會變成變數 x 的新值。在以下範例中,我們將 x 的值變更為一個字串
這完成了非常基本的簡介。現在我要重點說明一些其他功能。
啟動除錯器的途徑
有兩種不同的方式來啟動除錯器。
- 第一種是你已經在教學過程中學到的:你在除錯器中執行一個 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 表達式。你當然可以完全存取這個表達式中的所有局部變數。
變數檢視器
複合變數、陣列和字典在變數檢視器中擁有完整的樹狀鑽取支援。
檢視區段
檢視區段允許你輸入任意 Julia 表達式,這些表達式會在程式暫停時評估,而結果會顯示出來。
呼叫堆疊
呼叫堆疊區段允許你看任何堆疊框架的內容,也就是說,當你按一下那裡的不同函數時,它會顯示出選取堆疊框架的局部變數。你也可以重新啟動任何堆疊框架中的程式碼執行,方法是在此處給定輸入旁按一下小的重新啟動圖示。
请注意,此最终功能可能会非常脆弱,特别是如果你的函数修改了任何全局状态。
异常
如果你的代码抛出异常,你将获得一个好的异常视图
你也可以在用户界面中断点部分配置异常中的调试器行为。
编译模式
断点视图有另一个选项,称为「启用编译模式」
以下为该选项的功能
如果你选择此选项,在当前堆栈帧中调用的任何函数中设置的断点将不再暂停执行代码。在我们的示例中,如果你在函数 foo 中暂停,然后选择此选项,bar 中的断点将不再暂停执行。foo 中的断点仍会暂停调试器。
你为什么要使用此功能?
启用此选项后,你的代码将运行得快得多。
故障排除
如果你在使用调试器时遇到任何问题,请通过 Julia VS Code 代码库让我们知道。
用于加快调试器的设置
ALL_MODULES_EXCEPT_MAIN
为了使调试器运行得更快,我们想要最大程度地减少需要解释的程序包/模块的数量。假设你需要调试你编写的代码以及 Statistics 程序包提供的功能。点击调试器的「默认编译」扩展设置。
按照以下方式配置此设置。
"julia.debuggerDefaultCompiled": [
"ALL_MODULES_EXCEPT_MAIN",
"-Statistics.",
]
ALL_MODULES_EXCEPT_MAIN
将使所有模块在编译模式下运行,但不包括包含你编写的代码的 Main 模块。我们还会使用「-Statistics」从编译模块的列表中删除此模块及其所有子模块,以便解释它。
使用自定义 sys 映像
在调试时也可以使用自定义 julia sys 映像。转至 julia-vscode 扩展设置,然后单击以编辑「其他参数」。
在设置中,使用「-J」选项,然后输入到自定义 sys 映像的路径。请注意,此「其他参数」设置目前仅在 REPL 模式下调试时使用,请参见下例中的 @run
宏。
"julia.additionalArgs": [
"-JC:\\temp\\sys_custom.so",
],
快速调试的示例
在以下代码中,我们使用了 GLMakie 和 Statistics 程序包。GLMakie 是一个绘图程序包,据了解,它的首幅图绘图时间 (TTFP) 相当慢,特别是对于早于 1.9 的 julia 版本。在调试时,解释 GLMakie 肯定不是我们想要做的事情。使用上述设置,GLMakie 设置为在编译模式下运行,我们也从 sys 映像加载它。确保在根函数中使用 @run
宏并在 REPL 模式下进行调试。
当调试器点击所需的代码行时,我们可以在 mean
函数(Statistics)内执行单步并进行调试。