{"record":{"id":"c26b97734450308d","repo":"NationalSecurityAgency/ghidra","slug":"cannot-map-s-s-to-dynamic-adress","errorCode":null,"errorMessage":"Cannot map %s:%s to dynamic adress","messagePattern":"Cannot map (.+?):(.+?) to dynamic adress","errorType":"exception","errorClass":"DynamicMappingException","httpStatus":null,"severity":"warning","filePath":"Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/stack/AbstractUnwoundFrame.java","lineNumber":83,"sourceCode":"\t * @param <U> the evaluation result type\n\t */\n\tprotected abstract class ArithmeticFrameVarnodeEvaluator<U>\n\t\t\textends ArithmeticVarnodeEvaluator<U> {\n\t\tpublic ArithmeticFrameVarnodeEvaluator(PcodeArithmetic<U> arithmetic) {\n\t\t\tsuper(arithmetic);\n\t\t}\n\n\t\t@Override\n\t\tprotected Address applyBase(long offset) {\n\t\t\treturn AbstractUnwoundFrame.this.applyBase(offset);\n\t\t}\n\n\t\t@Override\n\t\tprotected Address translateMemory(Program program, Address address) {\n\t\t\tTraceLocation location = mappingService.getOpenMappedLocation(trace,\n\t\t\t\tnew ProgramLocation(program, address), snap);\n\t\t\tif (location == null) {\n\t\t\t\tthrow new DynamicMappingException(program, address);\n\t\t\t}\n\t\t\treturn location.getAddress();\n\t\t}\n\t}\n\n\t/**\n\t * A class which can evaluate high p-code varnodes in the context of a stack frame\n\t *\n\t * @param <U> the evaluation result type\n\t */\n\tprotected abstract class AbstractFrameVarnodeEvaluator<U> extends AbstractVarnodeEvaluator<U> {\n\t\t@Override\n\t\tprotected Address applyBase(long offset) {\n\t\t\treturn AbstractUnwoundFrame.this.applyBase(offset);\n\t\t}\n\n\t\t@Override\n\t\tprotected Address translateMemory(Program program, Address address) {","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/stack/AbstractUnwoundFrame.java#L65-L101","documentation":"ArithmeticFrameVarnodeEvaluator.translateMemory() converts a static program address into a dynamic trace address using the static mapping service. If getOpenMappedLocation(trace, ProgramLocation(program,address), snap) returns null (no mapping exists for that program/address at this snap), it throws DynamicMappingException(\"Cannot map %s:%s to dynamic adress\"). This surfaces while evaluating p-code varnodes that reference static memory during stack-frame value evaluation.","triggerScenarios":"Evaluating a high-pcode varnode (e.g. a stack/local variable whose storage references a static address) when no static-to-dynamic mapping covers that program+address at the current snap. Inspecting/unwinding a frame before mappings between the program and trace are established.","commonSituations":"Debugger stack unwinding / variable evaluation before the user has mapped modules. Mappings that cover code but not the data/local ranges referenced by the frame. Mapping changes or deletions while a frame is being evaluated.","solutions":["Establish static-to-dynamic mappings for the program regions the frame's variables reference (module/section mapping) before evaluating the frame.","Catch DynamicMappingException (a subclass of EvaluationException) and skip/degrade the variable that lacks a mapping.","Refresh mappings and re-evaluate after mapping changes."],"exampleFix":"// before\nvar value = evaluator.evaluate(varnode); // throws DynamicMappingException: no mapping\n\n// after\ntry {\n    var value = evaluator.evaluate(varnode);\n} catch (DynamicMappingException e) {\n    Msg.warn(this, \"No dynamic mapping for \" + e.getMessage() + \"; establish module mappings\");\n    return null; // or trigger mapping refresh\n}","handlingStrategy":"try-catch","validationCode":"// Before evaluating a varnode that references static memory, confirm a mapping exists\nTraceLocation loc = mappingService.getOpenMappedLocation(\n    trace, new ProgramLocation(program, address), snap);\nif (loc == null) {\n    // establish module mapping for this program/address before evaluating\n}","typeGuard":"public static boolean hasDynamicMapping(DebuggerStaticMappingService ms,\n        Trace trace, Program program, Address address, long snap) {\n    return ms.getOpenMappedLocation(trace,\n        new ProgramLocation(program, address), snap) != null;\n}","tryCatchPattern":"try {\n    T val = evaluator.evaluate(varnode);\n} catch (DynamicMappingException e) {\n    // e.getMessage() == \"Cannot map %s:%s to dynamic adress\"\n    // establish static-to-dynamic mapping or skip the variable\n}","preventionTips":["Establish static-to-dynamic module mappings before stack/variable evaluation.","Catch DynamicMappingException (subclass of EvaluationException) around varnode evaluation.","Refresh mappings after static/dynamic changes before re-evaluating frames."],"tags":["stack-unwinding","static-mapping","pcode","varnode-eval"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}