2017-08-22 1 views
0

Mein Server läuft gut in der Produktionsumgebung, als er vorgestern in Panik geraten ist.rpc sendResponse panic: reflect: Aufruf von reflect.Value.Int auf ptr

Ich habe ein Problem im Go Forum gepostet und jemand hat mir gesagt, dass ich Race Detection machen soll.

Ich sehe net/rpc. (* Server) .sendResponse ist Thread sicher.

Gibt es etwas falsch mit sendresponse in rpc Paket

In meinem Code Antwort nur ein * int ist und nicht alles funktionell tun, so habe ich keine Ahnung, mit dieser Panik:

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 }

Der Quellcode wie that.reply * int direkt zurück, die in RPC1 nicht verändert

+0

Führen Sie den Renndetektor aus. Versuchen Sie dann zu überprüfen, welche Daten das ausgelöst haben - vielleicht hatten Sie ungewöhnliche Daten, die die Panik verursacht haben? Sie müssen wahrscheinlich Code an der Stelle des Fehlers zur Verfügung stellen, damit jemand helfen kann. Ich würde versuchen, es zuerst zu reproduzieren. –

+0

@KennyGrant, der Code in diesem Kommentar ist nicht das richtige Format, also poste ich es unten, danke ~ – Prinny

Antwort

0

Ich glaube nicht, dass es ein Problem mit der sendResponse Funktion im net/rpc Paket.

Die Anfrage panics in der Funktion Encode, wenn es darum geht, über einen Zeiger, der nil ist. Sie sollten die Dokumentation unter gob/encodeStruct lesen, um zu sehen, unter welchen Umständen Werte nicht codiert werden können.

Verwandte Themen