iT邦幫忙

0

vscode要如何在debug模式中好好地將程式終止?

  • 分享至 

  • xImage

原本就有注意到vscode中的"停止"(shift+F5)跟一般在CLI終止程式的行為不太一樣,原本是沒什麼問題,但像我現在的main底下長這樣:

func main() {
	var err error
	if err = setup(); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server setup fail")
		return
	}

	srv := server.NewHttpServer(cfg.Server.Port)

	logger.MainLog().Info().Msg("Server start...")

	srv.RegisterRouter(route.GetHttpRouter())

	//start server
	if err = srv.Start(); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server start fail")
		return
	}

	logger.MainLog().Info().Msg("Server start success")

	//run routine job
	routine.Run()

	//waiting shutdown
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt)
	<-quit
	signal.Reset(os.Interrupt)

	logger.MainLog().Info().Msg("Server shutdown...")

	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()

	if err = srv.Shutdown(ctx); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server shutdown fail")
		return
	}

	logger.MainLog().Info().Msg("Server shutdown success")

	if define.IsDebugMode {
		cmd := exec.Command(fmt.Sprintf("rm %s*.log", define.LogPath))
		if err = cmd.Run(); err != nil {
			logger.MainLog().Error().Err(err).Msg("")
			return
		}
	}
}

我是希望在debugmode中能在程式結束後自動刪除log path底下的log檔,這樣才方便我在開發階段查看

但目前vscode是直接終止掉我的程式,//waiting shutdown之後的程式都不會執行,查了一下laungh.json好像也沒有關於終止程式後的行為可以設定,請問我該怎麼做?

我目前是在linux底下運作的,vscode是run在dlv


目前找到一個solution,但跟我預想的還是有點落差

我有試著捕捉信號,但卻怎樣都抓不到,因此vscode在做"停止"時,應該是傳送SIGKILL(0x15)

因此目前我的作法是修改laungh.json
laungh.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug mode",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/src/main.go",
            "args":["--DEBUG_MODE"],
            "console": "integratedTerminal"
        }
    ]
}

這樣就會run在終端機而不是偵錯主控台,雖然vscode的"停止"按鈕一樣是kill,但可以在終端機內用ctrl+c來終止(原本的偵錯主控台不行)

code改成如下
main.go

	//waiting shutdown
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT)
	<-quit
	signal.Reset(syscall.SIGINT)

	logger.MainLog().Info().Msg("Server shutdown...")

	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()

	if err = srv.Shutdown(ctx); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server shutdown fail")
		return
	}

	logger.MainLog().Info().Msg("Server shutdown success")

	//remove log file in the log path
	if define.IsDebugMode {
		cmd := exec.Command("/bin/bash", "-c", fmt.Sprintf("rm %s*.log", define.LogPath))
		if err = cmd.Run(); err != nil {
			logger.MainLog().Error().Err(err).Msg("")
			return
		}
	}

因為不是run在bash底下,所以command不能直接下,而是透過bash傳真的要執行的command

不知道有沒有更好的解法

froce iT邦大師 1 級 ‧ 2023-03-17 15:24:26 檢舉
你這要看一下 vscode 在停止的時候是送什麼信號停止的。
另外crtl + C的停止呢?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答