今天我們開始使用GoLand進行一系列調(diào)試的最后一篇文章影锈。之前我們討論過諸如配置調(diào)試器和調(diào)試會話黎侈,如何控制調(diào)試器執(zhí)行流程和配置斷點以及即將到來的2019.1版本中的一些最新改進相嵌。
在今天的文章中魔种,我們將討論GoLand的兩個高級調(diào)試功能:核心轉(zhuǎn)儲調(diào)試和使用可逆調(diào)試器Mozilla rr悠栓。
調(diào)試核心轉(zhuǎn)儲
核心轉(zhuǎn)儲是在某個特定時間點運行的應(yīng)用程序的內(nèi)存快照色解。它們可以幫助我們可視化所有存在的goroutine痘昌,包含變量的所有值钥勋,以及每個活動goroutine的當(dāng)前執(zhí)行點。
目前辆苔,GoLand僅支持在Linux系統(tǒng)上采用的核心轉(zhuǎn)儲笔诵,但它可以在任何操作系統(tǒng)上讀取和分析它們。
有兩種方法可以獲得核心轉(zhuǎn)儲姑子。如果我們希望在進程因崩潰而終止時看到內(nèi)存中的值乎婿,我們需要將ulimit設(shè)置得相當(dāng)高,例如sudo ulimit -c unlimited
街佑,并配置以下環(huán)境變量GOTRACEBACK=crash
谢翎。這將使Go應(yīng)用程序在打印堆棧跟蹤并寫入核心轉(zhuǎn)儲文件時崩潰捍靠。
為了能夠從正在運行的進程中獲取核心轉(zhuǎn)儲而不必使其崩潰,我們需要在系統(tǒng)上安裝gdb并運行以下命令:
sudo ulimit -c unlimited
echo 0 | sudo tee -a /proc/sys/kernel/yama/ptrace_scope
請注意森逮,此值將在系統(tǒng)重新啟動時重置榨婆,您需要再次進行配置。
要生成和使用核心轉(zhuǎn)儲褒侧,我們需要配置IDE以將二進制文件保存在已知位置良风,例如我們的項目根目錄。
之后闷供,我們可以像往常一樣啟動應(yīng)用程序烟央,并開始向它發(fā)送請求。接下來歪脏,在確定應(yīng)用程序的進程ID之后疑俭,我們可以調(diào)用gcore <pid>
并獲取轉(zhuǎn)儲文件。
要研究IDE中的核心轉(zhuǎn)儲婿失,我們可以使用從遠程服務(wù)器生成的二進制和核心轉(zhuǎn)儲钞艇,也可以使用通過運行上述命令生成的二進制和核心轉(zhuǎn)儲。然后轉(zhuǎn)到Run | 打開Core Dump ... 并選擇可執(zhí)行文件和核心轉(zhuǎn)儲文件豪硅。這將打開調(diào)試器界面哩照,讓您查看正在運行的goroutine,線程懒浮,所有變量的值的列表飘弧。您可以使用“ 評估”功能來了解應(yīng)用程序當(dāng)前正在執(zhí)行的操作。
使用核心轉(zhuǎn)儲可以幫助您確定goroutine被卡住的位置嵌溢,有多少goroutine,以及在問題發(fā)生時它們在內(nèi)存中具有哪些值蹋岩。
Mozilla rr可逆調(diào)試器
但是赖草,使用核心轉(zhuǎn)儲是一個靜態(tài)過程。有時候一個bug很難復(fù)制剪个,需要很多調(diào)試會話才能重現(xiàn)它秧骑,然后再查看它是否有問題。
輸入可逆調(diào)試器扣囊。這些調(diào)試器不僅允許我們在執(zhí)行中前進乎折,而且還可以返回并有效地撤消步驟之間的所有操作。
Delve侵歇,GoLand使用的Go調(diào)試器通過使用Mozilla的rr項目支持這種功能骂澄。根據(jù)rr項目的描述,它的任務(wù)是允許“在調(diào)試器下重復(fù)執(zhí)行失敗的執(zhí)行惕虑,直到完全理解為止”坟冲。
使用rr的另一個好處是它在會話的錄制部分期間執(zhí)行開銷很低磨镶。這意味著它可以用于生產(chǎn)系統(tǒng)或類似生產(chǎn)的金絲雀系統(tǒng),以捕獲無法以其他方式復(fù)制的錯誤健提,然后在舒適的開發(fā)環(huán)境中進行調(diào)查琳猫。
讓我們看看這個在行動。
在我們開始之前私痹,rr可以運行的地方有一些嚴(yán)格的限制脐嫂,應(yīng)該提前知道。它只能在Linux上運行紊遵,并且對硬件/虛擬機功能有一些限制账千。這些會影響此調(diào)試解決方案的有用性。但是癞蚕,一旦環(huán)境滿足要求蕊爵,它將成為最強大的解決方案之一。
后安裝RR桦山,我們需要運行幾個命令攒射,使RR可以執(zhí)行記錄的部分:
echo -1 | sudo tee -a /proc/sys/kernel/perf_event_paranoid
echo 0 | sudo tee -a /proc/sys/kernel/kptr_restrict
這些設(shè)置不是永久性的,如果重新啟動機器恒水,則需要再次應(yīng)用這些設(shè)置会放。
單擊main函數(shù)旁邊的綠色箭頭,然后選擇Record and Debug ... 這將啟動所需的編譯步驟钉凌,然后使用rr后端啟動調(diào)試器咧最。
對于設(shè)計為連續(xù)運行的應(yīng)用程序,例如示例代碼中的Web服務(wù)器御雕,我們需要停止調(diào)試器矢沿,然后選擇Run | Debug Saved Trace ... 默認情況下,將選擇最新的rr會話酸纲,以便我們單擊OK按鈕啟動調(diào)試會話捣鲸。
對于終止的應(yīng)用程序,如CLI應(yīng)用程序闽坡,GoLand將自動啟動重播會話栽惶。
這是調(diào)試會話與常規(guī)調(diào)試會話不同的地方。在會話的“記錄”部分期間疾嗅,調(diào)試器不會在斷點處停止; 它只會在重播部分這樣做外厂。如果沒有設(shè)置斷點,則調(diào)試器將結(jié)束代承,我們需要手動重放上一個會話汁蝶,同時需要存在斷點 - 否則這將完成重播會話并退出而不停止。
如果存在斷點论悴,則調(diào)試器將停止穿仪,并且它將提供與正常調(diào)試器會話類似的體驗席爽。
至于“可逆”部分,這是使用rr的最佳部分發(fā)揮作用的地方啊片。如果在當(dāng)前執(zhí)行點之前放置斷點只锻,那么我們可以使用“倒帶”功能返回到它并從那里重試執(zhí)行。觀察變量或評估表達式等功能也會起作用紫谷。
我希望這篇文章將幫助您發(fā)現(xiàn)一個新的強大工具齐饮,可以加快查找和修復(fù)應(yīng)用程序中的錯誤。