当 go 单元测试因死锁卡住时,直接按 ctrl+c 无法捕获 `t.log()` 输出;使用 ctrl+\ 可触发运行时栈回溯,辅助定位阻塞点,但需配合 `-v` 标志和合理日志策略才能完整获取调试信息。
在 Go 中运行单元测试(如 go test -run TestFoo)时,若测试逻辑存在 goroutine 死锁、channel 阻塞或无限等待,进程会挂起。此时用户常试图用 Ctrl+C 终止,但该信号会强制退出 go test 进程,导致尚未 flush 的 t.Log() 日志(尤其是缓冲中未输出的内容)丢失,无法用于诊断。
✅ 正确做法是:在测试卡住时按下 Ctrl+\(即 Control + Backslash)。
该组合键向当前进程发送 SIGQUIT 信号(而非 SIGINT),Go 运行时会响应此信号并:
? 示例:
go test -v -run TestDeadlock
func TestDeadlock(t *testing.T) {
t.Log("step 1: starting...")
ch := make(chan int)
t.Log("step 2: about to block on channel receive")
<-ch // ← 死锁在此处发生
}当执行卡在
SIGQUIT: quit
PC=0x109a7a1 m=0 sigcode=0
goroutine 19 [chan receive]:
command-line-arguments.TestDeadlock(0xc0000b40f0)
/path/to/test.go:8 +0x71
...
⚠️ 注意事项:

总结:Ctrl+\ 是 Go 测试死锁诊断的“紧急刹车”,配合 -v 和显式日志,能高效定位 hang 点;而预防胜于调试——建议在并发测试中始终使用 t.Parallel() 显式声明、避免共享未同步状态,并善用 select 带 default 或 time.After 实现超时保护。