調(diào)試Go語(yǔ)言的核心轉(zhuǎn)儲(chǔ)(Core Dumps)

翻譯原文鏈接 轉(zhuǎn)帖/轉(zhuǎn)載請(qǐng)注明出處

英文原文鏈接【Go, the unwritten parts】 發(fā)表于2017/05/22 作者JBD是Go語(yǔ)言開(kāi)發(fā)小組成員

檢查程序的執(zhí)行路徑和當(dāng)前狀態(tài)是非常有用的調(diào)試手段诈火。核心文件(core file)包含了一個(gè)運(yùn)行進(jìn)程的內(nèi)存轉(zhuǎn)儲(chǔ)和狀態(tài)恃逻。它主要是用來(lái)作為事后調(diào)試程序用的涡相。它也可以被用來(lái)查看一個(gè)運(yùn)行中的程序的狀態(tài)涡匀。這兩個(gè)使用場(chǎng)景使調(diào)試文件轉(zhuǎn)儲(chǔ)成為一個(gè)非常好的診斷手段。我們可以用這個(gè)方法來(lái)做事后診斷和分析線上的服務(wù)(production services)纽哥。

在這篇文章中背率,我們將用一個(gè)簡(jiǎn)單的hello world網(wǎng)站服務(wù)作為例子。在現(xiàn)實(shí)中羡铲,我們的程序很容易就會(huì)變得很復(fù)雜蜂桶。分析核心轉(zhuǎn)儲(chǔ)給我們提供了一個(gè)機(jī)會(huì)去重構(gòu)程序的狀態(tài)并且查看只有在某些條件/環(huán)境下才能重現(xiàn)的案例。

作者注: 這個(gè)調(diào)試流程只在Linux上可行也切。我不是很確定它是否在其它Unixs系統(tǒng)上工作扑媚。macOS對(duì)此還不支持腰湾。Windows現(xiàn)在也不支持。

在我們開(kāi)始前疆股,需要確保核心轉(zhuǎn)儲(chǔ)的ulimit設(shè)置在合適的范圍费坊。它的缺省值是0,意味著最大的核心文件大小是0旬痹。我通常在我的開(kāi)發(fā)機(jī)器上將它設(shè)置成unlimited附井。使用以下命令:

$ ulimit -c unlimited

接下來(lái),你需要在你的機(jī)器上安裝delve两残。

下面我們使用的main.go文件永毅。它注冊(cè)了一個(gè)簡(jiǎn)單的請(qǐng)求處理函數(shù)(handler)然后啟動(dòng)了HTTP服務(wù)。

$ cat main.go
package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "hello world\n")
    })
    log.Fatal(http.ListenAndServe("localhost:7777", nil))
}

讓我們編譯并生產(chǎn)二進(jìn)制文件磕昼。

$ go build .

現(xiàn)在讓我們假設(shè)卷雕,這個(gè)服務(wù)器出了些問(wèn)題,但是我們并不是很確定問(wèn)題的根源票从。你可能已經(jīng)在程序里加了很多輔助信息漫雕,但還是無(wú)法從這些調(diào)試信息中找出線索。通常在這種情況下峰鄙,當(dāng)前進(jìn)程的快照會(huì)非常有用浸间。我們可以用這個(gè)快照深入查看程序的當(dāng)前狀態(tài)。

有幾個(gè)方式來(lái)獲取核心文件吟榴。你可能已經(jīng)熟悉了奔潰轉(zhuǎn)儲(chǔ)(crash dumps)魁蒜。它們是在一個(gè)程序奔潰的時(shí)候?qū)懭氪疟P(pán)的核心轉(zhuǎn)儲(chǔ)。Go語(yǔ)言在缺省設(shè)置下不會(huì)生產(chǎn)奔潰轉(zhuǎn)儲(chǔ)吩翻。但是當(dāng)你把GOTRACEBACK環(huán)境變量設(shè)置成“crash”兜看,你就可以用Ctrl+backslash才觸發(fā)奔潰轉(zhuǎn)儲(chǔ)。如下圖所示:

$ GOTRACEBACK=crash ./hello
(Ctrl+\)

上面的操作會(huì)使程序終止狭瞎,將堆棧跟蹤(stack trace)打印出來(lái)细移,并把核心轉(zhuǎn)儲(chǔ)文件寫(xiě)入磁盤(pán)。

另外個(gè)方法可以從一個(gè)運(yùn)行的程序獲得核心轉(zhuǎn)儲(chǔ)而不需要終止相應(yīng)的進(jìn)程熊锭。gcore可以生產(chǎn)核心文件而無(wú)需使運(yùn)行中的程序退出弧轧。

$ ./hello &
$ gcore 546 # 546 is the PID of hello.

根據(jù)上面的操作,我們獲得了轉(zhuǎn)儲(chǔ)而沒(méi)有終止對(duì)應(yīng)的進(jìn)程碗殷。下一步就是把核心文件加載進(jìn)delve并開(kāi)始分析精绎。

$ dlv core ./hello core.546

差不多就這些。delve的常用操作都可以使用锌妻。你可以backtrace代乃,list,查看變量等等从祝。有些功能不可用因?yàn)槲覀兪褂玫暮诵霓D(zhuǎn)儲(chǔ)是一個(gè)快照而不是正在運(yùn)行的進(jìn)程襟己。但是程序執(zhí)行路徑和狀態(tài)全部可以訪問(wèn)引谜。

(dlv) bt
 0  0x0000000000457774 in runtime.raise
    at /usr/lib/go/src/runtime/sys_linux_amd64.s:110
 1  0x000000000043f7fb in runtime.dieFromSignal
    at /usr/lib/go/src/runtime/signal_unix.go:323
 2  0x000000000043f9a1 in runtime.crash
    at /usr/lib/go/src/runtime/signal_unix.go:409
 3  0x000000000043e982 in runtime.sighandler
    at /usr/lib/go/src/runtime/signal_sighandler.go:129
 4  0x000000000043f2d1 in runtime.sigtrampgo
    at /usr/lib/go/src/runtime/signal_unix.go:257
 5  0x00000000004579d3 in runtime.sigtramp
    at /usr/lib/go/src/runtime/sys_linux_amd64.s:262
 6  0x00007ff68afec330 in (nil)
    at :0
 7  0x000000000040f2d6 in runtime.notetsleep
    at /usr/lib/go/src/runtime/lock_futex.go:209
 8  0x0000000000435be5 in runtime.sysmon
    at /usr/lib/go/src/runtime/proc.go:3866
 9  0x000000000042ee2e in runtime.mstart1
    at /usr/lib/go/src/runtime/proc.go:1182
10  0x000000000042ed04 in runtime.mstart
    at /usr/lib/go/src/runtime/proc.go:1152

(dlv) ls
> runtime.raise() /usr/lib/go/src/runtime/sys_linux_amd64.s:110 (PC: 0x457774)
   105:     SYSCALL
   106:     MOVL    AX, DI  // arg 1 tid
   107:     MOVL    sig+0(FP), SI   // arg 2
   108:     MOVL    $200, AX    // syscall - tkill
   109:     SYSCALL
=> 110:     RET
   111:
   112: TEXT runtime·raiseproc(SB),NOSPLIT,$0
   113:     MOVL    $39, AX // syscall - getpid
   114:     SYSCALL
   115:     MOVL    AX, DI  // arg 1 pid
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牍陌,一起剝皮案震驚了整個(gè)濱河市擎浴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毒涧,老刑警劉巖贮预,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異契讲,居然都是意外死亡仿吞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)捡偏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)唤冈,“玉大人,你說(shuō)我怎么就攤上這事银伟∧愫纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵彤避,是天一觀的道長(zhǎng)傅物。 經(jīng)常有香客問(wèn)我,道長(zhǎng)琉预,這世上最難降的妖魔是什么董饰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮圆米,結(jié)果婚禮上卒暂,老公的妹妹穿的比我還像新娘。我一直安慰自己娄帖,他們只是感情好也祠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著块茁,像睡著了一般齿坷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上数焊,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天永淌,我揣著相機(jī)與錄音,去河邊找鬼佩耳。 笑死遂蛀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的干厚。 我是一名探鬼主播李滴,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼螃宙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了所坯?” 一聲冷哼從身側(cè)響起谆扎,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芹助,沒(méi)想到半個(gè)月后堂湖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡状土,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年无蜂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒙谓。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斥季,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出累驮,到底是詐尸還是另有隱情酣倾,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布慰照,位于F島的核電站灶挟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毒租。R本人自食惡果不足惜稚铣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墅垮。 院中可真熱鬧惕医,春花似錦、人聲如沸算色。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灾梦。三九已至峡钓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間若河,已是汗流浹背能岩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萧福,地道東北人拉鹃。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親膏燕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥屈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問(wèn)題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,784評(píng)論 0 27
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理坝辫,服務(wù)發(fā)現(xiàn)篷就,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 在家已經(jīng)呆了一個(gè)月阀溶,下午要離開(kāi)腻脏,本來(lái)在家覺(jué)得無(wú)聊萬(wàn)分鸦泳,但真正到了離開(kāi)的時(shí)刻银锻,卻萬(wàn)分不舍,想著再多呆一秒做鹰,一秒也好击纬。...
    樹(shù)深時(shí)見(jiàn)鹿1998閱讀 229評(píng)論 0 1
  • 不知道從什么時(shí)候開(kāi)始,生活中開(kāi)始掀起了一股“跑步熱”钾麸。上到九十九更振,下至剛會(huì)走,幾乎沒(méi)有不跑步的饭尝。 跑步能夠能夠這么...
    5fc1bc4f8056閱讀 509評(píng)論 1 4
  • 搬進(jìn)了新家肯腕,天天在每個(gè)房間里躥來(lái)躥去,歡騰的不行钥平,心里想著:“啊实撒,很高很高的家了,啊涉瘾,有自己的房間了知态,每天早上...
    彌月_撒納閱讀 218評(píng)論 0 1