{"record":{"id":"59d0632526302f55","repo":"NationalSecurityAgency/ghidra","slug":"static-program-is-not-opened","errorCode":null,"errorMessage":"Static program is not opened","messagePattern":"Static program is not opened","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/modules/MappingEntry.java","lineNumber":163,"sourceCode":"\t\treturn staticRange.contains(address);\n\t}\n\n\tpublic boolean isInProgramRange(AddressRange rng) {\n\t\tif (staticRange == null) {\n\t\t\treturn false;\n\t\t}\n\t\treturn staticRange.intersects(rng);\n\t}\n\n\tprotected Address mapTraceAddressToProgram(Address address) {\n\t\tassert isInTraceRange(address, null);\n\t\tlong offset = address.subtract(mapping.getMinTraceAddress());\n\t\treturn staticRange.getMinAddress().addWrapSpace(offset);\n\t}\n\n\tpublic ProgramLocation mapTraceAddressToProgramLocation(Address address) {\n\t\tif (program == null) {\n\t\t\tthrow new IllegalStateException(\"Static program is not opened\");\n\t\t}\n\t\treturn new ProgramLocation(program, mapTraceAddressToProgram(address));\n\t}\n\n\tpublic AddressRange mapTraceRangeToProgram(AddressRange rng) {\n\t\tassert isInTraceRange(rng, null);\n\t\tAddressRange part = rng.intersect(mapping.getTraceAddressRange());\n\t\tAddress min = mapTraceAddressToProgram(part.getMinAddress());\n\t\tAddress max = mapTraceAddressToProgram(part.getMaxAddress());\n\t\treturn new AddressRangeImpl(min, max);\n\t}\n\n\tprotected Address mapProgramAddressToTrace(Address address) {\n\t\tassert isInProgramRange(address);\n\t\tlong offset = address.subtract(staticRange.getMinAddress());\n\t\treturn mapping.getMinTraceAddress().addWrapSpace(offset);\n\t}\n","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/modules/MappingEntry.java#L145-L181","documentation":"MappingEntry lazily resolves the destination Program for a static mapping; the program field is null when that program is not (or no longer) open in the tool. mapTraceAddressToProgramLocation() requires the resolved program to build a ProgramLocation, so it throws IllegalStateException(\"Static program is not opened\") when program == null.","triggerScenarios":"Translating a trace address to a program location via a MappingEntry whose static program has been closed. Querying mappings before the referenced program has been opened/resolved. The program's domain file was removed or renamed so it cannot be resolved.","commonSituations":"User closes the static program that a mapping points to, then continues navigating/mapping in the debugger. Headless flows that build mappings without opening the referenced programs. Stale mapping entries after program re-import under a new name.","solutions":["Open the static program referenced by the mapping in the tool, then re-resolve mappings.","Guard before calling mapTraceAddressToProgramLocation by checking the entry has a resolved program (or that the program is open).","If the program is gone, remove/refresh the stale mapping entries."],"exampleFix":"// before\nProgramLocation loc = entry.mapTraceAddressToProgramLocation(addr); // throws if program closed\n\n// after\nProgram referenced = findReferencedProgram(entry);\nif (referenced == null || !programManager.isOpen(referenced)) {\n    programManager.openProgram(referenced);\n}\nProgramLocation loc = entry.mapTraceAddressToProgramLocation(addr);","handlingStrategy":"validation","validationCode":"// Before mapping a trace address to a program location, ensure the program is open\nProgram referenced = entry.getReferencedProgram(); // resolve via mapping URL\nif (referenced == null || !programManager.isOpen(referenced)) {\n    programManager.openProgram(referenced);\n}","typeGuard":"public static boolean mappingProgramIsOpen(MappingEntry entry,\n        DebuggerProgramManager pm) {\n    // MappingEntry.program is package-private; expose via a method that returns it\n    return entry.getProgram() != null; // null means not resolved/open\n}","tryCatchPattern":"try {\n    ProgramLocation loc = entry.mapTraceAddressToProgramLocation(addr);\n} catch (IllegalStateException e) {\n    if (e.getMessage().equals(\"Static program is not opened\")) {\n        programManager.openProgram(resolveProgramFromMapping(entry));\n        ProgramLocation loc = entry.mapTraceAddressToProgramLocation(addr);\n    } else throw e;\n}","preventionTips":["Keep the static programs referenced by mappings open while navigating the debugger.","Refresh/remove stale mapping entries when referenced programs are re-imported or removed.","Guard mapping translation calls by checking the referenced program is open."],"tags":["static-mapping","lifecycle","program-manager","precondition"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}