GOLANG空指標崩潰時堆疊消失和解決方案
在錯誤處理這個文章中,tkk提出了空指標時堆疊消失的問題,看下面的例子:
package main
func main() {
run() // line 4
}
func run() {
causedPanic()
}
func causedPanic() {
//defer func() {}() // line 10
//panic("Panic from user") // line 11
var p *byte
*p = 0 // line 13
}
這個程式崩潰時,列印的竟然是:
panic: runtime error: invalid memory address or nil pointer dereference
goroutine 1 [running]:
main.main()
/tmp/sandbox277759147/main.go:4 +0x4
神奇的是,把第 10 行的 defer 開啟,變成這樣:
func causedPanic() {
defer func() {}() // line 10
//panic("Panic from user") // line 11
var p *byte
*p = 0 // line 13
}
堆疊神奇的回來了:
panic: runtime error: invalid memory address or nil pointer dereference
goroutine 1 [running]:
main.causedPanic()
/tmp/sandbox416089181/main.go:13 +0x48
main.run()
/tmp/sandbox416089181/main.go:7 +0x20
main.main()
/tmp/sandbox416089181/main.go:4 +0x20
而主動呼叫 panic 堆疊也是沒有問題的,可以把第 10 行註釋掉,同時開啟第 11 行。這個問題確實很詭異,在 go-nuts 中發了一篇文章問,strange stack trace when panic,馬上就有神回覆了:
On Wednesday, June 7, 2017 at 4:25:35 PM UTC+8, Dave Cheney wrote:
Try building your program with -gcflags="-l" to disable inlining.
If that restores the stacktrace, then it's inlining.
The good news is this should be fixed with Go 1.9
果然,執行時加上這個引數 (編譯時加上也是可以的),禁用內聯編譯後,堆疊就回來了:
go run -gcflags="-l" t.go
難怪了,主動呼叫 panic 時,內聯編譯不會把函式懟一坨去,如果沒有 defer 和 panic 這種函式,就可能把函式懟一坨,看起來像是一個函式,堆疊消失了,這樣在空指標時就找不到堆疊資訊。
解決方案:
- 編譯時加引數
-gcflags="-l"
- 可能在 GO1.9 會解決這個問題。
結貼。
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- VC++ 崩潰處理以及列印呼叫堆疊C++
- [golang]如何看懂呼叫堆疊Golang
- CrashSight異常崩潰管理解決方案
- Android7.1.1Toast崩潰解決方案AndroidAST
- MySQL 資料庫崩潰(crash)的常見原因和解決辦法MySql資料庫
- golang指標Golang指標
- golang 指標Golang指標
- 野指標 空指標指標
- WkWebView 令人崩潰的崩潰WebView
- Android中Activity頻繁進入再退出時程式崩潰的解決方案Android
- Node出錯導致執行崩潰的解決方案
- 解決PythonWin執行時崩潰的辦法Python
- 記錄一次解決App崩潰問題的解決方案APP
- Linphone SIP堆疊錯誤可允許攻擊者遠端使客戶端裝置崩潰客戶端
- 虛解構函式? vptr? 指標偏移?多型陣列? delete 基類指標 記憶體洩漏?崩潰?函式指標多型陣列delete記憶體
- win10 pr崩潰怎麼解決_win10 pr崩潰解決辦法Win10
- 虛擬地址空間,堆疊,堆,資料段,程式碼段
- Javascript中遞迴造成的堆疊溢位及解決方案JavaScript遞迴
- GOLANG測試必須用帶堆疊的errorsGolangError
- 防止空指標指標
- WKWebView崩潰WebView
- Redis崩潰Redis
- 乾貨|安卓APP崩潰捕獲方案——xCrash安卓APP
- [解決] Goland 開啟後直接崩潰GoLand
- Android 12 “致命”崩潰解決之路Android
- 不一樣的 Android 堆疊抓取方案Android
- 深入理解 Golang 指標Golang指標
- JS 堆疊JS
- java堆疊Java
- 平衡堆疊
- 堆疊圖
- 絕地求生崩潰怎麼解決win10_win10絕地求生崩潰的解決方法Win10
- Crittercism:KitKat崩潰率0.7% iOS 7.1崩潰率1.6%iOS
- APP防崩潰APP
- C++記錄程式崩潰時的dumpfileC++
- Hbase master gone 系統崩潰. 遭遇 hbase bug 以及對應的解決方案.ASTGo
- 微軟釋出win10累積更新導致Microsoft Visio卡死或崩潰臨時解決方案微軟Win10ROS
- WWDC 2018:理解崩潰以及崩潰日誌