``` feat(socket): 优化panic处理逻辑并添加详细堆栈打印,完善服务器退出条件检查
This commit is contained in:
@@ -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 { // 恢复 panic,err 为 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 { // 恢复 panic,err 为 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 这里可能存在顺序执行问题,待修复
|
||||
|
||||
BIN
logic/logic2
BIN
logic/logic2
Binary file not shown.
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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 { // 恢复 panic,err 为 panic 错误值
|
||||
// 1. 打印错误信息
|
||||
log.Printf("捕获到 panic 错误:%v", err)
|
||||
// 2. 打印完整调用堆栈(debug.Stack() 获取堆栈字节流,转为字符串)
|
||||
log.Printf("panic 详细堆栈:\n%s", debug.Stack())
|
||||
}
|
||||
}()
|
||||
header := TomeeHeader{}
|
||||
|
||||
tempdata := bytearray.CreateByteArray(v)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user