成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.17 新特性,優(yōu)化拋出的錯誤堆棧

開發(fā) 后端
平時在日常工程中,我們常常會用到異常恐慌(panic)的記錄和追蹤。最常見的就是,線上 panic 了之后,我們總想從中找到一些蛛絲馬跡。

[[420827]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯(lián)系腦子進煎魚了公眾號。

大家好,我是煎魚。

平時在日常工程中,我們常常會用到異常恐慌(panic)的記錄和追蹤。最常見的就是,線上 panic 了之后,我們總想從中找到一些蛛絲馬跡。

我們很多人是看 panic 是看他的調用堆棧。然后就開始猜,看代碼。猜測是不是哪里寫的有問題,就想知道 panic 是由什么參數(shù)引起的?

因為知道了誘發(fā)的參數(shù),排查問題就非常方便了。為此在 Go1.17,官方對這塊的調用堆棧信息展示進行了優(yōu)化,使其可讀性更友好。

案例

結合我們平時所使用的 panic 案例。如下:

  1. func main() { 
  2.  example(make([]string, 1, 2), "煎魚", 3) 
  3.  
  4. //go:noinline 
  5. func example(slice []string, str string, i int) error { 
  6.  panic("腦子進煎魚了"

運行結果:

  1. $ go run main.go 
  2. panic: 腦子進煎魚了 
  3.  
  4. goroutine 1 [running]: 
  5. main.example(0xc000032758, 0x1, 0x2, 0x1073d11, 0x6, 0x3, 0xc000102058, 0x1013201) 
  6.  /Users/eddycjy/go-application/awesomeProject/main.go:9 +0x39 
  7. main.main() 
  8.  /Users/eddycjy/go-application/awesomeProject/main.go:4 +0x68 
  9. exit status 2 

我們函數(shù)的入?yún)⑹牵篬]string、string、int,核心關注到 main.example 方法的調用堆棧信息:

  1. main.example( 
  2.     0xc000032758,  
  3.     0x1,  
  4.     0x2,  
  5.     0x1073d11,  
  6.     0x6,  
  7.     0x3,  
  8.     0xc000102058,  
  9.     0x1013201 

明明只是函數(shù)三個參數(shù),卻輸出了一堆,對應起來非常的不清晰。

其實際對應是:

  • slice:0xc000032758、0x1、0x2。
  • string:0x1073d11、0x6。
  • int:0x3。

這里存在的問題是,看調用堆棧的人,還得必須了解基本數(shù)據(jù)結構(例如:slice、string、int 等),他才知道每個函數(shù)入?yún)⑺麑獡碛袔讉€字段,才能知道其內存布局的結構,有一點麻煩。

并且從程序運行的角度來講,這么水平平鋪的方式,并不直觀和準確。因為不同類型他是多個字段組合成結構才能代表一個類型。這不得還要人為估測?

優(yōu)化

終于,這一塊的調用堆棧查看在 Go1.17 做了正式的改善。如下:

  1. $ go1.17 run main.go  
  2. panic: 腦子進煎魚了 
  3.  
  4. goroutine 1 [running]: 
  5. main.example({0x0, 0xc0000001a0, 0xc000034770}, {0x1004319, 0x60}, 0x0) 
  6.  /Users/eddycjy/go-application/awesomeProject/main.go:9 +0x27 
  7. main.main() 
  8.  /Users/eddycjy/go-application/awesomeProject/main.go:4 +0x47 
  9. exit status 2 

新版本的調用堆棧的信息改變:

  1. main.example( 
  2.     {0x0, 0xc0000001a0, 0xc000034770},  
  3.     {0x1004319, 0x60},  
  4.     0x0 

在 Go 語言以前的版本中,調用堆棧中的函數(shù)參數(shù)被打印成基于內存布局的十六進制值的形式,比較難以讀取。

在 Go1.17 后,每個函數(shù)的參數(shù)都會被單獨打印,并且以 “,” 隔開,復合數(shù)據(jù)類型(例如:結構體、數(shù)組、切片等)的參數(shù)會用大括號包裹起來,整體更易讀。

其實際對應如下:

  • slice:0x0, 0xc0000001a0, 0xc000034770。
  • string:0x1004319, 0x60。
  • int:0x0。

這里也有一塊細節(jié)要注意,你會發(fā)現(xiàn) Go1.17 的函數(shù)參數(shù)的數(shù)量和以往的版本相比,少了。是因為函數(shù)的返回值存在于寄存器中,而不會存儲到內存中。

因此函數(shù)返回值可能會是不準確的,所以也在新版本中也就不再打印了。

總結

在 Go1.17 的新版本中,調用堆棧的函數(shù)參數(shù)的可讀性得到了進一步的優(yōu)化和調整,在后續(xù)的使用上可能能夠帶來一定的排錯效率的提高。

你平時在借助調用堆棧排查問題呢,希望還獲得什么輔助呢?

參考

GoTip: New Stack Trace Output Wrong

cmd/compile: bad traceback arguments

Go 1.17新特性詳解:使用基于寄存器的調用慣例 

doc/go1.17: reword "results" in stack trace printing

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2021-09-05 18:25:30

Go命令倉庫

2021-08-30 10:49:39

Go語言編譯器

2021-05-30 22:53:05

Go1.17版本 tip

2021-08-19 09:37:06

Go 1.17語言架構

2024-08-07 09:59:56

2024-01-22 00:30:00

Go編程Go 1.22

2022-02-11 21:01:18

GoNetip網(wǎng)絡庫

2020-11-24 13:05:35

Go語言泛型

2025-04-27 08:00:35

2021-08-30 08:23:34

Go語言進程

2025-04-28 08:00:56

2022-01-26 09:02:57

GoCut方法

2021-02-02 09:10:12

Go語言二進制

2022-02-14 09:32:49

Go場景TryLock

2021-08-19 09:43:09

Fedora 35LLVMGo 1.17

2025-02-12 08:50:22

2023-02-06 08:51:30

PGO編譯速度

2022-01-19 08:51:00

Module工作區(qū)Go

2021-05-25 15:40:40

Edge深色主題瀏覽器

2025-01-20 08:51:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线视频一区 | 久久人| 久在线| 国产在线一区二区三区 | 在线91 | 亚洲免费视频一区二区 | 国产成人精品一区二区 | 国产精品久久久久久久免费观看 | 日本中文在线视频 | 欧美激情a∨在线视频播放 成人免费共享视频 | 青青草网站在线观看 | 久久一区二区三区免费 | 天天躁日日躁狠狠很躁 | 色999日韩 | 国产精品日韩欧美一区二区三区 | 精品欧美乱码久久久久久 | 日一区二区 | 日韩小视频在线 | 网络毛片 | 我想看一级黄色毛片 | 国产精品久久久久久久久久免费看 | 国产成人jvid在线播放 | 国产成人综合在线 | 国产精品av久久久久久毛片 | 亚洲久在线 | 国产精品毛片 | 日韩精品在线观看视频 | 欧美激情视频一区二区三区免费 | 91精品国产综合久久久久久 | 综合色久 | 伊人在线 | 中文字幕成人av | 欧美精品成人一区二区三区四区 | 一区二区三区视频在线观看 | 亚洲第一网站 | 国产h视频 | 国产精品精品视频一区二区三区 | 国产91在线播放精品91 | 狠狠综合久久av一区二区老牛 | 污书屋| 成人在线观看欧美 |