rpc sendResponse panic:reflect: 在 ptr 上调用 reflect.Value.Int
Posted
技术标签:
【中文标题】rpc sendResponse panic:reflect: 在 ptr 上调用 reflect.Value.Int【英文标题】:rpc sendResponse panic:reflect: call of reflect.Value.Int on ptr 【发布时间】:2017-08-22 13:14:40 【问题描述】:我的服务器在生产环境中运行良好,前天就崩溃了。
我在 Go 论坛上发布了一个问题,有人告诉我进行种族检测。
我看到 net/rpc.(*Server).sendResponse 是线程安全的。
rpc包中的sendResponse有什么问题吗?
在我的代码中,reply 只是一个 *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
源码就是这样。reply *int是直接return的,RPC1中没有修改
【问题讨论】:
运行比赛检测器。然后尝试检查是什么数据触发了这个——也许你有不寻常的数据导致了恐慌?您可能需要在出错时提供代码以供他人帮助。我会先尝试重现它。 @KennyGrant ,此评论中的代码格式不对,所以我把它贴在下面,谢谢~ 【参考方案1】:我认为net/rpc
包中的sendResponse
函数没有问题。
当遇到nil
的指针时,Encode 函数中的请求会发生混乱。您应该阅读gob/encodeStruct
上的文档,了解在什么情况下它无法对值进行编码。
【讨论】:
以上是关于rpc sendResponse panic:reflect: 在 ptr 上调用 reflect.Value.Int的主要内容,如果未能解决你的问题,请参考以下文章
BluetoothGattServer.sendResponse 中的数据长度不能超过 20 字节。 (低功耗蓝牙)
致命异常:NSInternalInconsistencyException 此请求已被绝育 - 您不能调用 -sendResponse: 两次,也不能在编码后调用