Hi, Aditya Thank you for the fix.
On Wed, Oct 9, 2024 at 7:08 PM Aditya Gupta <adit...@linux.ibm.com> wrote: > Few vmcores don't have vmcoreinfo elf note, such as those created using > virsh-dump. > > I tried to generate a core dump file with "virsh dump" and got an error message: # ./crash vmlinux ../coredump crash 8.0.6 Copyright (C) 2002-2025 Red Hat, Inc. Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation Copyright (C) 1999-2006 Hewlett-Packard Co Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited Copyright (C) 2006, 2007 VA Linux Systems Japan K.K. Copyright (C) 2005, 2011, 2020-2024 NEC Corporation Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc. Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. Copyright (C) 2015, 2021 VMware, Inc. This program is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Enter "help copying" to see the conditions. This program has absolutely no warranty. Enter "help warranty" for details. WARNING: --vmcoreinfo is empty, will read from symbols crash: gdb_interface: gdb not initialized? Could you please double check? BTW: the kernel version is 6.12, I tested it based on aarch64 machine. Thanks Lianbo On architectures such as PowerPC64, vmcoreinfo is mandatory to fetch the > first_vmalloc_address, for vmcores of upstream linux, since crash-utility > commit: > > commit 5b24e363a898 ("get vmalloc start address from vmcoreinfo") > > Try reading from the 'vmcoreinfo_data' symbol instead, if the vmcoreinfo > crash tries to read in case of diskdump/netdump is empty/missing. > > The approach to read 'vmcoreinfo_data' was used for a live kernel, which > can be > reused in the case of missing vmcoreinfo note also, as the > 'vmcoreinfo_data' symbol is available with vmcore too > > Hence rename 'vmcoreinfo_read_string' in kernel.c to > 'vmcoreinfo_read_from_memory', and use it in netdump.c and diskdump.c > too. > > Reported-by: Anushree Mathur <anushree.mat...@linux.ibm.com> > Tested-by: Anushree Mathur <anushree.mat...@linux.ibm.com> > Signed-off-by: Aditya Gupta <adit...@linux.ibm.com> > --- > defs.h | 1 + > diskdump.c | 18 ++++++++++++++++++ > kernel.c | 9 ++++----- > netdump.c | 19 +++++++++++++++++++ > 4 files changed, 42 insertions(+), 5 deletions(-) > > diff --git a/defs.h b/defs.h > index 2231cb68b804..910264e12314 100644 > --- a/defs.h > +++ b/defs.h > @@ -6166,6 +6166,7 @@ void dump_kernel_table(int); > void dump_bt_info(struct bt_info *, char *where); > void dump_log(int); > void parse_kernel_version(char *); > +char *vmcoreinfo_read_from_memory(const char *); > > #define LOG_LEVEL(v) ((v) & 0x07) > #define SHOW_LOG_LEVEL (0x1) > diff --git a/diskdump.c b/diskdump.c > index ce3cbb7b12dd..30d0c87f84c1 100644 > --- a/diskdump.c > +++ b/diskdump.c > @@ -1041,6 +1041,13 @@ pfn_to_pos(ulong pfn) > return desc_pos; > } > > +/** > + * Check if vmcoreinfo in vmcore is missing/empty > + */ > +static bool is_vmcoreinfo_empty(void) > +{ > + return (dd->sub_header_kdump->size_vmcoreinfo == 0); > +} > > /* > * Determine whether a file is a diskdump creation, and if TRUE, > @@ -1088,6 +1095,17 @@ is_diskdump(char *file) > > pc->read_vmcoreinfo = vmcoreinfo_read_string; > > + /* > + * vmcoreinfo can be empty in case of dump collected via virsh-dump > + * > + * check if vmcoreinfo is not available in vmcore, and try to read > + * thev vmcore from memory, using "vmcoreinfo_data" symbol > + */ > + if (is_vmcoreinfo_empty()) { > + error(WARNING, "vmcoreinfo is empty, will read from > symbols\n"); > + pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; > + } > + > if ((pc->flags2 & GET_LOG) && KDUMP_CMPRS_VALID()) { > pc->dfd = dd->dfd; > pc->readmem = read_diskdump; > diff --git a/kernel.c b/kernel.c > index adb19ad8725d..7d26a5c5a0a1 100644 > --- a/kernel.c > +++ b/kernel.c > @@ -99,7 +99,6 @@ static ulong dump_audit_skb_queue(ulong); > static ulong __dump_audit(char *); > static void dump_audit(void); > static void dump_printk_safe_seq_buf(int); > -static char *vmcoreinfo_read_string(const char *); > static void check_vmcoreinfo(void); > static int is_pvops_xen(void); > static int get_linux_banner_from_vmlinux(char *, size_t); > @@ -11852,8 +11851,8 @@ dump_printk_safe_seq_buf(int msg_flags) > * Returns a string (that has to be freed by the caller) that contains the > * value for key or NULL if the key has not been found. > */ > -static char * > -vmcoreinfo_read_string(const char *key) > +char * > +vmcoreinfo_read_from_memory(const char *key) > { > char *buf, *value_string, *p1, *p2; > size_t value_length; > @@ -11918,10 +11917,10 @@ check_vmcoreinfo(void) > switch (get_symbol_type("vmcoreinfo_data", NULL, NULL)) > { > case TYPE_CODE_PTR: > - pc->read_vmcoreinfo = vmcoreinfo_read_string; > + pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; > break; > case TYPE_CODE_ARRAY: > - pc->read_vmcoreinfo = vmcoreinfo_read_string; > + pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; > break; > } > } > diff --git a/netdump.c b/netdump.c > index b4e2a5cb2037..c69c7a1e80db 100644 > --- a/netdump.c > +++ b/netdump.c > @@ -111,6 +111,14 @@ map_cpus_to_prstatus(void) > FREEBUF(nt_ptr); > } > > +/** > + * Check if vmcoreinfo in vmcore is missing/empty > + */ > +static bool is_vmcoreinfo_empty(void) > +{ > + return (nd->size_vmcoreinfo == 0); > +} > + > /* > * Determine whether a file is a netdump/diskdump/kdump creation, > * and if TRUE, initialize the vmcore_data structure. > @@ -464,6 +472,17 @@ is_netdump(char *file, ulong source_query) > > pc->read_vmcoreinfo = vmcoreinfo_read_string; > > + /* > + * vmcoreinfo can be empty in case of dump collected via virsh-dump > + * > + * check if vmcoreinfo is not available in vmcore, and try to read > + * thev vmcore from memory, using "vmcoreinfo_data" symbol > + */ > + if (is_vmcoreinfo_empty()) { > + error(WARNING, "vmcoreinfo is empty, will read from > symbols\n"); > + pc->read_vmcoreinfo = vmcoreinfo_read_from_memory; > + } > + > if ((source_query == KDUMP_LOCAL) && > (pc->flags2 & GET_OSRELEASE)) > kdump_get_osrelease(); > -- > 2.46.2 > >
-- Crash-utility mailing list -- devel@lists.crash-utility.osci.io To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki