Make rz_core_analysis_var_display work with stack vars when debugging (#3687)
This commit is contained in:
parent
594e5885ab
commit
c9fe729ce0
6 changed files with 39 additions and 16 deletions
|
|
@ -404,19 +404,6 @@ RZ_API RZ_BORROW RzAnalysisVar *rz_analysis_function_get_reg_var_at(RzAnalysisFu
|
|||
return rz_analysis_function_get_var_at(fcn, &stor);
|
||||
}
|
||||
|
||||
RZ_API ut64 rz_analysis_var_addr(RzAnalysisVar *var) {
|
||||
rz_return_val_if_fail(var, UT64_MAX);
|
||||
RzAnalysis *analysis = var->fcn->analysis;
|
||||
const char *regname = NULL;
|
||||
if (var->storage.type == RZ_ANALYSIS_VAR_STORAGE_STACK) {
|
||||
// TODO: If bp is not available, we can also get the address from the sp
|
||||
// through info available from rz_analysis_block_get_sp_at()
|
||||
regname = rz_reg_get_name(analysis->reg, RZ_REG_NAME_BP);
|
||||
return rz_reg_getv(analysis->reg, regname) + var->fcn->bp_off + var->storage.stack_off;
|
||||
}
|
||||
return UT64_MAX;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine which stack variable the expression reg+reg_addend points to at the given address
|
||||
* using stored RzAnalysisVarAccess info.
|
||||
|
|
|
|||
|
|
@ -5097,6 +5097,26 @@ RZ_IPI bool rz_core_analysis_function_delete_var(RzCore *core, RzAnalysisFunctio
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the address of a stack variable.
|
||||
*
|
||||
* The address for stack backed variables is computed from the
|
||||
* current base pointer register. Register backed variables will always
|
||||
* return UT64_MAX.
|
||||
*
|
||||
* \param var Pointer to a \ref RzAnalysisVar.
|
||||
*/
|
||||
RZ_API ut64 rz_core_analysis_var_addr(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var) {
|
||||
rz_return_val_if_fail(core && var, UT64_MAX);
|
||||
if (var->storage.type == RZ_ANALYSIS_VAR_STORAGE_STACK) {
|
||||
// TODO: If bp is not available, we can also get the address from the sp
|
||||
// through info available from rz_analysis_block_get_sp_at()
|
||||
ut64 stack = rz_core_reg_getv_by_role_or_name(core, "BP");
|
||||
return stack + var->fcn->bp_off + var->storage.stack_off;
|
||||
}
|
||||
return UT64_MAX;
|
||||
}
|
||||
|
||||
RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var, bool add_name) {
|
||||
RzAnalysis *analysis = core->analysis;
|
||||
RzStrBuf *sb = rz_strbuf_new(NULL);
|
||||
|
|
@ -5123,7 +5143,7 @@ RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NON
|
|||
break;
|
||||
}
|
||||
case RZ_ANALYSIS_VAR_STORAGE_STACK: {
|
||||
ut64 addr = rz_analysis_var_addr(var);
|
||||
ut64 addr = rz_core_analysis_var_addr(core, var);
|
||||
char *r;
|
||||
if (usePxr) {
|
||||
// TODO: convert to API
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ static RzCmdStatus type_format_print_variable(RzCore *core, const char *type, co
|
|||
free(fmt);
|
||||
return RZ_CMD_STATUS_ERROR;
|
||||
}
|
||||
ut64 addr = rz_analysis_var_addr(var);
|
||||
ut64 addr = rz_core_analysis_var_addr(core, var);
|
||||
rz_core_cmdf(core, "pf %s @ 0x%08" PFMT64x "\n", fmt, addr);
|
||||
free(fmt);
|
||||
return RZ_CMD_STATUS_OK;
|
||||
|
|
|
|||
|
|
@ -1674,7 +1674,6 @@ RZ_API bool rz_analysis_var_rename(RzAnalysisVar *var, const char *new_name, boo
|
|||
RZ_API void rz_analysis_var_resolve_overlaps(RzAnalysisVar *var);
|
||||
RZ_API void rz_analysis_var_set_type(RzAnalysisVar *var, RZ_OWN RzType *type, bool resolve_overlaps);
|
||||
RZ_API void rz_analysis_var_delete(RzAnalysisVar *var);
|
||||
RZ_API ut64 rz_analysis_var_addr(RzAnalysisVar *var);
|
||||
RZ_API void rz_analysis_var_set_access(RzAnalysisVar *var, const char *reg, ut64 access_addr, int access_type, st64 reg_addend);
|
||||
RZ_API void rz_analysis_var_remove_access_at(RzAnalysisVar *var, ut64 address);
|
||||
RZ_API void rz_analysis_var_clear_accesses(RzAnalysisVar *var);
|
||||
|
|
|
|||
|
|
@ -1282,6 +1282,8 @@ RZ_API void rz_core_rtr_enable(RZ_NONNULL RzCore *core, const char *cmdremote);
|
|||
RZ_API RZ_OWN char *rz_core_analysis_var_to_string(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var);
|
||||
RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var, bool add_name);
|
||||
|
||||
RZ_API ut64 rz_core_analysis_var_addr(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var);
|
||||
|
||||
RZ_API void rz_core_sym_name_init(RZ_NONNULL RZ_OUT RzBinSymNames *names, RZ_NONNULL RzBinSymbol *symbol);
|
||||
RZ_API void rz_core_sym_name_fini(RZ_NULLABLE RzBinSymNames *names);
|
||||
|
||||
|
|
|
|||
15
test/db/archos/linux-x64/dbg_afvd
Normal file
15
test/db/archos/linux-x64/dbg_afvd
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
NAME=dbg.afvd
|
||||
FILE=bins/elf/struct64
|
||||
ARGS=-d -A
|
||||
CMDS=<<EOF
|
||||
aa
|
||||
dcu main
|
||||
ds 8
|
||||
afvt var_ch char
|
||||
afvd var_ch
|
||||
EOF
|
||||
REGEXP_FILTER_OUT=('.'\s*)
|
||||
EXPECT=<<EOF
|
||||
'a'
|
||||
EOF
|
||||
RUN
|
||||
Loading…
Reference in a new issue