mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-06 05:45:29 +02:00

I'm not sure how we missed this problem before. When I take a function address and size from an oops and give it to faddr2line, it usually complains about a size mismatch: $ scripts/faddr2line ~/k/vmlinux write_sysrq_trigger+0x51/0x60 skipping write_sysrq_trigger address at 0xffffffff815731a1 due to size mismatch (0x60 != 83) no match for write_sysrq_trigger+0x51/0x60 The problem is caused by differences in how kallsyms and faddr2line determine a function's size. kallsyms calculates a function's size by parsing the output of 'nm -n' and subtracting the next function's address from the current function's address. This means that nop instructions after the end of the function are included in the size. In contrast, faddr2line reads the size from the symbol table, which does *not* include the ending nops in the function's size. Change faddr2line to calculate the size from the output of 'nm -n' to be consistent with kallsyms and oops outputs. Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/bd313ed7c4003f6b1fda63e825325c44a9d837de.1477405374.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
5.1 KiB
Executable File
5.1 KiB
Executable File
#!/bin/bash
Translate stack dump function offsets.
addr2line doesn't work with KASLR addresses. This works similarly to
addr2line, but instead takes the 'func+0x123' format as input:
$ ./scripts/faddr2line ~/k/vmlinux meminfo_proc_show+0x5/0x568
meminfo_proc_show+0x5/0x568:
meminfo_proc_show at fs/proc/meminfo.c:27
If the address is part of an inlined function, the full inline call chain is
printed:
$ ./scripts/faddr2line ~/k/vmlinux native_write_msr+0x6/0x27
native_write_msr+0x6/0x27:
arch_static_branch at arch/x86/include/asm/msr.h:121
(inlined by) static_key_false at include/linux/jump_label.h:125
(inlined by) native_write_msr at arch/x86/include/asm/msr.h:125
The function size after the '/' in the input is optional, but recommended.
It's used to help disambiguate any duplicate symbol names, which can occur
rarely. If the size is omitted for a duplicate symbol then it's possible for
multiple code sites to be printed:
$ ./scripts/faddr2line ~/k/vmlinux raw_ioctl+0x5
raw_ioctl+0x5/0x20:
raw_ioctl at drivers/char/raw.c:122
raw_ioctl+0x5/0xb1:
raw_ioctl at net/ipv4/raw.c:876
Multiple addresses can be specified on a single command line:
$ ./scripts/faddr2line ~/k/vmlinux type_show+0x10/45 free_reserved_area+0x90
type_show+0x10/0x2d:
type_show at drivers/video/backlight/backlight.c:213
free_reserved_area+0x90/0x123:
free_reserved_area at mm/page_alloc.c:6429 (discriminator 2)
set -o errexit set -o nounset
command -v awk >/dev/null 2>&1 || die "awk isn't installed" command -v readelf >/dev/null 2>&1 || die "readelf isn't installed" command -v addr2line >/dev/null 2>&1 || die "addr2line isn't installed"
usage() { echo "usage: faddr2line