GOLANG空指针崩溃时堆栈消失和解决方案
发布时间:2020-12-16 18:13:09 所属栏目:大数据 来源:网络整理
导读:原文:https://gocn.io/article/351 在错误处理这个文章中,tkk提出了空指针时堆栈消失的问题,看下面的例子: package main func main() { run() // line 4 } func run() { causedPanic()} func causedPanic() { //defer func() {}() // line 10 //panic("P
原文:https://gocn.io/article/351 在错误处理这个文章中,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这种函数,就可能把函数怼一坨,看起来像是一个函数,堆栈消失了,这样在空指针时就找不到堆栈信息。 解决方案:
结贴。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |