[Crash-utility] [PATCH] GDB: fix the failure of 'set scope' command
lijiang
lijiang at redhat.com
Fri Mar 26 03:05:46 UTC 2021
在 2021年03月24日 22:51, John Pittman 写道:
> Applied patch and tested against 2 cores known to show the failure. Once the
> patch was applied, the issue was resolved.
>
> Tested-by: John Pittman <jpittman at redhat.com>
>
Thank you for the test, John Pittman.
> On Mon, Mar 22, 2021 at 4:31 AM Lianbo Jiang <lijiang at redhat.com> wrote:
>>
>> Currently, some command such as 'sys' may cause subsequent 'set scope'
>> commands to fail because it may not find the correct symtab associated
>> with PC and SECTION in the find_pc_sect_symtab(), eventually, this will
>> cause the following failure:
>>
>> crash> mod -S 3.10.0-957.el7.x86_64
>> crash> mod -s dm_service_time
>> crash> set scope st_create
>> set: gdb cannot find text block for address: st_create
>> crash> mod -d dm_service_time
>> crash> mod -sr dm_service_time
>> crash> set scope st_create
>> scope: ffffffffc044d270 (st_create)
>> crash> sys
>> KERNEL: 3.10.0-957.el7.x86_64/vmlinux
>> DUMPFILE: crash/vmcore [PARTIAL DUMP]
>> CPUS: 48
>> DATE: Sat Aug 3 11:41:00 EDT 2019
>> UPTIME: 1 days, 10:28:48
>> LOAD AVERAGE: 2.95, 1.02, 0.40
>> TASKS: 1060
>> NODENAME: iop053063.lss.emc.com
>> RELEASE: 3.10.0-957.el7.x86_64
>> VERSION: #1 SMP Thu Oct 4 20:48:51 UTC 2018
>> MACHINE: x86_64 (2999 Mhz)
>> MEMORY: 127.9 GB
>> PANIC: "SysRq : Trigger a crash"
>> crash> set scope st_create
>> set: gdb cannot find text block for address: st_create
>>
>> To find the correct symtab, let's check whether there is an address
>> mapping to 'block' in the symtab searching loop and the PC is in the
>> range. If the symtab associated with PC is found, and then use it.
>>
>> Signed-off-by: Lianbo Jiang <lijiang at redhat.com>
>> ---
>> gdb-7.6.patch | 38 +++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 37 insertions(+), 1 deletion(-)
>>
>> diff --git a/gdb-7.6.patch b/gdb-7.6.patch
>> index f64b55fe547a..90629889f8c4 100644
>> --- a/gdb-7.6.patch
>> +++ b/gdb-7.6.patch
>> @@ -2500,4 +2500,40 @@ diff -up gdb-7.6/opcodes/configure.orig gdb-7.6/opcodes/configure
>> +struct target_desc *tdesc_aarch64;
>> #include "features/aarch64.c"
>> #include "features/aarch64-without-fpu.c"
>> -
>> +
>> +--- gdb-7.6/gdb/symtab.c.orig
>> ++++ gdb-7.6/gdb/symtab.c
>> +@@ -2065,7 +2065,7 @@ find_pc_sect_symtab (CORE_ADDR pc, struct obj_section *section)
>> + struct symtab *s = NULL;
>> + struct symtab *best_s = NULL;
>> + struct objfile *objfile;
>> +- CORE_ADDR distance = 0;
>> ++ CORE_ADDR distance = 0, start, end;
>> + struct minimal_symbol *msymbol;
>> +
>> + /* If we know that this is not a text address, return failure. This is
>> +@@ -2102,10 +2102,20 @@ find_pc_sect_symtab (CORE_ADDR pc, struct obj_section *section)
>> + bv = BLOCKVECTOR (s);
>> + b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
>> +
>> +- if (BLOCK_START (b) <= pc
>> +- && BLOCK_END (b) > pc
>> +- && (distance == 0
>> +- || BLOCK_END (b) - BLOCK_START (b) < distance))
>> ++ start = BLOCK_START (b);
>> ++ end = BLOCK_END (b);
>> ++
>> ++ /*
>> ++ * If we have an addrmap mapping code addresses to blocks, and pc
>> ++ * is in the range [start, end), let's use it.
>> ++ */
>> ++ if ((pc >= start && pc < end) && BLOCKVECTOR_MAP (bv)) {
>> ++ if (addrmap_find (BLOCKVECTOR_MAP (bv), pc))
>> ++ return s;
>> ++ }
>> ++
>> ++ if ((pc >= start && pc < end) && ((distance == 0)
>> ++ || (end - start < distance)))
>> + {
>> + /* For an objfile that has its functions reordered,
>> + find_pc_psymtab will find the proper partial symbol table
>> --
>> 2.17.1
>>
>> --
>> Crash-utility mailing list
>> Crash-utility at redhat.com
>> https://listman.redhat.com/mailman/listinfo/crash-utility
>>
>
More information about the Crash-utility
mailing list