Panic in rpc gob encode, response type error in reflect

On centos 6.5 , go version 1.8, stack:

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
	
the source code just like below:
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){
	//some simple logic
	....
	//do another async rpc call,and then painc in gob encode
	rpc.Client.Go(serviceMethod, args, reply, make(chan *rpc.Call, 1))
}

I don’t know why in encodeStruct function, encInt is called but its real type is ptr.The funcion RPC1 is called many many times well but panic suddenly.I’m learning source code of RPC and Gob to find reason now and hope someone can help me with this problem. Thank you very much.

Have you run your code with he race detector?

Thank you for your reply.I didn’t do race detection while i think the panic isn’ t in RPC1 funciton.The root call stack is “created by net/rpc.(*Server).ServeCodec”, so if i do race, i need to do a test on “net/rpc.(*service).call” or “net/rpc.(*gobServerCodec).WriteResponse” or other function in rpc.(*Server),right?
I just make a simple client and do this rpc call in many goroutine, unfortunately,it isn’ t happend.

The reason I’m recommending the race detector is that I don’t see any other obvious reason from the code you pasted and unexplained crashes with “impossible” values and types are often data races. If you can reproduce this when running with the race detector, and it does not comaplain about any data races, it’s time to dig deeper.

Ah yes, thanks. That makes sense. I need to have a try.

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.