Make rz_core_analysis_var_display work with stack vars when debugging (#3687)

This commit is contained in:
frmdstryr 2023-07-27 13:40:22 -04:00 committed by GitHub
parent 594e5885ab
commit c9fe729ce0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 39 additions and 16 deletions

View file

@ -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.

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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);

View 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