如何解释堆栈跟踪中的负行号

时间:2013-05-31 01:09:21

标签: go

我今天对我的一个相当大的项目进行了一些更改,现在我得到了一些奇怪的行为。因为我是个傻瓜,我不能回去弄清楚我做了什么。

但我的问题的主要内容是我应该如何理解打印的堆栈跟踪中的负数行。下面的-1218是我的意思。

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x1 pc=0x80501f2]

goroutine 1 [running]:
server.init()              //     vv-------------RIGHT HERE
    /home/.../debugComponent.go:-1218 +0x282
_/home/.../possessions.init()
    /home/.../possessions.go:29 +0x42
_/home/.../pageWrap.init()
    /home/.../pageWrap.go:112 +0x47

main.init()
    /home/.../main.go:0 +0x3c

goroutine 2 [syscall]:

goroutine 3 [runnable]:

关联的debugComponent.go文件现在非常不重要,所以我将其删除以查看会发生什么,文件名只会被另一个文件名替换,并且会有不同的负数。

我在开发这个应用程序时不得不发现很多错误,但是这个让我感到难过。


如果有帮助,那就是main.go,然后是几个正在运行的软件包。上面列出的三个文件都是不同的软件包,这似乎是在导入过程中发生的。


我希望你读到这里,因为这是最奇怪的部分。如果我将此声明添加到main.go,则错误消失!

var test = func() int { return 1 }() // Everything is fine now!

非常混乱!如果我var test = "foobar",它就无法解决问题。它必须是被调用的func


我们很感激任何见解,但大多数时候我都很好奇跟踪中的-1218


更新

我正试图将其归结为一个重现问题的小例子。在完成它之后,我恢复了原始代码,然后重新启动了机器。

我第一次尝试构建和运行时,在堆栈跟踪的顶部添加了两个新条目。但这只是第一次。

goroutine 1 [syscall]:
syscall.Syscall()
    /usr/local/go/src/pkg/syscall/asm_linux_386.s:14 +0x5
syscall.Mkdir(0x83a2f18, 0x2, 0x2, 0x806255e, 0x83a2f1c, ...)
    /usr/local/go/src/pkg/syscall/zerrors_linux_386.go:2225 +0x80
server.init()

所以这符合我关于解释堆栈跟踪的主要问题。 -1218仍然存在,但现在有这些。

asm_linux_386.s14

MOVL    4(SP), AX       // syscall entry

我也发现了zerrors_linux_386.go,但没有行2225。该文件在该行之前很久就会停止。

2 个答案:

答案 0 :(得分:2)

已经报告并接受为Issue 5243

答案 1 :(得分:0)

  

Program execution

     

通过分配初始值来初始化没有导入的包   到它的所有包级变量,然后调用任何包级别   具有

的名称和签名的函数      

func init()

     

在其来源中定义。包含范围或文件范围标识符   名称init只能声明为具有此签名的函数。   即使在单个源中,也可以定义多个这样的功能   文件;它们以未指定的顺序执行。

     

在包中,初始化包级变量,和   根据参考顺序确定常数值:if   A的初始化程序取决于BA将在B之后设置。依赖   分析不依赖于项目的实际值   初始化,仅限于它们在源头中的外观。 A取决于B if   A的值包含B的提及,包含一个值   初始值设定项提及B,或提及提及B的函数,   递归。如果这种依赖性形成一个循环,那就是错误。如果两个   项目不是相互依赖的,它们将在订单中初始化   它们出现在源中,可能出现在多个文件中   编译器。由于每个包都进行了依赖性分析   如果A的初始化程序调用函数,则可以生成未指定的结果   在另一个引用B的包中定义。

     

无法从程序中的任何位置引用init函数。在   特别是,init不能显式调用,也不能指向   init被分配给函数变量。

     

如果包具有导入,则之前初始化导入的包   初始化包本身。如果多个包导入包   PP只会初始化一次。

     

通过施工进口包裹可以保证可以   在初始化中没有循环依赖。

     

通过链接单个未经插入的包来创建完整的程序   将main包称为它导入的所有包,   及物动词。 main包必须具有包名main并声明   函数main,不带参数,不返回任何值。

     

func main() { … }

     

程序执行从初始化main包然后开始   调用函数main。当函数main返回时,   程序退出。它不等待其他(非main)goroutines   完整。

     

包初始化 - 变量初始化和调用   init函数 - 发生在单个goroutine中,顺序发生一个   一次打包。 init函数可以启动其他goroutine   可以与初始化代码同时运行。然而,   初始化始终对init函数进行排序:它不会启动   下一个init,直到前一个返回。

当程序开始执行时,它会初始化包变量并执行init个函数。添加包变量将改变初始化。看起来debugComponent.go中与server.init()相关的内容初始化失败。负数可能是一个错误。

没有源代码,很难说更多。