From 6d3ebc4239b25da74199dac8a052c77c356c875d Mon Sep 17 00:00:00 2001 From: Fangliding Date: Tue, 19 May 2026 22:18:26 +0800 Subject: [PATCH] Print trace if close take too long --- main/run.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/main/run.go b/main/run.go index 2655f7833..14fcfd609 100644 --- a/main/run.go +++ b/main/run.go @@ -91,7 +91,28 @@ func executeRun(cmd *base.Command, args []string) { fmt.Println("Failed to start:", err) os.Exit(-1) } - defer server.Close() + defer func() { + closeErrCh := make(chan error, 1) + go func() { + closeErrCh <- server.Close() + }() + select { + case err := <-closeErrCh: + if err != nil { + fmt.Println("Failed to close server:", err) + } + case <-time.After(10 * time.Second): + fmt.Println("Timeout when closing, printing traces:") + buf := make([]byte, 1<<20) + n := runtime.Stack(buf, true) + blocks := strings.Split(string(buf[:n]), "\n\n") + for _, block := range blocks { + if strings.Contains(block, "github.com/xtls/xray-core/core.(*Instance).Close") { + fmt.Println(block) + } + } + } + }() // Explicitly triggering GC to remove garbage from config loading. runtime.GC()