2017-08-22 61 views
0

我的服务器在前天惊慌失措时在生产环境中运行良好。rpc sendResponse panic:反映:调用ptr上的reflect.Value.Int

我在Go论坛发布了一个问题,有人告诉我要进行种族检测。

我看到net/rpc。(* Server).sendResponse是线程安全的。

这有什么错sendResponse在RPC包

在我的代码,答复是只有* int而没有做任何事情功能,所以我不知道有这种恐慌:

panic: reflect: call of reflect.Value.Int on ptr Value [recovered] 
panic: reflect: call of reflect.Value.Int on ptr Value 
goroutine 52598456 [running]: 
encoding/gob.catchError(0xc4209e10d0) 
/root/go/src/encoding/gob/error.go:38 +0x95 
    panic(0xc40860, 0xc42606ad00) 
/root/go/src/runtime/panic.go:489 +0x2cf 
    reflect.Value.Int(0xbcdec0, 0xc4251fe520, 0x196, 0x196) 
/root/go/src/reflect/value.go:902 +0xb5 
    encoding/gob.encInt(0xc423ab4ae0, 0xc422da1e40, 0xbcdec0, 0xc4251fe520, 0x196) 
/root/go/src/encoding/gob/encode.go:188 +0x43 
    encoding/gob.(*Encoder).encodeStruct(0xc4209e1040, 0xc4209e1078, 0xc421a28a20, 0xcc1be0, 0xc4251fe510, 0x199) 
/root/go/src/encoding/gob/encode.go:334 +0x256 
    encoding/gob.(*Encoder).encode(0xc4209e1040, 0xc4209e1078, 0xcc1be0, 0xc4251fe510, 0x199, 0xc4209c3480) 
/root/go/src/encoding/gob/encode.go:707 +0x1d3 
    encoding/gob.(*Encoder).EncodeValue(0xc4209e1040, 0xc95bc0, 0xc4251fe510, 0x16, 0x0, 0x0) 
/root/go/src/encoding/gob/encoder.go:250 +0x3ab 
    encoding/gob.(*Encoder).Encode(0xc4209e1040, 0xc95bc0, 0xc4251fe510, 0x0, 0x0) 
/root/go/src/encoding/gob/encoder.go:175 +0x61 
    net/rpc.(*gobServerCodec).WriteResponse(0xc422b51ec0, 0xc422d737d0, 0xc95bc0, 0xc4251fe510, 0xc422b43a40, 0xc422b4a350) 
/root/go/src/net/rpc/server.go:424 +0x1dd 
    net/rpc.(*Server).sendResponse(0xc420055680, 0xc422b45aa0, 0xc421c4ff00, 0xc95bc0, 0xc4251fe510, 0x1334ac0, 0xc422b51ec0, 0x0, 0x0) 
/root/go/src/net/rpc/server.go:366 +0x130 
    net/rpc.(*service).call(0xc422afe900, 0xc420055680, 0xc422b45aa0, 0xc422b4ec00, 0xc421c4ff00, 0xbc3800, 0xc427ab07e0, 0x16, 0xc95bc0, 0xc4251fe510, ...) 
/root/go/src/net/rpc/server.go:394 +0x22e 
    created by net/rpc.(*Server).ServeCodec 
/root/go/src/net/rpc/server.go:481 +0x404  

type RpcArgs struct{ A string B int32 C string D int32 E String F int32 G int32 H int32 I bool J string K int32 L String M int32 N int32 O int32 P bool }

func RPC1(args *RpcArgs, reply *int) error{ //some simple logic with args, do noting with reply //do another async rpc call,may be this is useless var reply2 int rpc.Client.Go(serviceMethod, args, &reply2, make(chan *rpc.Call, 1)) return nil }

源代码就像that.reply * int是直接返回未在RPC1

+0

运行比赛检测器。然后尝试检查哪些数据触发了这种情况 - 也许您有导致恐慌的异常数据?您可能需要提供代码以帮助某人提供帮助。我会尽力重现它。 –

+0

@KennyGrant,这个评论中的代码是不正确的格式,所以我把它贴在下面,谢谢〜 – Prinny

回答

0

我不认为是一个在net/rpcsendResponse功能的问题进行修改。

当编码函数碰到指针nil时,请求在编码函数中发生混乱。您应该阅读gob/encodeStruct上的文档以了解它在哪些情况下无法对值进行编码。