[Crash-utility] [RFC PATCH 10/15] Support "sym -p" option
HAGIO KAZUHITO(萩尾 一仁)
k-hagio-ab at nec.com
Thu Jun 1 08:09:06 UTC 2023
On 2023/05/29 20:53, lijiang wrote:
> On Thu, May 11, 2023 at 12:35 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab at nec.com>
> wrote:
>
>> Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
>> ---
>> symbols.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 69 insertions(+)
>>
>> diff --git a/symbols.c b/symbols.c
>> index a432909ff28e..62092ba7d723 100644
>> --- a/symbols.c
>> +++ b/symbols.c
>> @@ -111,6 +111,7 @@ static ulong module_mem_end(ulong, struct load_module
>> *);
>> static int _in_module_range(ulong, struct load_module *, int, int);
>> struct syment *value_search_module_v2(ulong, ulong *);
>> struct syment *next_module_symbol(char *, struct syment *, ulong);
>> +struct syment *prev_module_symbol(struct syment *, ulong);
>>
>>
> Is it possible to put the [patch 09/15] and [patch 10/15] together? They
> have similar changes.
Sure.
>
>
>> static const char *module_start_tags[];
>> static const char *module_start_strs[];
>> @@ -6073,6 +6074,71 @@ next_symbol(char *symbol, struct syment *sp_in)
>> return NULL;
>> }
>>
>> +/* Only for 6.4 and later */
>> +struct syment *
>> +prev_module_symbol(struct syment *sp_in, ulong val_in)
>> +{
>> + int i, j, k;
>> + struct load_module *lm;
>> + struct syment *sp, *sp_end;
>> +
>> + if (val_in)
>> + goto value_search;
>> +
>> + for (i = 0; i < st->mods_installed; i++) {
>> + lm = &st->load_modules[i];
>> +
>> + /* quick check: sp_in is not in the module range. */
>> + if (sp_in < lm->symtable[lm->address_order[0]] ||
>> + sp_in > lm->symend[lm->address_order[lm->nr_mems-1]])
>> + continue;
>> +
>> + for (j = 0; j < lm->nr_mems; j++) {
>> + k = lm->address_order[j];
>> + if (sp_in < lm->symtable[k] || sp_in >
>> lm->symend[k])
>> + continue;
>> +
>> + if (sp_in == lm->symtable[k])
>> + return prev_module_symbol(NULL,
>> sp_in->value);
>> +
>> + sp = sp_in - 1;
>> + if (MODULE_PSEUDO_SYMBOL(sp))
>> + return prev_module_symbol(NULL, sp->value);
>> +
>>
>
> Similarly, recursive function again. I have one question about it: how does
> it affect the performance when the recursion is deep enough? If it is not
> too deep, that should be good.
As I wrote in 09/15, it just looks recursive.
The depth is 2 at most.
Thanks,
Kazu
>
> Thanks.
> Lianbo
>
>
>> + return sp;
>> + }
>> + }
>> + return NULL;
>> +
>> +value_search:
>> + sp = sp_end = NULL;
>> + for (i = 0; i < st->mods_installed; i++) {
>> + lm = &st->load_modules[i];
>> +
>> + /* quick check: val_in is lower than the lowest in the
>> module. */
>> + if (val_in < lm->symtable[lm->address_order[0]]->value)
>> + continue;
>> +
>> + for (j = lm->nr_mems - 1; j >= 0 ; j--) {
>> + k = lm->address_order[j];
>> + if (val_in > lm->symend[k]->value &&
>> + (sp == NULL || lm->symend[k]->value >
>> sp->value)) {
>> + sp = lm->symtable[k];
>> + sp_end = lm->symend[k];
>> + break;
>> + }
>> + }
>> + }
>> + for ( ; sp_end > sp; sp_end--) {
>> + if (MODULE_PSEUDO_SYMBOL(sp_end))
>> + continue;
>> + if (sp_end->value > val_in)
>> + return sp_end;
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> /*
>> * For a given symbol, return a pointer to the previous (lower) symbol's
>> syment.
>> * Either a symbol name or syment pointer may be passed as an argument.
>> @@ -6096,6 +6162,9 @@ prev_symbol(char *symbol, struct syment *sp_in)
>> sp_prev = sp;
>> }
>>
>> + if (MODULE_MEMORY())
>> + return prev_module_symbol(sp_in, 0);
>> +
>> search_init = FALSE;
>>
>> for (i = 0; i < st->mods_installed; i++) {
>> --
>> 2.31.1
>>
>>
More information about the Crash-utility
mailing list