堆栈跟踪中的这些数字是什么意思?
goroutine 1 [running]:
runtime/debug.Stack(0x467a05, 0xc000000180, 0x200000003)
/usr/lib/golang/src/runtime/debug/stack.go:24 +0x80
runtime/debug.PrintStack()
/usr/lib/golang/src/runtime/debug/stack.go:16 +0x18
main.test3()
/tmp/test_stacktrace.go:18 +0x101
您如何理解以下这些词?
回答
这些是传递给各种函数的各种参数的原始(计算机指令级)值。嗯,也就是说,括号中的那些 -+0x101是机器代码中的程序计数器偏移量。
要理解它们,您必须查看原始计算机代码,或使用调试器。调试器使用编译器留下的跟踪信息将“计算机寄存器%rax保持0x467a05”(或其他)转换为“变量 x 保持值......”(对于某些值,例如可能是字符串)。
如果您不确定它们代表什么,请只关注堆栈跟踪中的名称和行号。你在功能main.test318行,当你调用的函数PrintStack在运行时代码。
- @wate 那是因为`debug.PrintStack` 使用这三个参数调用`debug.Stack`。看看[runtime/debug/stack.go的源代码](https://cs.opensource.google/go/go/+/refs/tags/go1.17:src/runtime/debug/stack。去;l=15)。参见 `PrintStack` 调用 `os.Stderr.Write(Stack())`。这是对`Stack()` 函数的调用,它返回`[]byte`。为了返回 `[]byte`,对 `Stack` 的调用传递这三个参数,`Stack` 将其返回值写入其中。
- Go 的参数和返回机制很奇特:例如,你不会发现 C 编译器使用这种技术。确切的机制不是由语言规定的,可能会从一个 Go 版本更改为下一个版本。
- 值得一提的是,堆栈跟踪的输出刚刚改变(使用 Go 1.17):https://golang.org/doc/go1.17#compiler