错误中是否存在可能触发"无效内存地址或nil指针解除引用的问题"?

时间:2017-09-22 20:21:24

标签: go runtime-error

我有一个应用程序,偶尔会崩溃:

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

1 个答案:

答案 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.