{"record":{"id":"436864a95be0e4ff","repo":"NationalSecurityAgency/ghidra","slug":"usage-ghidra-trace-putreg-group","errorCode":null,"errorMessage":"Usage: ghidra trace putreg [GROUP]","messagePattern":"Usage: ghidra trace putreg \\[GROUP\\]","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py","lineNumber":910,"sourceCode":"def ghidra_trace_putreg(debugger: lldb.SBDebugger, command: str,\n                        result: lldb.SBCommandReturnObject,\n                        internal_dict: Dict[str, Any]) -> None:\n    \"\"\"Record the given register group for the current frame into the Ghidra\n    trace.\n\n    Usage: ghidra trace putreg [GROUP]\n\n    If no group is specified, 'all' is assumed.\n    \"\"\"\n\n    trace, tx = STATE.require_tx()\n    args = shlex.split(command)\n    if len(args) == 0:\n        group = 'all'\n    elif len(args) == 1:\n        group = args[0]\n    else:\n        raise RuntimeError(\"Usage: ghidra trace putreg [GROUP]\")\n\n    frame = util.selected_frame()\n    regs = frame.GetRegisters()\n    with trace.client.batch() as b:\n        if group != 'all':\n            bank = regs.GetFirstValueByName(group)\n            putreg(frame, bank)\n            return\n\n        for i in range(0, regs.GetSize()):\n            bank = regs.GetValueAtIndex(i)\n            putreg(frame, bank)\n\n\ndef collect_mapped_names(names: List[str], proc: lldb.SBProcess,\n                         bank: lldb.SBValue) -> None:\n    trace = STATE.require_trace()\n    mapper = trace.extra.require_rm()","sourceCodeStart":892,"sourceCodeEnd":928,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py#L892-L928","documentation":"Usage error raised by ghidra_trace_putreg when more than one token is supplied. The optional GROUP token selects a register bank; with no token, 'all' banks are recorded. Any argument count other than 0 or 1 is rejected.","triggerScenarios":"Passing two or more group names; passing flags; quoting issues that split a group name.","commonSituations":"User tries to put multiple banks in one call ('putreg gp fp'); user adds a flag.","solutions":["Pass zero tokens (record all banks) or exactly one GROUP name.","To record multiple banks, invoke putreg once per bank.","List available groups with 'register list' / frame.GetRegisters() before choosing GROUP."],"exampleFix":"// before\nghidra trace putreg general-purpose floating-point\n// after\nghidra trace putreg general-purpose","handlingStrategy":"validation","validationCode":"import shlex\n\ndef validate_putreg(command: str) -> None:\n    if len(shlex.split(command)) > 1:\n        raise ValueError('putreg takes 0 or 1 GROUP token')","typeGuard":null,"tryCatchPattern":"try:\n    ghidra_trace_putreg(debugger, command, result, internal_dict)\nexcept RuntimeError as e:\n    if str(e).startswith('Usage:'):\n        result.SetError(str(e))\n    else:\n        raise","preventionTips":["Pass at most one GROUP; omit it to record all banks.","Issue one putreg per bank for multiple banks.","List banks via frame.GetRegisters() first."],"tags":["ghidra-trace","argument-validation","registers","cli-usage"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}