{"record":{"id":"9a179de5642346f8","repo":"NationalSecurityAgency/ghidra","slug":"could-not-read-value","errorCode":null,"errorMessage":"Could not read value: {}","messagePattern":"Could not read value: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py","lineNumber":930,"sourceCode":"        if name == 'bytes_value':\n            return msg.bytes_value, sch.BYTE_ARR\n        if name == 'char_arr_value':\n            return msg.char_arr_value, sch.CHAR_ARR\n        if name == 'short_arr_value':\n            return list(msg.short_arr_value.arr), sch.SHORT_ARR\n        if name == 'int_arr_value':\n            return list(msg.int_arr_value.arr), sch.INT_ARR\n        if name == 'long_arr_value':\n            return list(msg.long_arr_value.arr), sch.LONG_ARR\n        if name == 'string_arr_value':\n            return list(msg.string_arr_value.arr), sch.STRING_ARR\n        if name == 'address_value':\n            return Client._read_address(msg.address_value), sch.ADDRESS\n        if name == 'range_value':\n            return Client._read_range(msg.range_value), sch.RANGE\n        if name == 'child_desc':\n            return Client._read_obj_desc(msg.child_desc), sch.OBJECT\n        raise ValueError(\"Could not read value: {}\".format(msg))\n\n    def __init__(self, s, description: str, method_registry: MethodRegistry):\n        self._traces: Dict[int, Trace] = {}\n        self._next_trace_id: int = 1\n        self.tlock: Lock = Lock()\n\n        self.receiver: Receiver = Receiver(self)\n        self.cur_batch: Optional[Batch] = None\n        self._block: Lock = Lock()\n        self.s: socket.socket = s\n        self.slock: Lock = Lock()\n        self.receiver.start()\n        self._method_registry: MethodRegistry = method_registry\n        self.description: str = self._negotiate(description)\n\n    def __repr__(self) -> str:\n        return f\"<ghidratrace.Client {self.s}>\"\n","sourceCodeStart":912,"sourceCodeEnd":948,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py#L912-L948","documentation":"Raised by Client._read_value() when deserializing an incoming Value and the active oneof field name does not match any reader branch (bool/byte/.../int_arr/.../address/range/child_desc). It indicates a protobuf Value carrying a field the client does not know how to decode — a protocol/schema mismatch rather than bad user data.","triggerScenarios":"A newer server sends a Value field type this older client cannot read; a corrupted or partially-constructed message; an unknown field that protobuf preserved as the which-oneof name.","commonSituations":"Client/server version skew where the server added a new value kind; truncated/garbled network data; testing with hand-built protobuf messages.","solutions":["Upgrade the client and server to matching ghidratrace versions.","Inspect the offending message (the exception prints msg) to identify the unexpected field name.","If developing a new value kind, add a reader branch in _read_value before deploying."],"exampleFix":"// not a code fix — version alignment\n# before: client on old ghidratrace, server on new\n# after: pin both ends to the same ghidratrace release","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    value = Client._read_value(msg)\nexcept ValueError:\n    log.error('Unsupported incoming Value field; likely version skew')\n    raise","preventionTips":["Keep client and server on the same ghidratrace version.","Add a reader branch when introducing a new value kind."],"tags":["internal","trace-rmi","deserialization","protocol-version"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}