首页
Preview

Goland的Debug终于可以捕捉信号量

Goland存在的问题

相信大部分同学都使用Goland的Debug功能,Debug工具为我们日常开发带来了很大的便捷。但长期以来Debug功能存在一个问题是,stop debug时程序没法捕捉到信号量。

在jetbrains社区里,2018年就有人提出了 讨论链接:https://youtrack.jetbrains.com/issue/GO-5982 ,如今已经2022年了,Goland 2022.3 EAP最新预览版终于修复了该问题。

我自己安装了最新预览版尝试了,的确解决了该问题,点赞~

举例

在终端中运行以下代码时,我们可以使用键盘ctrl-c 发送中断,这允许我们在代码里面处理应用一些资源回收、优雅关闭等逻辑。目前的旧版本Goland debug是捕获不到信号量的

package main

import (
	"log"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	// 监听退出信号
	shutdown := make(chan os.Signal, 1)
	signal.Notify(shutdown, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
	log.Println("程序启动")

	_ = <-shutdown
	// TODO 清理操作
	time.Sleep(time.Second * 2)

	log.Println("程序退出")
	os.Exit(0)
}

附:Go 中支持的信号量

信号值动作说明
SIGHUP1Term终端控制进程结束(终端连接断开)
SIGINT2Term用户发送INTR字符(Ctrl+C)触发
SIGQUIT3Core用户发送QUIT字符(Ctrl+/)触发
SIGILL4Core非法指令(程序错误、试图执行数据段、栈溢出等)
SIGABRT6Core调用abort函数触发
SIGFPE8Core算术运行错误(浮点运算错误、除数为零等)
SIGKILL9Term无条件结束程序(不能被捕获、阻塞或忽略)
SIGSEGV11Core无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作)
SIGPIPE13Term消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作)
SIGALRM14Term时钟定时信号
SIGTERM15Term结束程序(可以被捕获、阻塞或忽略)
SIGUSR130,10,16Term用户保留
SIGUSR231,12,17Term用户保留
SIGCHLD20,17,18Ign子进程结束(由父进程接收)
SIGCONT19,18,25Cont继续执行已经停止的进程(不能被阻塞)
SIGSTOP17,19,23Stop停止进程(不能被捕获、阻塞或忽略)
SIGTSTP18,20,24Stop停止进程(可以被捕获、阻塞或忽略)
SIGTTIN21,21,26Stop后台程序从终端中读取数据时触发
SIGTTOU22,22,27Stop后台程序向终端中写数据时触发

相关链接

Goland预览版下载地址:https://www.jetbrains.com.cn/go/nextversion/

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
Tony
暂无描述

评论(0)

添加评论