我希望有人能向我解释Golang堆栈跟踪的一个小细节,但大部分我所读的教程都忽略了。
我得到的堆栈跟踪示例:

1
2
3
4
5
6
7
8
9
10
    goroutine 6 [running]:
    net/http.(*conn).serve.func1(0xc42005ad00)
        /usr/local/go/src/net/http/server.go:1491 +0x12a
    panic(0x8079e0, 0xc42000c0c0)
        /usr/local/go/src/runtime/panic.go:458 +0x243
    usos-shop-back/usosapi.GetJson(0x0, 0x7d7820, 0xc4202f6d00, 0x0, 0x0)
        /root/go/src/usos-shop-back/usosapi/usos-hackery.go:20 +0x38
    ...
    ...
    ...

所以我真的很好奇+0x12a+0x243+0x38在代码中发生错误的行数之后的含义。

谢谢,
R.C.

附言:恐慌是由指向func GetJson(*http.Response, interface{}) error的空指针引起的

  • 它是堆栈框架PC和功能输入PC之间的区别。 (特定于实现的堆栈跟踪格式可能不是StackOverflow的好问题)
  • @JimB,谢谢,那时我有一些维基文章可供阅读。 但是我想知道为什么对SO来说这不是一个好问题吗? 会导致火焰大战吗? 还有其他的XYZexchange吗?
  • 该主题更多的是灰色区域,主要是因为实现细节可能不适用于所有流行的实现,可以更改,有时变化很快,从而使问题或答案过时和/或产生误导。 并不是说go1的堆栈跟踪格式可能会在此时改变,但是例如其他GODEBUG输出在版本之间已经发生了显着变化,因为它需要反映实现。

It's the difference between the stack frame PC and the function entry PC.

感谢JimB