Go Stack Trace 信息
时间:2021-05-31 14:28:28
参考:
- Stack Traces In Go
Go Stack Trace 信息
go 编译的时候会优化掉没有使用的参数,可以使用 -gcflags "-N -l" 禁止编译优化。例如:
go run -gcflags "-N -l" main.go
堆栈追踪信息含义
-
slice :引用类型。个数为三,第一个是指向底层数组的指针,第二个表示长度,第三个表示容量。
//data := make([]string, 0)
//testParam(data)
func testParam(data []string) {
panic("")
}
# 输出
main.testParam({0x1400006ef48, 0x0, 0x0})
/Users/feilong/workspace/github/FPF_Go/main.go:13 +0x38
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:9 +0x38
exit status 2
-
map 类型。个数为一,显示map的地址。
//data := make(map[string]string, 0)
//testParam(data)
func testParam(data map[string]string) {
panic("")
}
# 输出
goroutine 1 [running]:
main.testParam(0x14000066e68)
/Users/feilong/workspace/github/FPF_Go/main.go:16 +0x98
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:11 +0x7c
exit status 2
-
string:应用类型,个数为二,第一个表示地址指针执行底层字节数组,第二个表示字符串长度。
//testParam("data")
func testParam(data string) {
panic("")
}
# 输出
main.testParam({0x104928d35, 0x4})
/Users/feilong/workspace/github/FPF_Go/main.go:12 +0x34
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:8 +0x28
-
指针类型:个数为1,表示指针地址。
testParam(&A{})
func testParam(data *A) {
panic("")
}
// 输出
main.testParam(0x14000098f58)
/Users/feilong/workspace/github/FPF_Go/main.go:12 +0x30
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:8 +0x30
exit status 2
-
int 类型:个数为1,表示int的值。
//testParam(10000000)
func testParam(data int) {
panic("")
}
//输出
main.testParam(0x989680)
/Users/feilong/workspace/github/FPF_Go/main.go:12 +0x30
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:8 +0x24
exit status 2
-
boolean、uint8类型,会合并参数,一个字可以表示四个boolean。在64位机器上,一个字可以表示8个布尔类型。
# 代码
01 package main
02
03 func main() {
04 Example(true, false, true, 25)
05 }
06
07 func Example(b1, b2, b3 bool, i uint8) {
08 panic("Want stack trace")
09 }
# 异常信息
01 goroutine 1 [running]:
02 main.Example(0x19010001)
/Users/bill/Spaces/Go/Projects/src/github.com/goinaction/code/
temp/main.go:8 +0x64
03 main.main()
/Users/bill/Spaces/Go/Projects/src/github.com/goinaction/code/
temp/main.go:4 +0x32
# 参数解析
// Parameter values
true, false, true, 25
// Word value
Bits Binary Hex Value
00-07 0000 0001 01 true
08-15 0000 0000 00 false
16-23 0000 0001 01 true
24-31 0001 1001 19 25
// Declaration
main.Example(b1, b2, b3 bool, i uint8)
// Stack trace
main.Example(0x19010001)
-
接口类型参数,个数为2,第一个表示类型,第二个表示指针地址。
// testParam(errors.New("s"))
func testParam(data error) {
panic("")
}
//输出
main.testParam({0x104f718c8, 0x14000110000})
/Users/feilong/workspace/github/FPF_Go/main.go:14 +0x34
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:10 +0x34
-
指针作为方法的接收器,个数为一,会第一个打印接收器的地址。
//data := &Data{}
//data.testParam()
type Data struct{ value string }
func (d *Data) testParam() {
panic("")
}
//输出
main.(*Data).testParam(0x14000098f58)
/Users/feilong/workspace/github/FPF_Go/main.go:8 +0x30
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:13 +0x24
-
chan 类型参数,个数为1,打印指针地址。
//testParam(ch)
func testParam(data chan int) {
panic("")
}
// 输出
main.testParam(0x140000143c0)
/Users/feilong/workspace/github/FPF_Go/main.go:9 +0x30
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:5 +0x30
-
func 类型作为参数,个数为1,指针地址。
// data := func(s string) {}
// testParam(data)
func testParam(data AFunc) {
panic("")
}
//输出
main.testParam(0x1025508a8)
/Users/feilong/workspace/github/FPF_Go/main.go:11 +0x30
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:7 +0x2c
-
结构体作为方法的接收器,会第打印结构体的属性信息。
type Data struct {
value string
value1 string
}
func (d Data) testParam() {
panic("")
}
func main() {
data := Data{value: "1", value1: "11"}
data.testParam()
}
//输出
main.Data.testParam({{0x104ef4c88, 0x1}, {0x104ef4ca6, 0x2}})
/Users/feilong/workspace/github/FPF_Go/main.go:9 +0x3c
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:14 +0x4c
## demo2----------------------
type Data int
func (d Data) testParam() {
panic("")
}
func main() {
data := Data(11)
data.testParam()
}
//输出
main.Data.testParam(0xb)
/Users/feilong/workspace/github/FPF_Go/main.go:6 +0x30
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:11 +0x24
-
方法没有接收器,不会打印多余信息。
func testParam() {
panic("")
}
func main() {
testParam()
}
// 输出
main.testParam()
/Users/feilong/workspace/github/FPF_Go/main.go:6 +0x2c
main.main()
/Users/feilong/workspace/github/FPF_Go/main.go:10 +0x1c