Giter Club home page Giter Club logo

Comments (6)

changkun avatar changkun commented on May 23, 2024

The bug can be reproduced in the pressure test which was just committed in daa6393.

from occamy.

changkun avatar changkun commented on May 23, 2024

This bug may be introduced in d2afb2d.

The handshake process may still need to lock until everything(clients, parser, input threads, and so on) is ready.

from occamy.

changkun avatar changkun commented on May 23, 2024

Sadly, no.

from occamy.

changkun avatar changkun commented on May 23, 2024

This bug seems only exists in RDP connections:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fdc557fa700 (LWP 35)]
0x00007fdc65f12cc0 in pthread_mutex_lock () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install bzip2-libs-1.0.6-13.el7.x86_64 cairo-1.15.12-4.el7.x86_64 expat-2.1.0-10.el7_3.x86_64 fontconfig-2.13.0-4.3.el7.x86_64 freerdp-libs-1.0.2-15.el7.x86_64 freetype-2.8-14.el7.x86_64 glibc-2.17-292.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_7.2.x86_64 libX11-1.6.7-2.el7.x86_64 libXau-1.0.8-2.1.el7.x86_64 libXext-1.3.3-3.el7.x86_64 libXrender-0.9.10-1.el7.x86_64 libcom_err-1.42.9-16.el7.x86_64 libglvnd-1.0.1-0.8.git5baa1e5.el7.x86_64 libglvnd-egl-1.0.1-0.8.git5baa1e5.el7.x86_64 libglvnd-glx-1.0.1-0.8.git5baa1e5.el7.x86_64 libjpeg-turbo-1.2.90-8.el7.x86_64 libpng-1.5.13-7.el7_2.x86_64 libselinux-2.5-14.1.el7.x86_64 libuuid-2.23.2-61.el7.x86_64 libwebp-0.3.0-7.el7.x86_64 libxcb-1.13-1.el7.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 pixman-0.34.0-1.el7.x86_64 uuid-1.6.2-26.el7.x86_64 zlib-1.2.7-18.el7.x86_64
(gdb) bt
#0  0x00007fdc65f12cc0 in pthread_mutex_lock () from /lib64/libpthread.so.0
#1  0x00007fdc545e2049 in guac_common_list_lock (list=<optimized out>) at list.c:75
#2  0x00007fdc545e0658 in guac_rdp_svc_send_pipes (user=0x7fdc380029a0) at rdp_svc.c:78
#3  0x00007fdc545e0a1b in guac_rdp_user_join_handler (user=0x7fdc380029a0, argc=<optimized out>, 
    argv=<optimized out>) at user.c:85
#4  0x00007fdc6612be1d in guac_client_add_user (user=0x7fdc380029a0, argc=<optimized out>, 
    argv=<optimized out>) at client.c:285
#5  0x00000000009f80fe in _cgo_5063686ecc33_Cfunc_guac_client_add_user (v=0xc0003bb4c8)
    at cgo-gcc-prolog:89
#6  0x0000000000460c70 in runtime.asmcgocall () at /usr/local/go/src/runtime/asm_amd64.s:655
#7  0x000000000045e601 in runtime.exitsyscallfast.func1 ()
    at /usr/local/go/src/runtime/proc.go:3053
#8  0x000000c0003b6780 in ?? ()
#9  0x0000000000435e20 in ?? () at /usr/local/go/src/runtime/proc.go:1080
#10 0x0000000000000000 in ?? ()

from occamy.

changkun avatar changkun commented on May 23, 2024

However, VNC/SSH still have double free corruption, in a very rare case.

from occamy.

changkun avatar changkun commented on May 23, 2024

some random panics:

occamy    | [GIN] 2020/02/17 - 18:05:40 | 200 |     184.589µs |    172.16.238.1 | POST     /api/v1/login
occamy    | [GIN] 2020/02/17 - 18:05:40 | 200 |     127.039µs |    172.16.238.1 | POST     /api/v1/login
occamy    | time="2020-02-17T18:05:40Z" level=info msg="occamy-proxy: new session was created: $147f05a5-77cd-43c9-8f29-68d281185fe8"
occamy    | occamy-lib[140465286407936]: Cursor rendering: local
occamy    | occamy-lib[140465286407936]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465286407936]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465264764672]: Cursor rendering: local
occamy    | occamy-lib[140465264764672]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465264764672]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465264764672]: Cursor rendering: local
occamy    | occamy-lib[140465264764672]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465264764672]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465143797504]: Cursor rendering: local
occamy    | occamy-lib[140465143797504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465143797504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465143797504]: Cursor rendering: local
occamy    | occamy-lib[140465143797504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465143797504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465135404800]: Cursor rendering: local
occamy    | occamy-lib[140465135404800]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465135404800]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465143797504]: Cursor rendering: local
occamy    | occamy-lib[140465143797504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465143797504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140464925685504]: Cursor rendering: local
occamy    | occamy-lib[140464925685504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140464925685504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140464925685504]: Cursor rendering: local
occamy    | occamy-lib[140464925685504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140464925685504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamyd: cairo-surface.c:2092: _cairo_surface_release_source_image: Assertion `!surface->finished' failed.
occamy    | SIGABRT: abort
occamy    | PC=0x7fc0da1d8337 m=23 sigcode=18446744073709551610
occamy    | 
occamy    | goroutine 0 [idle]:
occamy    | runtime: unknown pc 0x7fc0da1d8337
occamy    | stack: frame={sp:0x7fc089ff7898, fp:0x0} stack=[0x7fc0897fb0e8,0x7fc089fface8)
occamy    | 00007fc089ff7798:  000000000000006b  000000000000006b 
occamy    | 00007fc089ff77a8:  00007fc089ff7a20  00007fc05c006cf0 
occamy    | 00007fc089ff77b8:  00007fc089ff78f8  00007fc08c058800 
occamy    | 00007fc089ff77c8:  00007fc0da219e1c  000000fffbad8000 
occamy    | 00007fc089ff77d8:  00007fc05c006cf0  00007fc05c006d55 
occamy    | 00007fc089ff77e8:  00007fc05c006cf0  00007fc05c006cf0 
occamy    | 00007fc089ff77f8:  00007fc05c006d5b  00007fc05c006e1c 
occamy    | 00007fc089ff7808:  00007fc05c006cf0  00007fc05c006e1c 
occamy    | 00007fc089ff7818:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7828:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7838:  0000000000000000  0000000000c795c0 
occamy    | 00007fc089ff7848:  000000c0004a2340  0000000000000000 
occamy    | 00007fc089ff7858:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7868:  00007fc0dabb9000  00007fc0da32cbe0 
occamy    | 00007fc089ff7878:  00007fc0d9f61fb1  00007fc0d9f62340 
occamy    | 00007fc089ff7888:  000000000000000c  00007fc08c058800 
occamy    | 00007fc089ff7898: <00007fc0da1d9a28  0000000000000020 
occamy    | 00007fc089ff78a8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78b8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78c8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78d8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78e8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78f8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7908:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7918:  0000000000000000  00007ffec221ad48 
occamy    | 00007fc089ff7928:  00007fc0da329cf0  00007fc0d9f61f4d 
occamy    | 00007fc089ff7938:  000000000000082c  0000000000000000 
occamy    | 00007fc089ff7948:  00007fc0da1d2b53  00007fc089ff7930 
occamy    | 00007fc089ff7958:  0000000000000004  0000000000000000 
occamy    | 00007fc089ff7968:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7978:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7988:  0000000000000000  0000000500000000 
occamy    | runtime: unknown pc 0x7fc0da1d8337
occamy    | stack: frame={sp:0x7fc089ff7898, fp:0x0} stack=[0x7fc0897fb0e8,0x7fc089fface8)
occamy    | 00007fc089ff7798:  000000000000006b  000000000000006b 
occamy    | 00007fc089ff77a8:  00007fc089ff7a20  00007fc05c006cf0 
occamy    | 00007fc089ff77b8:  00007fc089ff78f8  00007fc08c058800 
occamy    | 00007fc089ff77c8:  00007fc0da219e1c  000000fffbad8000 
occamy    | 00007fc089ff77d8:  00007fc05c006cf0  00007fc05c006d55 
occamy    | 00007fc089ff77e8:  00007fc05c006cf0  00007fc05c006cf0 
occamy    | 00007fc089ff77f8:  00007fc05c006d5b  00007fc05c006e1c 
occamy    | 00007fc089ff7808:  00007fc05c006cf0  00007fc05c006e1c 
occamy    | 00007fc089ff7818:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7828:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7838:  0000000000000000  0000000000c795c0 
occamy    | 00007fc089ff7848:  000000c0004a2340  0000000000000000 
occamy    | 00007fc089ff7858:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7868:  00007fc0dabb9000  00007fc0da32cbe0 
occamy    | 00007fc089ff7878:  00007fc0d9f61fb1  00007fc0d9f62340 
occamy    | 00007fc089ff7888:  000000000000000c  00007fc08c058800 
occamy    | 00007fc089ff7898: <00007fc0da1d9a28  0000000000000020 
occamy    | 00007fc089ff78a8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78b8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78c8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78d8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78e8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78f8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7908:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7918:  0000000000000000  00007ffec221ad48 
occamy    | 00007fc089ff7928:  00007fc0da329cf0  00007fc0d9f61f4d 
occamy    | 00007fc089ff7938:  000000000000082c  0000000000000000 
occamy    | 00007fc089ff7948:  00007fc0da1d2b53  00007fc089ff7930 
occamy    | 00007fc089ff7958:  0000000000000004  0000000000000000 
occamy    | 00007fc089ff7968:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7978:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7988:  0000000000000000  0000000500000000 
occamy    | 
occamy    | goroutine 73 [syscall]:
occamy    | runtime.cgocall(0x9f3a40, 0xc0005bd190, 0xc05c002c80)
occamy    |     /golang/go/src/runtime/cgocall.go:133 +0x5b fp=0xc0005bd160 sp=0xc0005bd128 pc=0x40572b
occamy    | github.com/changkun/occamy/lib._Cfunc_join_handler_bridge(0x7fc05c002990, 0x7fc00000000e, 0x7fc05c002c80, 0x0)
occamy    |     _cgo_gotypes.go:525 +0x4d fp=0xc0005bd190 sp=0xc0005bd160 pc=0x9eacad
occamy    | github.com/changkun/occamy/lib.(*User).Prepare.func5(0xc0002db300, 0xc00017c1c0, 0xe, 0xe, 0x7fc05c002c80, 0x0)
occamy    |     /occamy/lib/user.go:221 +0x8e fp=0xc0005bd1c8 sp=0xc0005bd190 pc=0x9edeae
occamy    | github.com/changkun/occamy/lib.(*User).Prepare(0xc0002db300, 0x0, 0x0)
occamy    |     /occamy/lib/user.go:221 +0x5b3 fp=0xc0005bd2a0 sp=0xc0005bd1c8 pc=0x9ecb23
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0004b14a0, 0xc000367658, 0x0, 0xc0005bd550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:84 +0x3f7 fp=0xc0005bd4e8 sp=0xc0005bd2a0 pc=0x9f20e7
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b14a0, 0xc000367658, 0x8, 0xc0004bf178)
occamy    |     /occamy/server/routers.go:58 +0x3a8 fp=0xc0005bd570 sp=0xc0005bd4e8 pc=0x9f1a28
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0004d8210)
occamy    |     /occamy/server/routers.go:46 +0x447 fp=0xc0005bd7b8 sp=0xc0005bd570 pc=0x9f1467
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS-fm(0xc0004d8210)
occamy    |     /occamy/server/routers.go:31 +0x34 fp=0xc0005bd7d8 sp=0xc0005bd7b8 pc=0x9f3484
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bd7f8 sp=0xc0005bd7d8 pc=0x9a918b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0004d8210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf fp=0xc0005bd868 sp=0xc0005bd7f8 pc=0x9be1ff
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34 fp=0xc0005bd888 sp=0xc0005bd868 pc=0x9c0f94
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bd8a8 sp=0xc0005bd888 pc=0x9a918b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60 fp=0xc0005bd8e8 sp=0xc0005bd8a8 pc=0x9bbda0
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bd908 sp=0xc0005bd8e8 pc=0x9a918b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1 fp=0xc0005bdaa8 sp=0xc0005bd908 pc=0x9bae51
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bdac8 sp=0xc0005bdaa8 pc=0x9a918b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0 fp=0xc0005bdbb0 sp=0xc0005bdac8 pc=0x9b26d0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba2a0, 0xc0004aa200)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133 fp=0xc0005bdbe8 sp=0xc0005bdbb0 pc=0x9b1f03
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba2a0, 0xc0004aa200)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3 fp=0xc0005bdc18 sp=0xc0005bdbe8 pc=0x6d5813
occamy    | net/http.(*conn).serve(0xc00045a1e0, 0xc795c0, 0xc0004a2340)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c fp=0xc0005bdfc8 sp=0xc0005bdc18 pc=0x6d118c
occamy    | runtime.goexit()
occamy    |     /golang/go/src/runtime/asm_amd64.s:1375 +0x1 fp=0xc0005bdfd0 sp=0xc0005bdfc8 pc=0x469271
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 1 [IO wait, locked to thread]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0f48, 0x72, 0x0)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a198, 0x72, 0x0, 0x0, 0xb60197)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Accept(0xc00016a180, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:384 +0x1d4
occamy    | net.(*netFD).accept(0xc00016a180, 0x484f01e265c25fdb, 0x0, 0x484f01e265c25fdb)
occamy    |     /golang/go/src/net/fd_unix.go:238 +0x42
occamy    | net.(*TCPListener).accept(0xc00000e920, 0x5e4ad5f4, 0xc000159cf0, 0x48a536)
occamy    |     /golang/go/src/net/tcpsock_posix.go:139 +0x32
occamy    | net.(*TCPListener).Accept(0xc00000e920, 0xc000159d40, 0x18, 0xc000000180, 0x6d5cbc)
occamy    |     /golang/go/src/net/tcpsock.go:261 +0x64
occamy    | net/http.(*Server).Serve(0xc00017c0e0, 0xc77a80, 0xc00000e920, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:2901 +0x25d
occamy    | net/http.(*Server).ListenAndServe(0xc00017c0e0, 0x4, 0xb748a6)
occamy    |     /golang/go/src/net/http/server.go:2830 +0xb7
occamy    | github.com/changkun/occamy/server.(*proxy).serve(0xc00000e580)
occamy    |     /occamy/server/connection.go:70 +0x219
occamy    | github.com/changkun/occamy/server.Run(...)
occamy    |     /occamy/server/connection.go:39
occamy    | main.main()
occamy    |     /occamy/occamy.go:18 +0xe4
occamy    | 
occamy    | goroutine 34 [syscall]:
occamy    | os/signal.signal_recv(0x0)
occamy    |     /golang/go/src/runtime/sigqueue.go:147 +0x9c
occamy    | os/signal.loop()
occamy    |     /golang/go/src/os/signal/signal_unix.go:23 +0x22
occamy    | created by os/signal.Notify.func1
occamy    |     /golang/go/src/os/signal/signal.go:127 +0x44
occamy    | 
occamy    | goroutine 7 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*proxy).serve.func1(0xc00017c0e0, 0xc00007e1e0)
occamy    |     /occamy/server/connection.go:60 +0xe9
occamy    | created by github.com/changkun/occamy/server.(*proxy).serve
occamy    |     /occamy/server/connection.go:57 +0x17c
occamy    | 
occamy    | goroutine 8 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0e68, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a218, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a200, 0xc000268000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a200, 0xc000268000, 0x1000, 0x1000, 0x1aa, 0x0, 0x4cf6d2)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000101c0, 0xc000268000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | net/http.(*connReader).Read(0xc00025e3c0, 0xc000268000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:786 +0xf4
occamy    | bufio.(*Reader).fill(0xc00008ed20)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc00008ed20, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4393c0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | net/http.(*conn).readRequest(0xc000117360, 0xc795c0, 0xc000258700, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:963 +0xc76
occamy    | net/http.(*conn).serve(0xc000117360, 0xc795c0, 0xc000258700)
occamy    |     /golang/go/src/net/http/server.go:1822 +0x6d4
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 132 [syscall]:
occamy    | syscall.Syscall(0x0, 0x21, 0xc00052e000, 0x2000, 0xc0001b42f8, 0xc0001a6880, 0xc00032c5a0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x21, 0xc00052e000, 0x2000, 0x2000, 0x9e170b, 0xc0001b42a0, 0xc591f4)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x21, 0xc00052e000, 0x2000, 0x2000, 0x2a, 0x0, 0x0)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc0003372c0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc0003372c0, 0x3b, 0x28, 0xc000338030, 0xc0001f6000, 0xc00032c748, 0x9d8b67)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc0003372c0, 0x3b, 0xc000338030, 0x28, 0x28, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000337320, 0xc000308840, 0xc00030cd60, 0xc0001f6000)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 104 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc074002a00, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0002d8000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0002d8000, 0xc00007e4e0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 99 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc0003a03e0, 0xc000135340, 0xc0002368a0, 0xc0003c5980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc000135340, 0xc000363658, 0x0, 0xc0002e7550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000135340, 0xc000363658, 0x8, 0xc00011d198)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c2a0, 0xc00014ed00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c2a0, 0xc00014ed00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc000117900, 0xc795c0, 0xc000070bc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 98 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00000f0e0, 0xc0004b09a0, 0xc00007e4e0, 0xc0002d8000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0004b09a0, 0xc000365658, 0x0, 0xc000233550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b09a0, 0xc000365658, 0x8, 0xc0004be8a8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc000)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba0e0, 0xc0001ae500)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba0e0, 0xc0001ae500)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc000117860, 0xc795c0, 0xc0001926c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 48 [runnable]:
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc0001f6580, 0x1, 0xc0005ca000, 0x28, 0x28, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:740 +0x2d8
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000189320, 0xc0001968b0, 0xc000190e60, 0xc0001f6580)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 12 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0a08, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a418, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a400, 0xc0002ab000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a400, 0xc0002ab000, 0x1000, 0x1000, 0x1aa, 0x0, 0x4cf6d2)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000101e0, 0xc0002ab000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | net/http.(*connReader).Read(0xc00028a630, 0xc0002ab000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:786 +0xf4
occamy    | bufio.(*Reader).fill(0xc000073260)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000073260, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4393c0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | net/http.(*conn).readRequest(0xc0001175e0, 0xc795c0, 0xc000070a00, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:963 +0xc76
occamy    | net/http.(*conn).serve(0xc0001175e0, 0xc795c0, 0xc000070a00)
occamy    |     /golang/go/src/net/http/server.go:1822 +0x6d4
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 31 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c03e8, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a818, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a800, 0xc000370000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a800, 0xc000370000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000101f8, 0xc000370000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000336de0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000336de0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc00036a580, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00036a580, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc00036a580, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc00036a580, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00008f680, 0xc00024ac40, 0xc0003a0320, 0xc00036a580)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 105 [runnable]:
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc0004b09a0, 0x1, 0xc0002fc000, 0x28, 0x28, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:740 +0x2d8
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000073b60, 0xc00002ae90, 0xc00000f0e0, 0xc0004b09a0)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 106 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0068, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a898, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a880, 0xc0004dc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a880, 0xc0004dc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000010200, 0xc0004dc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc0004a6360)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc0004a6360, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0004b09a0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0004b09a0, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0004b09a0, 0xc000049f40, 0x44b2cf, 0xc000072000, 0x4, 0xc000072000)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0004b09a0, 0x7fc0ac079101, 0xc000049fc8, 0x6cb413, 0xc000070a80, 0xc69e01, 0xc00007c640)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000073b60, 0xc00002ae90, 0xc00000f0e0, 0xc0004b09a0)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 146 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c04c8, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009db18, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009db00, 0xc0004ec000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009db00, 0xc0004ec000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098578, 0xc0004ec000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc0004a64e0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc0004a64e0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0004b0f20, 0x2, 0xc000328000, 0xc00032e5e0, 0x43238a, 0xb8b008, 0x7fc0ad8c0790)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0004b0f20, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0004b0f20, 0xc00032e740, 0x44b2cf, 0xc000336180, 0x4, 0xc000336180)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0004b0f20, 0x7fc0ac079101, 0xc00032e7c8, 0x6cb413, 0xc00030e300, 0xc69e01, 0xc0000bcc80)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00008f740, 0xc00024ac50, 0xc0003a0360, 0xc0004b0f20)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 33 [runnable]:
occamy    | syscall.Syscall(0x0, 0x28, 0xc0003d8000, 0x2000, 0x2dd, 0x2000, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x28, 0xc0003d8000, 0x2000, 0x2000, 0x43ffbc, 0x4393c0, 0xb8b030)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x28, 0xc0003d8000, 0x2000, 0x2000, 0x5, 0x7fc0ad8c0cd0, 0x203000)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc00008f6e0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc00008f6e0, 0xc00048203b, 0xc000257180, 0x7fc0dab677d0, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc00008f6e0, 0x7fc0ac07913b, 0xc0000497c8, 0x6cb413, 0xc000258bc0, 0xc69e01, 0xc0000bce60)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00008f740, 0xc00024ac50, 0xc0003a0360, 0xc0004b0f20)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 32 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc074004800, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0002d9980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0002d9980, 0xc0002367e0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 47 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc074004b20, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc00059e000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc00059e000, 0xc00019a6c0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 30 [runnable]:
occamy    | syscall.Syscall(0x1, 0xe, 0xc00037200c, 0xc, 0xc, 0xc, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.write(0xe, 0xc00037200c, 0xc, 0x2002, 0x0, 0x416253, 0xc000316370)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:914 +0x5a
occamy    | syscall.Write(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:214
occamy    | internal/poll.(*FD).Write(0xc00016a800, 0xc00037200c, 0xc, 0x2002, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:268 +0x179
occamy    | net.(*netFD).Write(0xc00016a800, 0xc00037200c, 0xc, 0x2002, 0x0, 0x77, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:220 +0x4f
occamy    | net.(*conn).Write(0xc0000101f8, 0xc00037200c, 0xc, 0x2002, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:196 +0x8e
occamy    | github.com/gorilla/websocket.(*Conn).write(0xc00036a580, 0x1, 0x0, 0x0, 0x0, 0xc00037200c, 0xc, 0x2002, 0xc00002a360, 0x0, ...)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:378 +0x151
occamy    | github.com/gorilla/websocket.(*messageWriter).flushFrame(0xc000044718, 0xc00002a301, 0xc00002a360, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:595 +0x25f
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc00036a580, 0x1, 0xc00002a360, 0xa, 0xa, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:752 +0x247
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00008f680, 0xc00024ac40, 0xc0003a0320, 0xc00036a580)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 131 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc07c002a00, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc000526000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc000526000, 0xc0003106c0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 42 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00030cd60, 0xc0001f6000, 0xc0003106c0, 0xc000526000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0001f6000, 0xc0003a5658, 0x0, 0xc000525550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f6000, 0xc0003a5658, 0x8, 0xc0001c1cc8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc0b0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6460, 0xc0001ae600)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6460, 0xc0001ae600)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0001aa0a0, 0xc795c0, 0xc000192740)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 25 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00000e040, 0xc00036ab00, 0xc0004b4000, 0xc00059f980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc00036ab00, 0xc0001eb658, 0x0, 0xc0005c1550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036ab00, 0xc0001eb658, 0x8, 0xc000508418)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c160)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000318620, 0xc000356d00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000318620, 0xc000356d00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac0a0, 0xc795c0, 0xc00030ea40)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 23 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00030cde0, 0xc00040b4a0, 0xc000310780, 0xc000527980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc00040b4a0, 0xc0001e7658, 0x0, 0xc000521550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00040b4a0, 0xc0001e7658, 0x8, 0xc000423198)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00041c000)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00041c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00041c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004182a0, 0xc000356c00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004182a0, 0xc000356c00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0000bff40, 0xc795c0, 0xc00030e9c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 24 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc0003a0360, 0xc0004b0f20, 0xc0002367e0, 0xc0002d9980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0004b0f20, 0xc0003a9658, 0x0, 0xc0002eb550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b0f20, 0xc0003a9658, 0x8, 0xc0004becf8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0004d80b0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba1c0, 0xc000356b00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba1c0, 0xc000356b00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac000, 0xc795c0, 0xc00030e940)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 133 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ac03dee8, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc0001a6898, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc0001a6880, 0xc0001f4000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc0001a6880, 0xc0001f4000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc00018e088, 0xc0001f4000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000188d20)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000188d20, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0001f6000, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0001f6000, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0001f6000, 0xc00032ff40, 0x44b2cf, 0xc000336360, 0x4, 0xc000336360)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0001f6000, 0x7fc0ac079101, 0xc00032ffc8, 0x6cb413, 0xc00030e780, 0xc69e01, 0xc000304730)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000337320, 0xc000308840, 0xc00030cd60, 0xc0001f6000)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 16 [chan receive, locked to thread]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc0003a0320, 0xc00036a580, 0xc000236780, 0xc0003c4000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc00036a580, 0xc00022f658, 0x1, 0xc00022f550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036a580, 0xc00022f658, 0x8, 0xc000333ee8)
occamy    |     /occamy/server/routers.go:70 +0x269
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c000)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000318540, 0xc000356f00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000318540, 0xc000356f00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0001177c0, 0xc795c0, 0xc00030eb40)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 26 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc000190e60, 0xc0001f6580, 0xc00019a6c0, 0xc00059e000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0001f6580, 0xc0001ed658, 0x0, 0xc00059d550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f6580, 0xc0001ed658, 0x8, 0xc0001f81d8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc210)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6540, 0xc000356e00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6540, 0xc000356e00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac140, 0xc795c0, 0xc00030eac0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 29 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc098023ba0, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0003c4000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0003c4000, 0xc000236780)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 27 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000098500, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000253ce0, 0xc0001e9658, 0x8, 0xc0003ae428)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc000250370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc000250370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000250370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000388380, 0xc0000d0d00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000388380, 0xc0000d0d00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac1e0, 0xc795c0, 0xc000258cc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 70 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b1a20, 0xc0004f7658, 0x8, 0xc0004bf618)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0004d8370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0004d8370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba380, 0xc0004aa300)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba380, 0xc0004aa300)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a000, 0xc795c0, 0xc0004a2440)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 71 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f7080, 0xc000185658, 0x8, 0xc0001f8ae8)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc4d0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6700, 0xc0001ae800)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6700, 0xc0001ae800)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a0a0, 0xc795c0, 0xc0001929c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 72 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0002c8420, 0xc000183658, 0x8, 0xc00011df18)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a790)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a790)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a790)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c540, 0xc00014f000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c540, 0xc00014f000)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a140, 0xc795c0, 0xc000070ec0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 74 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000135e40, 0xc000321658, 0x8, 0xc00011da98)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a630)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a630)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a630)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c460, 0xc00014ef00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c460, 0xc00014ef00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a280, 0xc795c0, 0xc000070dc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 75 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036b600, 0xc000517658, 0x8, 0xc000508ce8)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c420)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c420)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c420)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0003187e0, 0xc000357100)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0003187e0, 0xc000357100)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a320, 0xc795c0, 0xc00030edc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 76 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001358c0, 0xc000187658, 0x8, 0xc00011d638)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a4d0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c380, 0xc00014ee00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c380, 0xc00014ee00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a3c0, 0xc795c0, 0xc000070cc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 77 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036b080, 0xc000369658, 0x8, 0xc0005088a8)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c2c0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000318700, 0xc000357000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000318700, 0xc000357000)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a460, 0xc795c0, 0xc00030ecc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 78 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f6b00, 0xc00031f658, 0x8, 0xc0001f8658)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6620, 0xc0001ae700)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6620, 0xc0001ae700)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a500, 0xc795c0, 0xc0001928c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 79 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000462000, 0xc0004f3658, 0x8, 0xc000423a98)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00041c2c0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000418460, 0xc000440500)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000418460, 0xc000440500)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a5a0, 0xc795c0, 0xc00040e580)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 80 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00040ba20, 0xc0003a7658, 0x8, 0xc000423618)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00041c160)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00041c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00041c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000418380, 0xc000440400)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000418380, 0xc000440400)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a640, 0xc795c0, 0xc00040e480)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 134 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc07c004800, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc000527980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc000527980, 0xc000310780)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 135 [syscall]:
occamy    | syscall.Syscall(0x0, 0x24, 0xc000534000, 0x2000, 0xc000416218, 0xc00009da80, 0xc00032d5a0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x24, 0xc000534000, 0x2000, 0x2000, 0x9e170b, 0xc0004161c0, 0xc591f4)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x24, 0xc000534000, 0x2000, 0x2000, 0x2a, 0x0, 0x0)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc0003373e0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc0003373e0, 0x3b, 0x28, 0xc0001d0090, 0xc00040b4a0, 0xc00032d748, 0x9d8b67)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc0003373e0, 0x3b, 0xc0001d0090, 0x28, 0x28, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000337440, 0xc000308930, 0xc00030cde0, 0xc00040b4a0)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 136 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0308, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009da98, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009da80, 0xc00044a000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009da80, 0xc00044a000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098570, 0xc00044a000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000426720)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000426720, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc00040b4a0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00040b4a0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc00040b4a0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc00040b4a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000337440, 0xc000308930, 0xc00030cde0, 0xc00040b4a0)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 147 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc06c002a00, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0003c5980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0003c5980, 0xc0002368a0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 148 [runnable]:
occamy    | syscall.Syscall(0x1, 0x10, 0xc00001450a, 0xf0, 0xf0, 0xf0, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.write(0x10, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x400, 0x203000)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:914 +0x5a
occamy    | syscall.Write(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:214
occamy    | internal/poll.(*FD).Write(0xc00016a900, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:268 +0x179
occamy    | net.(*netFD).Write(0xc00016a900, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x77, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:220 +0x4f
occamy    | net.(*conn).Write(0xc000010208, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:196 +0x8e
occamy    | github.com/gorilla/websocket.(*Conn).write(0xc000135340, 0x1, 0x0, 0x0, 0x0, 0xc00001450a, 0xf0, 0x2004, 0xc000478000, 0x0, ...)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:378 +0x151
occamy    | github.com/gorilla/websocket.(*messageWriter).flushFrame(0xc000044f18, 0xc000478001, 0xc000478000, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:595 +0x25f
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc000135340, 0x1, 0xc000478000, 0xec, 0xec, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:752 +0x247
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00008f860, 0xc00024ad40, 0xc0003a03e0, 0xc000135340)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 149 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ac03de08, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a918, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a900, 0xc0002bc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a900, 0xc0002bc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000010208, 0xc0002bc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000073560)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000073560, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc000135340, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc000135340, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc000135340, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc000135340, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00008f860, 0xc00024ad40, 0xc0003a03e0, 0xc000135340)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 49 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0768, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009dc18, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009dc00, 0xc0001fa000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009dc00, 0xc0001fa000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098588, 0xc0001fa000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000188ea0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000188ea0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0001f6580, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0001f6580, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0001f6580, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0001f6580, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000189320, 0xc0001968b0, 0xc000190e60, 0xc0001f6580)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 150 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc05c000b90, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc00059f980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc00059f980, 0xc0004b4000)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 151 [runnable]:
occamy    | syscall.Syscall(0x0, 0x2e, 0xc0003f0000, 0x2000, 0x2dd, 0x2000, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x2e, 0xc0003f0000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x2e, 0xc0003f0000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc0004a60c0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc0004a60c0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc0004a60c0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc0004a6120, 0xc00002a090, 0xc00000e040, 0xc00036ab00)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 152 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0148, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009db98, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009db80, 0xc00050c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009db80, 0xc00050c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098580, 0xc00050c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000336f00)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000336f00, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc00036ab00, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00036ab00, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc00036ab00, 0xc00032ef40, 0x44b2cf, 0xc000336360, 0x4, 0xc000336360)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc00036ab00, 0x7fc0ac079101, 0xc00032efc8, 0x6cb413, 0xc000192280, 0xc69e01, 0xc000304280)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc0004a6120, 0xc00002a090, 0xc00000e040, 0xc00036ab00)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | rax    0x0
occamy    | rbx    0x7fc0dabb9000
occamy    | rcx    0x7fc0da1d8337
occamy    | rdx    0x6
occamy    | rdi    0x1
occamy    | rsi    0x1d
occamy    | rbp    0x7fc0da32cbe0
occamy    | rsp    0x7fc089ff7898
occamy    | r8     0x0
occamy    | r9     0x7fc05c006e30
occamy    | r10    0x8
occamy    | r11    0x202
occamy    | r12    0x7fc0d9f61fb1
occamy    | r13    0x7fc0d9f62340
occamy    | r14    0xc
occamy    | r15    0x7fc08c058800
occamy    | rip    0x7fc0da1d8337
occamy    | rflags 0x202
occamy    | cs     0x33
occamy    | fs     0x0
occamy    | gs     0x0

from occamy.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.