讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

如何在 Go 单元测试死锁时中断执行并查看日志输出

冬晨吖_6697

冬晨吖_6697

发布时间:2025-12-29 17:56:17

|

696人浏览过

|

来源于php中文网

原创

如何在 Go 单元测试死锁时中断执行并查看日志输出

当 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 运行时会响应此信号并:

  • 立即打印所有 goroutine 的完整调用栈(包括阻塞位置,如 select {}、chan receive、sync.Mutex.Lock 等);
  • 不终止进程,而是暂停执行并输出诊断信息后保持挂起状态(便于观察);
  • 关键点:t.Log() 的输出本身不会自动出现在 SIGQUIT 输出中,但只要测试启动时加了 -v 标志(即 go test -v),所有 t.Log() 消息会在测试执行过程中实时打印到终端——因此务必始终启用 -v 进行调试。

? 示例:

CMIC Skill Scanner (BCLinux 21 / 低版本 glibc Linux x64)
CMIC Skill Scanner (BCLinux 21 / 低版本 glibc Linux x64)

使用内置 Rust 引擎审计待安装的 skill 包或归档,可选桥接外部扫描器。

下载
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+\ 在部分终端(如 Windows PowerShell 或某些 IDE 内置终端)可能被拦截或无效,推荐在标准终端(macOS Terminal、Linux GNOME Terminal、Windows WSL)中使用;
  • 若仍看不到 t.Log() 内容,请确认未使用 -short 或重定向覆盖了 stdout/stderr;
  • 对于长期阻塞场景,可结合 runtime.SetBlockProfileRate(1) 和 pprof 进一步分析阻塞事件;
  • 更健壮的调试方式:为关键路径添加带时间戳的 t.Logf("at %v: waiting for X", time.Now()),并设置测试超时:go test -v -timeout 10s。

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

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6907

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2848

2023.08.10

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

454

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

639

2025.11.17

Go语言 channel用法详解
Go语言 channel用法详解

本专题整合了go语言中channel的各种使用方法,阅读专题下面的文章了解更多详细步骤。

523

2026.04.03

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

377

2023.12.07

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3459

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3018

2023.07.27

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn