Kevin Wan 3 лет назад
Родитель
Сommit
a21ff71373

+ 5 - 1
core/fx/timeout.go

@@ -2,6 +2,9 @@ package fx
 
 import (
 	"context"
+	"fmt"
+	"runtime/debug"
+	"strings"
 	"time"
 )
 
@@ -30,7 +33,8 @@ func DoWithTimeout(fn func() error, timeout time.Duration, opts ...DoOption) err
 	go func() {
 		defer func() {
 			if p := recover(); p != nil {
-				panicChan <- p
+				// attach call stack to avoid missing in different goroutine
+				panicChan <- fmt.Sprintf("%+v\n\n%s", p, strings.TrimSpace(string(debug.Stack())))
 			}
 		}()
 		done <- fn()

+ 1 - 1
zrpc/internal/serverinterceptors/crashinterceptor.go

@@ -39,6 +39,6 @@ func handleCrash(handler func(interface{})) {
 }
 
 func toPanicError(r interface{}) error {
-	logx.Errorf("%+v %s", r, debug.Stack())
+	logx.Errorf("%+v\n\n%s", r, debug.Stack())
 	return status.Errorf(codes.Internal, "panic: %v", r)
 }

+ 5 - 1
zrpc/internal/serverinterceptors/timeoutinterceptor.go

@@ -2,6 +2,9 @@ package serverinterceptors
 
 import (
 	"context"
+	"fmt"
+	"runtime/debug"
+	"strings"
 	"sync"
 	"time"
 
@@ -24,7 +27,8 @@ func UnaryTimeoutInterceptor(timeout time.Duration) grpc.UnaryServerInterceptor
 		go func() {
 			defer func() {
 				if p := recover(); p != nil {
-					panicChan <- p
+					// attach call stack to avoid missing in different goroutine
+					panicChan <- fmt.Sprintf("%+v\n\n%s", p, strings.TrimSpace(string(debug.Stack())))
 				}
 			}()