go - 恐慌()堆栈跟踪不显示函数参数
问题描述
在下面的代码中:
package main
func main() {
example(make([]string, 2, 4), "hello", 10)
}
func example(slice []string, str string, i int) {
panic("Want stack trace")
}
6 个字用于存储数据并传递给函数example
。
slice
标题3 个字- 2个字的
str
字符串 i
整数一个词
预期的堆栈跟踪:
goroutine 1 [running]:
main.example(0xc000042748, 0x2, 0x4, 0x106abae, 0x5, 0xa)
stack_trace/example1/example1.go:13 +0x39
main.main()
stack_trace/example1/example1.go:8 +0x72
// Declaration
main.example(slice []string, str string, i int)
// Call
make([]string, 2, 4), "hello", 10
// Values (0xc000042748, 0x2, 0x4, 0x106abae, 0x5, 0xa)
Slice Value: 0xc000042748, 0x2, 0x4
String Value: 0x106abae, 0x5
Integer Value: 0xa
实际堆栈跟踪:
panic: Want stack trace
goroutine 1 [running]:
main.example(...)
/home/../Main.go:8
main.main()
/home/../Main.go:4 +0x39
exit status 2
$ go version
go version go1.14.3 linux/amd64
为什么生成的堆栈跟踪panic()
不显示这 6 个单词?
解决方案
Go 正在显示main.example(...)
,因为该函数已被编译器内联并且不再作为函数存在,它已被嵌入main()
(打印逻辑的详细信息在traceback.go中)。
您可以使用编译器指令告诉编译器不要内联函数:go:noinline
//go:noinline
func example(slice []string, str string, i int) {
panic("Want stack trace")
}
禁用内联后,默认回溯输出显示main.example
及其参数:
panic: Want stack trace
goroutine 1 [running]:
main.example(0xc000046738, 0x2, 0x4, 0x473f27, 0x5, 0xa)
/home/me/stuff/src/github.com/me/testing/panic/main.go:9 +0x39
main.main()
/home/me/stuff/src/github.com/me/testing/panic/main.go:4 +0x72
请注意,make
它不会出现在堆栈跟踪中,也不会出现:它在panic
到达之前已经返回。
一句忠告:go:noinline
这里用来说明为什么堆栈跟踪不包含函数参数。除非调试编译器或处理需要它的运行时函数,否则通常不应强制编译器优化决策。
推荐阅读
- javascript - 如何从 innerHTML / textContent javascript 获取日期
- azure - 每月前 5 GB 的 Azure 出站带宽是否免费?
- azure-service-fabric - 限制对我的 ServiceFabric 集群的访问,只允许一个 IP(API 管理)
- node.js - 如何使用 Typescript 在 Node/Express 中锁定代码的关键部分
- android - 对齐 ConstraintLayout 上的按钮
- python - Flask Ask 上的 Alexa 实体解析(不处理同义词)
- php - 将 PHP 变量传递给模式并在 MySQL 查询中使用它
- android - 如何知道用户正在查看哪个片段?
- node.js - 如何将字符串数组解析为 Json 对象?
- java - 更改对象标头中的类指针