- 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 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 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 redhat.com, oomichi mxs.nes.nec.co.jp,
bob.montgomery 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 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 redhat.com, oomichi mxs.nes.nec.co.jp,
indou.takao jp.fujitsu.com, akiyama.nobuyuk 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 redhat.com)
- Fix for 4.0-3.21 "BOOKE" ppc.c patch, which
failed to compile.
(antipov ru.mvista.com)
Download from: http://people.redha
t.com/anderson
--
Crash-utility mailing list
Crash-utility redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
|