panic () stacktrace ไม่แสดงพารามิเตอร์ฟังก์ชัน
ในรหัสด้านล่าง:
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คำที่ถูกนำมาใช้ในการเก็บข้อมูลและส่งผ่านไปยังฟังก์ชั่น
- 3 คำสำหรับ
sliceส่วนหัว - 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
ทำไม stacktrace ที่สร้างจากpanic()ไม่แสดง 6 คำเหล่านั้น
คำตอบ
Go แสดงขึ้นmain.example(...)เนื่องจากฟังก์ชันถูกอินไลน์โดยคอมไพลเลอร์และไม่มีอยู่เป็นฟังก์ชันอีกต่อไปมันถูกฝังอยู่ในmain()(รายละเอียดของตรรกะการพิมพ์อยู่ในtraceback.go )
คุณสามารถบอกคอมไพลเลอร์ไม่ให้อินไลน์ฟังก์ชันได้โดยใช้go:noinline คำสั่งคอมไพเลอร์ :
//go:noinline
func example(slice []string, str string, i int) {
panic("Want stack trace")
}
เมื่อปิดการใช้งาน inlining เอาต์พุตการติดตามย้อนกลับเริ่มต้นจะแสดง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ใช้ที่นี่เพื่อแสดงว่าเหตุใดการติดตามสแต็กจึงไม่มีอาร์กิวเมนต์ของฟังก์ชัน โดยทั่วไปไม่ควรบังคับให้มีการตัดสินใจในการเพิ่มประสิทธิภาพของคอมไพเลอร์เว้นแต่จะทำการดีบักคอมไพเลอร์หรือจัดการกับฟังก์ชันรันไทม์ที่จำเป็น