先确认 panic 是否被 recover 吞掉:检查所有 defer recover 块是否调用 debug.PrintStack() 或 log.Printf("full stack: %s", debug.Stack());再查 SIGHUP 是否杀死进程,推荐 systemd 托管;若堆栈全是 runtime.xxx,需排查死锁或 STW 卡住;崩溃前内存暴涨可主动写 heap dump。

崩溃时没日志?先确认 panic 是否被 recover 吞掉
很多 Go 服务“静默崩溃”,其实是 panic 被某层 recover() 捕获后仅打印了 log.Printf("panic: %v", err),却没调用 debug.PrintStack() —— 导致你只看到 “panic: runtime error: index out of range”,完全不知道在哪一行、哪个 goroutine 触发的。
检查所有 defer func() { if r := recover(); r != nil { ... } }() 块,确保里面包含:
log.Printf("panic recovered: %v", r)-
debug.PrintStack()(输出到 stderr,注意 systemd 重定向时可能看不到) - 或更推荐:
log.Printf("full stack: %s", debug.Stack()),把栈转成字符串进日志
别信“我加了 recover 就没问题”——没打完整栈,等于没查。
进程突然消失?查 SIGHUP 是否杀死后台进程
在 Linux 上直接用 ./myapp & 启动,然后退出 SSH,服务就没了?大概率是终端断开触发了 SIGHUP,而 Go 程序默认不处理该信号,直接退出。
立即学习“go语言免费学习笔记(深入)”;
验证方法很简单:
- 启动后执行
ps -o pid,ppid,sid,tty -p $!,看tty是否为?或pts/xx - 退出终端再登录,执行
ps -p <pid></pid>,如果提示 “no such process”,就是 SIGHUP 杀的
临时修复用 nohup ./myapp &;生产环境必须用 systemd 托管,配 Restart=always 和 StandardOutput=journal,否则日志和生命周期都不可控。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
崩溃堆栈里全是 runtime.xxx?可能是死锁或 STW 卡住
如果 debug.Stack() 显示大量 runtime.osyield、runtime.notetsleep、stopTheWorldWithSema,说明 GC 的 STW 阶段卡住了——常见于 Go 1.14+ 的抢占式调度失效,某个 P 长时间未响应抢占信号。
典型诱因:
- goroutine 在非合作式系统调用中阻塞(如某些 cgo 调用、syscall.Syscall 未设 timeout)
- 长时间运行的纯计算循环(无函数调用,无法插入抢占点)
- 信号 handler 注册不当,导致 sigmask 屏蔽了抢占信号
这时 dlv attach 查 goroutines -with running 会发现只有极少数 goroutine 处于 running 状态,且堆栈停在 runtime 内部。别急着看业务代码,先检查有没有裸写 for 循环、cgo 调用、或 syscall 使用。
崩溃前内存暴涨或卡顿?考虑 heap dump 抓现场
有些崩溃(比如 OOM kill、GC 崩溃)发生前有明显征兆:RSS 持续上涨、响应延迟变高。Go 1.19+ 提供了 debug.WriteHeapDump(),可在 panic 前主动保存堆快照。
用法示例:
defer func() {
if r := recover(); r != nil {
debug.WriteHeapDump("/tmp/heap-panic-" + strconv.FormatInt(time.Now().Unix(), 10) + ".dump")
debug.PrintStack()
panic(r)
}
}()
注意:WriteHeapDump 是阻塞操作,别在高频路径调用;dump 文件需用 go tool trace 或 delve 分析,不能直接读;它不记录栈帧,只存堆对象分配关系——要还原崩溃上下文,仍得靠 debug.Stack() 配合。
真正难排查的崩溃,往往不是单点错误,而是多个机制叠加失效:recover 没打栈 + 进程没守护 + 死锁卡住 STW + heap 无 dump。优先确保每层都有可观测性,比猜原因更重要。

















