使用GoLand進行調(diào)試 3- 高級調(diào)試功能

FlorinP??an20193月4日發(fā)表

今天我們開始使用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以將二進制文件保存在已知位置良风,例如我們的項目根目錄。

使用GoLand進行調(diào)試 - 18

之后闷供,我們可以像往常一樣啟動應(yīng)用程序烟央,并開始向它發(fā)送請求。接下來歪脏,在確定應(yīng)用程序的進程ID之后疑俭,我們可以調(diào)用gcore <pid>并獲取轉(zhuǎn)儲文件。

使用GoLand進行調(diào)試19

要研究IDE中的核心轉(zhuǎn)儲婿失,我們可以使用從遠程服務(wù)器生成的二進制和核心轉(zhuǎn)儲钞艇,也可以使用通過運行上述命令生成的二進制和核心轉(zhuǎn)儲。然后轉(zhuǎn)到Run | 打開Core Dump ... 并選擇可執(zhí)行文件和核心轉(zhuǎn)儲文件豪硅。這將打開調(diào)試器界面哩照,讓您查看正在運行的goroutine,線程懒浮,所有變量的值的列表飘弧。您可以使用“ 評估”功能來了解應(yīng)用程序當(dāng)前正在執(zhí)行的操作。

使用GoLand進行調(diào)試 - 20

使用核心轉(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)試器咧最。

使用GoLand進行調(diào)試 - 21

對于設(shè)計為連續(xù)運行的應(yīng)用程序,例如示例代碼中的Web服務(wù)器御雕,我們需要停止調(diào)試器矢沿,然后選擇Run | Debug Saved Trace ... 默認情況下,將選擇最新的rr會話酸纲,以便我們單擊OK按鈕啟動調(diào)試會話捣鲸。

使用GoLand進行調(diào)試 - 22

對于終止的應(yīng)用程序,如CLI應(yīng)用程序闽坡,GoLand將自動啟動重播會話栽惶。

這是調(diào)試會話與常規(guī)調(diào)試會話不同的地方。在會話的“記錄”部分期間疾嗅,調(diào)試器不會在斷點處停止; 它只會在重播部分這樣做外厂。如果沒有設(shè)置斷點,則調(diào)試器將結(jié)束代承,我們需要手動重放上一個會話汁蝶,同時需要存在斷點 - 否則這將完成重播會話并退出而不停止。

如果存在斷點论悴,則調(diào)試器將停止穿仪,并且它將提供與正常調(diào)試器會話類似的體驗席爽。

使用GoLand進行調(diào)試 - 23

至于“可逆”部分,這是使用rr的最佳部分發(fā)揮作用的地方啊片。如果在當(dāng)前執(zhí)行點之前放置斷點只锻,那么我們可以使用“倒帶”功能返回到它并從那里重試執(zhí)行。觀察變量或評估表達式等功能也會起作用紫谷。

使用GoLand進行調(diào)試 - 24

我希望這篇文章將幫助您發(fā)現(xiàn)一個新的強大工具齐饮,可以加快查找和修復(fù)應(yīng)用程序中的錯誤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笤昨,一起剝皮案震驚了整個濱河市祖驱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞒窒,老刑警劉巖捺僻,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異崇裁,居然都是意外死亡匕坯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門拔稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葛峻,“玉大人,你說我怎么就攤上這事巴比∈踅保” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵轻绞,是天一觀的道長采记。 經(jīng)常有香客問我,道長政勃,這世上最難降的妖魔是什么唧龄? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮稼病,結(jié)果婚禮上选侨,老公的妹妹穿的比我還像新娘掖鱼。我一直安慰自己然走,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布戏挡。 她就那樣靜靜地躺著芍瑞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褐墅。 梳的紋絲不亂的頭發(fā)上拆檬,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天洪己,我揣著相機與錄音,去河邊找鬼竟贯。 笑死答捕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屑那。 我是一名探鬼主播拱镐,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼持际!你這毒婦竟也來了沃琅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜘欲,失蹤者是張志新(化名)和其女友劉穎益眉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姥份,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡郭脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了殿衰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朱庆。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闷祥,靈堂內(nèi)的尸體忽然破棺而出娱颊,到底是詐尸還是另有隱情,我是刑警寧澤凯砍,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布箱硕,位于F島的核電站,受9級特大地震影響悟衩,放射性物質(zhì)發(fā)生泄漏剧罩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一座泳、第九天 我趴在偏房一處隱蔽的房頂上張望惠昔。 院中可真熱鬧,春花似錦挑势、人聲如沸镇防。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽来氧。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啦扬,已是汗流浹背中狂。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扑毡,地道東北人胃榕。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像瞄摊,于是被迫代替她去往敵國和親勤晚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容