2017-09-22 108 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.

相關問題