我有一个应用程序,偶尔会崩溃:
panic:运行时错误:无效的内存地址或nil指针取消引用 [信号SIGSEGV:分段违规代码= 0x1 addr = 0x20 pc = 0x122e64a]
跟踪保持导致返回语句返回结构和errors.New("一些用于调试的文本:" + err.Error())
结构似乎没有任何可以取消引用指针的东西,但我重新构造了函数,因此它使用了引用传递,并且不需要返回函数;它只返回errors.New()。恐慌仍然发生。
我经历了这个函数并对其进行了更改,因此只返回错误,没有errors.New()字符串加上err.Error()。现在我似乎无法引发恐慌......
所以问题是:是否存在一些关于errors.New()的问题,使用err.Error()连接到一个字符串,该字符串会在return语句中引起这种类型的恐慌?
编辑:添加一段引发偶尔恐慌的代码:
strctStats.intThreadPool80ConnectionCount, err = strconv.ParseInt(strctStats.strThreadPool80ConnectionCount, 10, 64)
if err != nil {
// Exit external application; send the closing sequences
tmPause := time.NewTimer(time.Second * 2)
<-tmPause.C
stdIn.Write([]byte("close\n"))
tmPause = time.NewTimer(time.Second * 2)
<-tmPause.C
stdIn.Write([]byte("quit\n"))
return errors.New("Could not parse integer: " + err.Error())
}
编辑2:@lmars请求堆栈跟踪。这是转储到控制台的内容。不确定它是如何起作用的(你能解释一下除了函数堆栈和错误/调用产生的行号之外的什么吗?我对这些痕迹的处理工作很新)
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x122e64a]
goroutine 1 [running]:
main.JMXCheck(0xc42012c000, 0x1a, 0xc420018084, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/Users/bsilver/go/src/nagios_tomcat_threadinfo/nagios_tomcat_threadinfo.go:590 +0x38ca
main.main()
/Users/bsilver/go/src/nagios_tomcat_threadinfo/nagios_tomcat_threadinfo.go:146 +0x3cc
答案 0 :(得分:1)
这是一个例子,
package main
import (
"errors"
)
func f() error {
err := error(nil)
return errors.New("Could not parse integer: " + err.Error())
}
func main() {
f()
}
输出:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x44ecd6]
goroutine 1 [running]:
main.f(0xc420022070, 0xc420022070)
/home/peter/gopath/src/so/error.go:9 +0x26
main.main()
/home/peter/gopath/src/so/error.go:13 +0x22
exit status 2
请参阅How to create a Minimal, Complete, and Verifiable example.。