{"record":{"id":"892adeded3891961","repo":"NationalSecurityAgency/ghidra","slug":"invalid-method-name-name","errorCode":null,"errorMessage":"Invalid method name: {name}","messagePattern":"Invalid method name: (.+?)","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py","lineNumber":1358,"sourceCode":"        root.request_negotiate.version = VERSION\n        root.request_negotiate.description = description\n        self._write_methods(root.request_negotiate.methods,\n                            self._method_registry._methods.values())\n\n        def _handle(reply: bufs.ReplyNegotiate) -> str:\n            return reply.description\n        return self._now(root, 'reply_negotiate', _handle)\n\n    def _handle_invoke_method(self, request: bufs.XRequestInvokeMethod) -> Any:\n        if request.HasField('oid'):\n            if request.oid.id not in self._traces:\n                raise KeyError(f\"Invalid domain object id: {request.oid.id}\")\n            trace = self._traces[request.oid.id]\n        else:\n            trace = None\n        name = request.name\n        if not name in self._method_registry._methods:\n            raise KeyError(f\"Invalid method name: {name}\")\n        method = self._method_registry._methods[name]\n        kwargs = self._read_arguments(request.arguments, trace)\n        return method.callback(**kwargs)\n\n\nclass Receiver(Thread):\n    __slots__ = ('client', 'req_queue', '_is_shutdown')\n\n    def __init__(self, client: Client) -> None:\n        super().__init__(daemon=True)\n        self.client: Client = client\n        self.req_queue: deque[RemoteResult[Any, Any]] = deque()\n        self.qlock: Lock = Lock()\n        self._is_shutdown: bool = False\n\n    def shutdown(self) -> None:\n        self._is_shutdown = True\n","sourceCodeStart":1340,"sourceCodeEnd":1376,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py#L1340-L1376","documentation":"Raised as KeyError by Client._handle_invoke_method() when the requested method name is not present in the server's method registry. The server only knows methods that were registered and advertised during negotiation, so an unknown name means the client asked for something this server version does not provide.","triggerScenarios":"Client calls a method added in a newer ghidratrace than the server runs; method name typo; client/server built from different module sets; calling a method before its plugin loaded it into the registry.","commonSituations":"Version skew between client and server; a debugger front-end assuming a method that the deployed Ghidra build does not register.","solutions":["Align client and server to the same ghidratrace/Ghidra version so the negotiated method set matches.","Check the method list returned by negotiate before calling, and degrade gracefully if absent.","Verify spelling and that the owning plugin/module is loaded on the server."],"exampleFix":"# before\nclient.invoke('mem_search', ...)\n# after\nmethods = {m.name for m in client.negotiated_methods}\nif 'mem_search' not in methods:\n    raise RuntimeError('server does not support mem_search; upgrade Ghidra')","handlingStrategy":"validation","validationCode":"known = {m.name for m in negotiated_methods}\nif name not in known:\n    raise KeyError(f'Method {name!r} not supported by server; known: {sorted(known)}')","typeGuard":null,"tryCatchPattern":"try:\n    client.invoke(name, ...)\nexcept KeyError:\n    # method unavailable; upgrade server or fall back","preventionTips":["Check negotiated method names before calling.","Align client/server ghidratrace versions."],"tags":["version-skew","trace-rmi","method-invocation","negotiation"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}