linux-yocto/scripts/faddr2line
NeilBrown 2aab9c3ca4 scripts: fix faddr2line to work on last symbol
If faddr2line is given a function name which is the last one listed by
"nm -n", it will fail because it never finds the next symbol.

So teach the awk script to catch that possibility, and use 'size' to
provide the end point of the last function.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2017-10-12 12:26:52 -07:00

5.2 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