返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

GOTRACEBACK

发布于 2024-10-12 19:16:09 字数 2398 浏览 0 评论 0 收藏 0

控制进程崩溃(panic, runtime)时输出的调用堆栈跟踪信息。

默认仅输出当前 goroutine 堆栈信息,返回错误码(exit code) 2 ,忽略运行时内部函数调用。

  • none : 忽略堆栈跟踪信息。
  • single : 默认。
  • all : 所有 goroutine 堆栈信息。
  • system : 类似 all,但堆栈信息包含运行时函数。
  • crash : 类似 system,但以操作系统规范退出。

提示:crash 方式在 UNIX 系统中,会引发 SIGABRT,生成 core dump 文件。

也可在 crash 方式时,通过 ctrl + \ 主动引发崩溃,生成 core dump 文件。

package main

import (
	"fmt"
	"time"
)

func test(id int) {
	panic(fmt.Sprintf("%d err", id))
}

func main() {
	for i := 0; i < 3; i++ {
		go test(i)
	}

	time.Sleep(time.Second)
}
$ go build -o test
$ ulimit -c unlimited

$ GOTRACEBACK=crash ./test
Aborted (core dumped)
$ dlv core ./test core

(dlv) bt
 0  0x000000000045c041 in runtime.raise
    at /usr/local/go/src/runtime/sys_linux_amd64.s:168
 1  0x0000000000443865 in runtime.dieFromSignal
    at /usr/local/go/src/runtime/signal_unix.go:852
 2  0x0000000000443e36 in runtime.sigfwdgo
    at /usr/local/go/src/runtime/signal_unix.go:1066
 3  0x0000000000442587 in runtime.sigtrampgo
    at /usr/local/go/src/runtime/signal_unix.go:430
 4  0x000000000045cd8e in runtime.sigtrampgo
    at <autogenerated>:1
 5  0x000000000045c31d in runtime.sigtramp
    at /usr/local/go/src/runtime/sys_linux_amd64.s:361
 6  0x000000000045c420 in runtime.sigreturn
    at /usr/local/go/src/runtime/sys_linux_amd64.s:466
 7  0x000000000042ffc9 in runtime.crash
    at /usr/local/go/src/runtime/signal_unix.go:944
 8  0x000000000042ffc9 in runtime.fatalpanic
    at /usr/local/go/src/runtime/panic.go:1092
 9  0x000000000042f797 in runtime.gopanic
    at /usr/local/go/src/runtime/panic.go:941
10  0x000000000047e3a5 in main.test
    at ./main.go:9
11  0x000000000047e466 in main.main.func1
    at ./main.go:14
12  0x000000000045a741 in runtime.goexit
    at /usr/local/go/src/runtime/asm_amd64.s:1571
    
    
(dlv) frame 10
> runtime.raise() /usr/local/go/src/runtime/sys_linux_amd64.s:168 (PC: 0x45c041)
Warning: debugging optimized function
Frame 10: ./main.go:9 (PC: 47e3a5)
     4:		"fmt"
     5:		"time"
     6:	)
     7:	
     8:	func test(id int) {
=>   9:		panic(fmt.Sprintf("%d err", id))
    10:	}
    11:	
    12:	func main() {
    13:		for i := 0; i < 3; i++ {
    14:			go test(i)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文