GOLANG空指针崩溃时堆栈消失和解决方案
来源:互联网 发布:php websocket作用 编辑:程序博客网 时间:2024/06/05 04:39
原文:https://gocn.io/article/351
在错误处理这个文章中,tkk提出了空指针时堆栈消失的问题,看下面的例子:
package mainfunc 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 dereferencegoroutine 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 dereferencegoroutine 1 [running]:main.causedPanic() /tmp/sandbox416089181/main.go:13 +0x48main.run() /tmp/sandbox416089181/main.go:7 +0x20main.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会解决这个问题。
结贴。
阅读全文
0 0
- GOLANG空指针崩溃时堆栈消失和解决方案
- golang 空指针
- 指针为空的崩溃
- [xxx respondsToSelector:]message sent to deallocated instance和空地址崩溃 空指针
- 空指针引起的程序崩溃
- 空指针解引用会崩溃
- 关于堆栈和指针
- Golang结构体和指针
- 野指针和空指针
- 空指针和野指针
- 空指针和野指针
- 空指针和void*指针
- 空指针和void*指针
- 空指针和迷途指针
- 野指针和空指针
- 空指针和野指针
- 空指针和野指针
- 迷途指针和空指针
- 堆内存的GC机制
- linux下定时任务的方法crontab
- JS获取URL中参数值(QueryString)的方法
- 交互:更好的鼠标控制
- Java中的深拷贝(深复制)和浅拷贝(浅复制)
- GOLANG空指针崩溃时堆栈消失和解决方案
- listview全选反选等
- 小数与分数之间相互转化
- 多元线性回归模型和最小二乘法
- 不可滑动ListView、GridView
- c# Thread.Sleep与Task.Delay 区别
- 响应式布局总结
- Django的中间件
- 音频混音的算法实现