``` feat(socket): 优化panic处理逻辑并添加详细堆栈打印,完善服务器退出条件检查

This commit is contained in:
1
2025-10-28 07:39:11 +00:00
parent ec082db71d
commit a37b459793
5 changed files with 27 additions and 18 deletions

View File

@@ -2,10 +2,9 @@ package socket
import (
"context"
"encoding/hex"
"fmt"
"log"
"os"
"runtime/debug"
"sync/atomic"
"time"
@@ -43,12 +42,15 @@ func (s *Server) Stop() error {
}
func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in onclose", r)
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
log.Printf("捕获到 panic 错误:%v", err)
// 2. 打印完整调用堆栈debug.Stack() 获取堆栈字节流,转为字符串)
log.Printf("panic 详细堆栈:\n%s", debug.Stack())
}
}()
atomic.AddInt64(&s.connected, -1)
//logging.Infof("conn[%v] disconnected", c.RemoteAddr().String())
v, _ := c.Context().(*player.ClientData)
@@ -70,7 +72,7 @@ func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) {
}
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
cool.Loger.Infof(context.Background(), "[connected-count=%v]", atomic.LoadInt64(&s.connected))
if s.quit {
if s.quit && atomic.LoadInt64(&s.connected) == 0 {
//执行正常退出逻辑
os.Exit(0)
}
@@ -96,8 +98,11 @@ func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in OnTraffic", r)
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
log.Printf("捕获到 panic 错误:%v", err)
// 2. 打印完整调用堆栈debug.Stack() 获取堆栈字节流,转为字符串)
log.Printf("panic 详细堆栈:\n%s", debug.Stack())
}
}()
if s.network != "tcp" {
@@ -149,9 +154,7 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
}
})
if err != nil {
fmt.Println("work2", err)
}
}
return gnet.None
@@ -175,7 +178,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
}
cool.Loger.Debug(context.Background(), "原始数据", hex.EncodeToString(data))
//cool.Loger.Debug(context.Background(), "原始数据", hex.EncodeToString(data))
t := conn.Context().(*player.ClientData)
err = s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复

Binary file not shown.

View File

@@ -71,7 +71,7 @@ func CreateSkill(skill *model.SkillInfo, rand *rand.Rand, pet *BattlePetEntity)
}
ret.Info = skill
fmt.Printf("技能2 %p\n", ret.Info)
return &ret
}

View File

@@ -8,7 +8,9 @@ import (
"blazing/common/utils/bytearray"
"blazing/cool"
"fmt"
"log"
"math/rand"
"runtime/debug"
"strings"
"blazing/logic/service/common"
@@ -90,7 +92,14 @@ type eventHandler struct {
}
func (h *eventHandler) OnEvent(v []byte) {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
log.Printf("捕获到 panic 错误:%v", err)
// 2. 打印完整调用堆栈debug.Stack() 获取堆栈字节流,转为字符串)
log.Printf("panic 详细堆栈:\n%s", debug.Stack())
}
}()
header := TomeeHeader{}
tempdata := bytearray.CreateByteArray(v)

View File

@@ -41,10 +41,7 @@ func init() {
cool.RegisterController(blazing_controller)
}
func (c *BlazingController) GetSession(ctx context.Context, req *SessionReq) (res *SessionRes, err error) {
// res = &DemoSampleWelcomeRes{
// BaseRes: cool.Ok("Welcome to Cool Admin Go"),
// Data: gjson.New(`{"name": "Cool Admin Go", "age":0}`),
// }
res = &SessionRes{
Msg: "success",
Code: 200,