{"record":{"id":"ea2080a2609a7b4c","repo":"NationalSecurityAgency/ghidra","slug":"events-excnum-does-not-exist","errorCode":null,"errorMessage":"Events[{excnum}] does not exist","messagePattern":"Events\\[(.+?)\\] does not exist","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/methods.py","lineNumber":229,"sourceCode":"        raise TypeError(f\"{object} is not {err_msg}\")\n    eventnum = int(mat['eventnum'])\n    return (eventnum, find_evt_by_number(eventnum))\n\n\ndef find_evt_cont_by_obj(object: TraceObject) -> DbgEng._DEBUG_SPECIFIC_FILTER_PARAMETERS:\n    return find_evt_by_pattern(PROC_EVENT_CONT_PATTERN, object, \"as Event\")\n\n\ndef find_evt_exec_by_obj(object: TraceObject) -> DbgEng._DEBUG_SPECIFIC_FILTER_PARAMETERS:\n    return find_evt_by_pattern(PROC_EVENT_EXEC_PATTERN, object, \"as Event\")\n\n\ndef find_exc_by_number(excnum: int) -> DbgEng._DEBUG_EXCEPTION_FILTER_PARAMETERS:\n    try:\n        (n_events, n_spec_exc, n_arb_exc) = util.GetNumberEventFilters()\n        return util.GetExceptionFilterParameters(n_events + excnum, None, 1)\n    except exception.E_NOINTERFACE_Error:\n        raise KeyError(f\"Events[{excnum}] does not exist\")\n\n\ndef find_exc_by_pattern(pattern: re.Pattern, object: TraceObject,\n                        err_msg: str) -> DbgEng._DEBUG_EXCEPTION_FILTER_PARAMETERS:\n    mat = pattern.fullmatch(object.path)\n    if mat is None:\n        raise TypeError(f\"{object} is not {err_msg}\")\n    excnum = int(mat['excnum'])\n    return (excnum, find_exc_by_number(excnum))\n\n\ndef find_exc_cont_by_obj(object: TraceObject) -> DbgEng._DEBUG_SPECIFIC_FILTER_PARAMETERS:\n    return find_exc_by_pattern(PROC_EXCEPTION_CONT_PATTERN, object, \"as Exception\")\n\n\ndef find_exc_exec_by_obj(object: TraceObject) -> DbgEng._DEBUG_SPECIFIC_FILTER_PARAMETERS:\n    return find_exc_by_pattern(PROC_EXCEPTION_EXEC_PATTERN, object, \"as Exception\")\n","sourceCodeStart":211,"sourceCodeEnd":247,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/methods.py#L211-L247","documentation":"Raised as KeyError by find_exc_by_number() when util.GetExceptionFilterParameters() fails with E_NOINTERFACE_Error, meaning the exception filter at that index is not registered with the DbgEng engine. Note the message textually says 'Events' although it concerns exception filters — a copy/paste quirk in the agent.","triggerScenarios":"Looking up an exception filter by excnum where n_events+excnum is out of range or the filter was never installed; querying a filter index before the engine has enumerated filters (GetNumberEventFilters returned counts that exclude the requested excnum).","commonSituations":"Indexing exception filters with a stale excnum captured before a target reload; calling before the debug session has populated its exception-filter table; off-by-one against n_events when the engine reports fewer filters than expected.","solutions":["Call util.GetNumberEventFilters() first and verify excnum is within [0, n_spec_exc) before calling find_exc_by_number().","Re-refresh the trace's exception list so the captured excnum reflects the current engine state.","Catch KeyError and surface a user-facing 'exception filter does not exist' message with the offending excnum."],"exampleFix":"// before\nparams = find_exc_by_number(excnum)\n// after\nn_events, n_spec_exc, _ = util.GetNumberEventFilters()\nif not (0 <= excnum < n_spec_exc):\n    raise KeyError(f\"Exception filter [{excnum}] out of range (have {n_spec_exc})\")\nparams = find_exc_by_number(excnum)","handlingStrategy":"validation","validationCode":"n_events, n_spec_exc, _ = util.GetNumberEventFilters()\nif not (0 <= excnum < n_spec_exc):\n    raise KeyError(f'Exception filter [{excnum}] out of range (have {n_spec_exc})')\nparams = find_exc_by_number(excnum)","typeGuard":"null","tryCatchPattern":"try:\n    params = find_exc_by_number(excnum)\nexcept KeyError:\n    # refresh filter list and re-derive excnum from the current schema\n    refresh_exceptions()\n    return None","preventionTips":["Re-derive excnum from the live trace after any target reload/restart.","Bounds-check excnum against GetNumberEventFilters() before lookup.","Treat a missing filter as a signal to refresh the exception list, not a hard failure."],"tags":["dbgeng","exception-filter","keyerror","index-out-of-range"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}