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

2022年11月26日 293点热度 0人点赞 0条评论

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 中支持的信号量

信号值 动作 说明
SIGHUP 1 Term 终端控制进程结束(终端连接断开)
SIGINT 2 Term 用户发送INTR字符(Ctrl+C)触发
SIGQUIT 3 Core 用户发送QUIT字符(Ctrl+/)触发
SIGILL 4 Core 非法指令(程序错误、试图执行数据段、栈溢出等)
SIGABRT 6 Core 调用abort函数触发
SIGFPE 8 Core 算术运行错误(浮点运算错误、除数为零等)
SIGKILL 9 Term 无条件结束程序(不能被捕获、阻塞或忽略)
SIGSEGV 11 Core 无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作)
SIGPIPE 13 Term 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作)
SIGALRM 14 Term 时钟定时信号
SIGTERM 15 Term 结束程序(可以被捕获、阻塞或忽略)
SIGUSR1 30,10,16 Term 用户保留
SIGUSR2 31,12,17 Term 用户保留
SIGCHLD 20,17,18 Ign 子进程结束(由父进程接收)
SIGCONT 19,18,25 Cont 继续执行已经停止的进程(不能被阻塞)
SIGSTOP 17,19,23 Stop 停止进程(不能被捕获、阻塞或忽略)
SIGTSTP 18,20,24 Stop 停止进程(可以被捕获、阻塞或忽略)
SIGTTIN 21,21,26 Stop 后台程序从终端中读取数据时触发
SIGTTOU 22,22,27 Stop 后台程序向终端中写数据时触发

相关链接

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

图片

长按关注,订阅更多优质内容哦~

图片

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

这个人很懒,什么都没留下

文章评论