{"record":{"id":"329d5e87cc52e9f3","repo":"NationalSecurityAgency/ghidra","slug":"usage-ghidra-trace-delreg-group","errorCode":null,"errorMessage":"Usage: ghidra trace delreg [GROUP]","messagePattern":"Usage: ghidra trace delreg \\[GROUP\\]","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py","lineNumber":955,"sourceCode":"                        internal_dict: Dict[str, Any]) -> None:\n    \"\"\"Delete the given register group for the current frame from the Ghidra\n    trace.\n\n    Usage: ghidra trace delreg [GROUP]\n\n    If no group is specified, 'all' is assumed.\n\n    Why would you do this? There are probably good reasons, but please consider\n    that deleting information is typically not helping the user.\n    \"\"\"\n\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 delreg [GROUP]\")\n\n    trace, tx = STATE.require_tx()\n    proc = util.get_process()\n    frame = util.selected_frame()\n    regs = frame.GetRegisters()\n    space = REGS_PATTERN.format(procnum=proc.GetProcessID(), tnum=util.selected_thread().GetThreadID(),\n                                level=frame.GetFrameID())\n    names: List[str] = []\n    if group != 'all':\n        bank = regs.GetFirstValueByName(group)\n        collect_mapped_names(names, proc, bank)\n    else:\n        for i in range(regs.GetSize()):\n            bank = regs.GetValueAtIndex(i)\n            collect_mapped_names(names, proc, bank)\n    trace.delete_registers(space, names)\n\n","sourceCodeStart":937,"sourceCodeEnd":973,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py#L937-L973","documentation":"Usage error raised by ghidra_trace_delreg when more than one token is supplied. delreg removes recorded registers from the trace; with no GROUP it deletes 'all'. Like delmem, deletion is by design constrained.","triggerScenarios":"Passing multiple group tokens; passing flags; passing a second argument by accident.","commonSituations":"User mirrors a multi-bank putreg call into delreg; user appends a confirmation flag.","solutions":["Pass zero tokens (delete all banks) or exactly one GROUP.","Delete additional banks with separate delreg calls.","Consider whether deletion is necessary; the docstring cautions against it."],"exampleFix":"// before\nghidra trace delreg gp fp\n// after\nghidra trace delreg gp","handlingStrategy":"validation","validationCode":"import shlex\n\ndef validate_delreg(command: str) -> None:\n    if len(shlex.split(command)) > 1:\n        raise ValueError('delreg takes 0 or 1 GROUP token')","typeGuard":null,"tryCatchPattern":"try:\n    ghidra_trace_delreg(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 to delete all banks.","Use separate delreg calls for multiple banks.","Reconsider whether deletion is necessary."],"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"}