2017-09-22 40 views
0

我有一个应用程序,其中我被偶尔与崩溃:错误中是否有可能触发“无效内存地址或无指针解除引用”的内容?

恐慌:运行时错误:无效的内存地址或零指针引用 [信号SIGSEGV:分割违反代码=为0x1 ADDR = 0x20的PC = 0x122e64a]

跟踪不断导致返回语句返回一个结构和errors.New(“调试的一些文本:”+ err.Error())

该结构似乎没有任何东西可以解引用指针,但我重构了函数,因此它使用了一个按引用传递并且不需要返回该函数;它只返回errors.New()。恐慌仍然发生。

我经历了函数,并改变它,所以它只返回错误,没有errors.New()字符串加上err.Error()。现在我似乎无法再引发恐慌了......

所以问题:是否有关于errors.New()使用err.Error()连接到将导致该类型的恐慌返回声明?

编辑:添加的代码片段触发偶尔恐慌:

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

如果'err'为零,那么'err.Error'是一个'零指针解引用'。有可能'err.Error()'在其他地方解引用一个零指针,但是我们不能在没有你调用它的地方放置栈跟踪或上下文。 – JimB

+0

你可能会做'if err == nil {return errors.New(“用于调试的一些文本:”+ err.Error())}'而不是'if err!= nil'? – dave

+0

@JimB - 我的第一个冲动是认为err是零,但是回报是在“if err!= nil”块中。 –

回答

0

下面是一个例子,

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.

相关问题