[Crash-utility] crash version 4.0-3.22 is available

Dave Anderson anderson at redhat.com
Tue Apr 10 15:35:35 UTC 2007


- In kernel version 2.6.20 a "__bug_table" section has been added
  to the kernel for x86 and x86_64, which contains the encoding for
  the filename and line number information associated with each
  instance of a kernel BUG().  Prior to that, x86 and x86_64 kernels
  may have contained the filename/line-number encoding in the bytes
  following the BUG()'s "ud2a" instruction.  When disassembled, the
  output would display a series of nonsensical instructions, or perhaps
  one or more "(bad)" instruction lines, before eventually getting
  back in sync with the actual instruction stream.  Whether the
  encoded bytes were included depends upon the kernel version,
  whether CONFIG_DEBUG_BUGVERBOSE was configured, or whether an
  "#if 1" surrounding the BUG() definition was manually changed.
  This version of crash determines whether the encoded bytes exist,
  and if so, the embedded gdb disassembler has been modified to
  skip over those bytes, resulting in correct "dis" command output.
  If necessary, a "dis -b" option has been added to override the
  pre-calculated encoded byte count value.  (anderson at redhat.com)

- Fix for the x86 backtrace code to also recognize the encoded
  filename and line number information potentially following
  "ud2a" instructions generated by kernel BUG() calls.  In order
  to determine the framesize of a function, the backtrace code
  does its own text disassembly to count instances of push, pop,
  and stack register increments/decrements.  Without this patch,
  the framesize calculation may either be too small or too large,
  depending upon the contents of the encoded data following the
  BUG()'s ud2a instruction.  Therefore, it is possible that one or
  more bogus frames are selected and displayed, and/or one or more
  legitimate frames are skipped over.  For example, when it affected
  the framesize calculation of schedule(), backtraces of all non-active
  tasks ending up in schedule() would be invalid.  Here's an example in
  which the schedule() framesize was miscalulated:

    PID: 1292   TASK: ed78a000  CPU: 0   COMMAND: "setroubleshootd"
     #0 [c07fdba8] schedule at c05f370e
     #1 [c07fdcb4] __journal_file_buffer at ee05126d
     #2 [c07fdcd8] __journal_file_buffer at ee05126d
     #3 [c07fdd08] ext3_mark_iloc_dirty at ee08837d
     #4 [c07fdd38] journal_dirty_metadata at ee052a13
     #5 [c07fdd80] __find_get_block at c0463f59
     #6 [c07fddac] __find_get_block at c0463f59
     #7 [c07fddf0] find_get_page at c0444294
     #8 [c07fddfc] filemap_nopage at c0446cf5
     #9 [c07fde6c] find_extend_vma at c0454132
    #10 [c07fde7c] get_futex_key at c042f9f6
    #11 [c07fde94] futex_wake at c042fe2a
    #12 [c07fdeb8] do_futex at c0430a19
    #13 [c07fdfac] sys_poll at c047254b
    #14 [c07fdfb8] system_call at c0404cf8
        EAX: ffffffda  EBX: 09f3da18  ECX: 00000002  EDX: 00000064
        DS:  007b      ESI: 00000064  ES:  007b      EDI: 00342ff4
        SS:  007b      ESP: bfe76d04  EBP: bfe76d18
        CS:  0073      EIP: 0094a402  ERR: 000000a8  EFLAGS: 00200246

  With the fix, it looks like this:

    PID: 1292   TASK: ed78a000  CPU: 0   COMMAND: "setroubleshootd"
     #0 [c07fdba8] schedule at c05f370e
     #1 [c07fdc0c] schedule_timeout at c05f3e7c
     #2 [c07fdc30] do_sys_poll at c047243e
     #3 [c07fdfac] sys_poll at c047254b
     #4 [c07fdfb8] system_call at c0404cf8
        EAX: ffffffda  EBX: 09f3da18  ECX: 00000002  EDX: 00000064
        DS:  007b      ESI: 00000064  ES:  007b      EDI: 00342ff4
        SS:  007b      ESP: bfe76d04  EBP: bfe76d18
        CS:  0073      EIP: 0094a402  ERR: 000000a8  EFLAGS: 00200246

  In the example above, the schedule() framesize was miscalculated
  because the post-ud2a text contained the filename pointer address
  c060fe0b, and the "60" was decoded as a "pusha" instruction; that
  occurred twice, each time incrementing the framesize by 32 bytes.
  (anderson at redhat.com)

- Added preparations for an upcoming version update to kdump's
  associated makedumpfile utility, which will return an error if a
  read attempt of a page that has been explicitly excluded is made.
  Until now, a zero-filled page was returned.  To maintain the
  current behavior of returning a zero-filled page when accessing
  an excluded page, three options are available:
   1) use the "--zero_excluded" crash command line option.
   2) during runtime, enter "set zero_excluded on".
   3) enter "set zero_excluded on" in your .crashrc file.
  (anderson at redhat.com, oomichi at mxs.nes.nec.co.jp, bob.montgomery at hp.com)

- Implemented "help -n" debug output function for compressed diskdump
  and compressed kdump dumpfiles.  As is done for the other dumpfile
  formats, the core file's header information along with any other
  run-time dumpfile data is displayed.  (anderson at redhat.com)

- If the page-exclusion "dump_level" of a compressed diskdump, a
  compressed kdump, or an ELF diskdump dumpfile exists and can be
  determined, its value and bitmask translation will be displayed as
  part of the "help -n" dumpfile debug output.  Also, has been done
  with partial ELF diskdumps, if a compressed diskdump or compressed
  kdump can be confirmed as a partial dump, the "[PARTIAL DUMP]"
  indicator will follow the dumpfile name during initialization and by
  the "sys" command.  (anderson at redhat.com, oomichi at mxs.nes.nec.co.jp,
  indou.takao at jp.fujitsu.com, akiyama.nobuyuk at jp.fujitsu.com)

- Support for xendumps of fully-virtualized x86_64 relocatable
  kernels.  Without the patch, the physical base address was not
  being determined, and the session would fail during initialization
  with the error message: " crash: vmlinux and core do not match!"
  (anderson at redhat.com)

- Fix for 4.0-3.21 "BOOKE" ppc.c patch, which failed to compile.
  (antipov at ru.mvista.com)

Download from: http://people.redhat.com/anderson





More information about the Crash-utility mailing list