[Crash-utility] [Patch] linux-2.6.22 on i386
Dave Anderson
anderson at redhat.com
Wed Jul 25 14:28:04 UTC 2007
Ken'ichi Ohmichi wrote:
> Hi Dave,
>
> I found the problem that the crash utility fails during the initialization.
> This problem happened on i386 linux-2.6.22 like the following:
>
> $ crash vmlinux vmcore
>
> crash 4.0-4.4
> Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
> Copyright (C) 2004, 2005, 2006 IBM Corporation
> Copyright (C) 1999-2006 Hewlett-Packard Co
> Copyright (C) 2005, 2006 Fujitsu Limited
> Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.
> Copyright (C) 2005 NEC Corporation
> Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.
> Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, 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.
>
> GNU gdb 6.1
> Copyright 2004 Free Software Foundation, Inc.
> GDB 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.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "i686-pc-linux-gnu"...
>
> crash: invalid size request: 0 type: "__per_cpu_offset"
> $
>
> The cause is that the array number of the symbol "__per_cpu_offset"
> cannot be taken. In linux-2.6.21, i386's "__per_cpu_offset" is defined
> in include/asm-generic/percpu.h like the following:
>
> extern unsigned long __per_cpu_offset[NR_CPUS];
>
> But in linux-2.6.22, it is defined in include/asm-i386/percpu.h like
> the following, and the array number is not described in the debugging
> information.
>
> extern unsigned long __per_cpu_offset[];
>
>
> Here is the patch for solving the problem. If the array number is not
> taken, the crash utility assumes that it is the defined value NR_CPUS.
> Or, should get_array_length() be fixed to get the array number from
> init/main.c ?
>
Ken'ichi -- thanks for tracking that down.
I don't see how get_array_length() can be "fixed" in this case -- if the
vmlinux file doesn't have the info, it doesn't have it. I'm not sure
what you mean by getting it from init/main.c?
Anyway, using NR_CPUS is probably safe, although it runs the remote
risk of reading into a non-existent section of memory or uncopied
section of dumpfile.
How about using Cliff Wickman's new get_cpus_possible() function
from his LKCD_KERNTYPES patch? Since get_cpus_possible() returns 0
on failure, your fix below should be left in place, but it might be
worth also trying get_cpus_possible() if get_array_length() returns 0?
Dave
>
> Thanks
> Ken'ichi Ohmichi
>
> --- crash-4.0-4.4.org/kernel.c 2007-07-21 04:19:23.000000000 +0900
> +++ crash-4.0-4.4/kernel.c 2007-07-24 19:51:55.000000000 +0900
> @@ -170,7 +170,7 @@ kernel_init()
> else
> i = get_array_length("__per_cpu_offset", NULL, 0);
> get_symbol_data("__per_cpu_offset",
> - sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS),
> + sizeof(long)*((i && (i <= NR_CPUS)) ? i : NR_CPUS),
> &kt->__per_cpu_offset[0]);
> kt->flags |= PER_CPU_OFF;
> }
> _
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
More information about the Crash-utility
mailing list