今日、かなり大きなプロジェクトにいくつかの変更を加えましたが、奇妙な動作が発生しています。私はナックルヘッドなので、過去に戻って自分が何をしたかを理解することはできません。
しかし、私の質問の主な目的は、出力されるスタック トレースの負の行番号をどのように理解すべきかということです。以下-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
いくつかのパッケージが有効です。上記の 3 つのファイルはすべて異なるパッケージであり、これはインポート中に発生しているようです。
ここまで読んでいただけたでしょうか。ここが最も奇妙な部分です。この宣言を に追加するmain.go
と、エラーはなくなります!
var test = func() int { return 1 }() // Everything is fine now!
非常に紛らわしいです!やっても治りませんvar test = "foobar"
。呼び出された である必要がありますfunc
。
-1218
どんな洞察も高く評価されますが、ほとんどの場合、トレースに興味があります。
アップデート
これを、問題を再現する小さな例に落とし込もうとしています。作業後、元のコードに戻し、マシンを再起動しました。
初めてビルドして実行しようとしたとき、スタック トレースの先頭に 2 つの新しいエントリが追加されました。ただし初回のみ。
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.s
行があり14
ます。
MOVL 4(SP), AX // syscall entry
も見つけましたzerrors_linux_386.go
が、線はありません2225
。ファイルはその行のずっと前に停止します。