[golang]如何看懂調(diào)用堆棧

之前也有文章講過(guò)go調(diào)用堆棧的話題惊奇,但并沒(méi)有完全講清楚朦佩,這里補(bǔ)充里面缺漏的幾個(gè)點(diǎn)捺萌。

阻塞

goroutine 1 [select, 2 minutes]:

方括號(hào)里的select表示阻塞原因,具體定義見runtime.waitReason 新博。
后面的時(shí)間是阻塞時(shí)間薪夕。需要注意的是這只是一個(gè)大概時(shí)間,是在gc的過(guò)程中標(biāo)記的赫悄,所以如果這個(gè)goroutine不需要gc原献,那么永遠(yuǎn)也不會(huì)有值。

PC偏移

github.com/robfig/cron.(*Cron).run(0xc0000c44b0)
    cron.go:191 +0x28d

行號(hào)后面的16進(jìn)制數(shù)是什么埂淮?pc偏移姑隅。是指函數(shù)入口(cron.(*Cron).run)到調(diào)用處(也就是行號(hào)指位置)的指令位置偏差。一般很少用到倔撞,除非下面這種特殊情況:

func main() {
    rand.Seed(time.Now().UnixNano())
    _, _, _ = foo(), foo(), foo()
}

func foo() int {
    if rand.NormFloat64() > 0 {
        panic("")
    }
    return 0
}

//main.main()
//  main.go:10 +0x7b 或 +0x80 或 +0x85

函數(shù)參數(shù)

函數(shù)參數(shù)是最復(fù)雜的部分讲仰,牽涉到go的很多底層實(shí)現(xiàn)。

輸入?yún)?shù)误窖,輸出參數(shù)

為什么經(jīng)常只有一個(gè)參數(shù)的函數(shù)堆棧里卻跟著兩個(gè)數(shù)呢叮盘?另一個(gè)是輸出。

func main() {
    rand.Seed(time.Now().UnixNano())
    r := rand.Int() //2e78e7b163438cc2
    fmt.Printf("%x\n", r)
    foo(r)
}

func foo(i int) (o int) {
    o = rand.Int() //36dd26e720cac1fe
    fmt.Printf("%x\n", o)
    defer panic("want to panic")
    return
}

//main.foo(2e78e7b163438cc2, 36dd26e720cac1fe)
//  main.go:21 +0xdd
結(jié)構(gòu)體展開

結(jié)構(gòu)體會(huì)被展開霹俺,然后比較短的字段會(huì)被打包成一個(gè)uint柔吼。

type S struct {
    a int
    b int
    c int
    d int
    a1 bool
    b1 byte
    c1 bool
    d1 byte
}

func main() {
    foo(S{})
}

func foo(s S) {
    panic("want to panic")
    noInline()
}

func noInline() {
    fmt.Sprint()
}

//main.foo(0x0, 0x0, 0x0, 0x0, 0x0)
//  main.go:67 +0x39

但是這種打包是依賴字段順序的。

type S struct {
    a int
    a1 bool
    b int
    b1 bool
    c int
    c1 bool
    d int
    d1 bool
}

func main() {
    foo(S{})
}

func foo(s S) {
    panic("want to panic")
    noInline()
}

func noInline() {
    fmt.Sprint()
}

//main.foo(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
//  main.go:67 +0x39
函數(shù)參數(shù)對(duì)照表

下面的表涵蓋了大部分情況

函數(shù)簽名 輸入 堆棧輸出 說(shuō)明
foo(float64) 1 (0x3ff0000000000000)
foo(complex64) 1+3i (0x404000003f800000) 兩個(gè)32位浮點(diǎn)打包為一個(gè)64位數(shù)
foo(complex128) 1+3i (0x3ff0000000000000, 0x4008000000000000)
foo(string) "中文" (0x10adc82, 0x6) (指針丙唧,字節(jié)數(shù))
foo(interface{}) "" (0x108e520, 0x10bff30) (類型指針愈魏,值指針)
foo(interface{}) (*string)(nil) (0x108b8e0, 0x0) 值為nil,類型不為nil
foo(interface{}) nil (0x0, 0x0) 值想际,類型都為nil
foo([]byte) make([]byte,3,6) (0xc000070f82, 0x3, 0x6) (指針培漏,len,cap)
foo(map[string]string) make(map[string]string) (0xc000070e48)
foo(chan struct{}) make(chan struct{}) (0xc00005e060)
foo([200]int) [200]int{} (0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...) 數(shù)組展開
foo(func()) nil (0x0)
foo(int16, uint16) 1,2 (0xc000020001) 兩個(gè)16位數(shù)打包為32位數(shù)胡本,僅低32位有效
foo(bool)bool false (0xc000070f00, 0xc00005c058) 前一個(gè)數(shù)為輸入牌柄,僅低8位有效,后一個(gè)數(shù)為輸出侧甫,未初始化
foo(struct {a,b int}) struct {a,b int}{} (0x0, 0x0) 結(jié)構(gòu)體展開
foo(struct {a int;b bool;c int;d bool;e byte}) struct {a int;b bool;c byte;d bool;e byte}{1,true,2,false,3} (0x1, 0x1, 0x2, 0x300) d珊佣,e合并,b不合并
foo(struct {a int;b bool;c string;d bool;e byte}) struct {a int;b bool;c string;d bool;e byte}{1,true,"a",false,3} (0x1, 0x1, 0x10adb18, 0x1, 0x300) d披粟,e合并
foo(struct {a struct{a,b byte};b bool}) struct {a struct{a,b byte};b bool}{struct{a,b byte}{3,4},true} (0xc000010403) 內(nèi)嵌結(jié)構(gòu)體合并
foo(struct {a struct{a int;b byte};b bool}) struct {a struct{a int;b byte};b bool}{struct {a int;b byte}{5 , 7 },false} (0x5, 0xc000072f07, 0xc00005e000) 內(nèi)嵌結(jié)構(gòu)體不合并
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咒锻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子守屉,更是在濱河造成了極大的恐慌惑艇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇泛,死亡現(xiàn)場(chǎng)離奇詭異滨巴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)俺叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門兢卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绪颖,你說(shuō)我怎么就攤上這事秽荤。” “怎么了柠横?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窃款,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牍氛,道長(zhǎng)晨继,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任搬俊,我火速辦了婚禮紊扬,結(jié)果婚禮上蜒茄,老公的妹妹穿的比我還像新娘。我一直安慰自己餐屎,他們只是感情好檀葛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腹缩,像睡著了一般屿聋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藏鹊,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天润讥,我揣著相機(jī)與錄音,去河邊找鬼盘寡。 笑死楚殿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竿痰。 我是一名探鬼主播勒魔,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菇曲!你這毒婦竟也來(lái)了冠绢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤常潮,失蹤者是張志新(化名)和其女友劉穎弟胀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊式,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孵户,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岔留。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夏哭。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖献联,靈堂內(nèi)的尸體忽然破棺而出竖配,到底是詐尸還是另有隱情,我是刑警寧澤里逆,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布进胯,位于F島的核電站,受9級(jí)特大地震影響原押,放射性物質(zhì)發(fā)生泄漏胁镐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盯漂。 院中可真熱鬧颇玷,春花似錦、人聲如沸就缆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)违崇。三九已至阿弃,卻和暖如春诊霹,著一層夾襖步出監(jiān)牢的瞬間羞延,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工脾还, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伴箩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓鄙漏,卻偏偏與公主長(zhǎng)得像嗤谚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怔蚌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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

  • 一巩步、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,748評(píng)論 0 10
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,831評(píng)論 0 38
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,174評(píng)論 0 2
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方桦踊,同時(shí)不同JDK版本的...
    高廣超閱讀 15,625評(píng)論 3 83
  • 血在嘶吼椅野, 盔甲在棄散, 我把尊嚴(yán)放入籃子 和死亡一起籍胯, 我曾用短刃刺穿暴怒竟闪, 曾流淚祈求苦難寬恕, 現(xiàn)在杖狼, 敵人...
    葡萄美酒閱讀 223評(píng)論 0 0