Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-17 Thread Josh Poimboeuf
On Sat, Sep 17, 2016 at 10:15:45AM +0200, Rabin Vincent wrote:
> On Fri, Sep 16, 2016 at 04:26:56PM -0500, Josh Poimboeuf wrote:
> > +   addr2line -ie $objfile $hexaddr
> 
> Could you pass in -f and -p too to addr2line?
> 
> Before:
> 
>  $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
>  /home/rabin/dev/linux/include/linux/compiler.h:222
>  /home/rabin/dev/linux/include/linux/page-flags.h:149
>  /home/rabin/dev/linux/include/linux/page-flags.h:154
>  /home/rabin/dev/linux/include/linux/page-flags.h:287
>  /home/rabin/dev/linux/include/linux/mm.h:1778
>  /home/rabin/dev/linux/include/linux/mm.h:1785
>  /home/rabin/dev/linux/mm/page_alloc.c:6599
> 
> After:
> 
>  $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
>  __read_once_size at /home/rabin/dev/linux/include/linux/compiler.h:222
>   (inlined by) PageTail at 
> /home/rabin/dev/linux/include/linux/page-flags.h:149
>   (inlined by) PageCompound at 
> /home/rabin/dev/linux/include/linux/page-flags.h:154
>   (inlined by) ClearPageReserved at 
> /home/rabin/dev/linux/include/linux/page-flags.h:287
>   (inlined by) __free_reserved_page at 
> /home/rabin/dev/linux/include/linux/mm.h:1778
>   (inlined by) free_reserved_page at 
> /home/rabin/dev/linux/include/linux/mm.h:1785
>   (inlined by) free_reserved_area at 
> /home/rabin/dev/linux/mm/page_alloc.c:6599

Yeah, I think that's much better.

-- 
Josh


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-17 Thread Josh Poimboeuf
On Sat, Sep 17, 2016 at 10:15:45AM +0200, Rabin Vincent wrote:
> On Fri, Sep 16, 2016 at 04:26:56PM -0500, Josh Poimboeuf wrote:
> > +   addr2line -ie $objfile $hexaddr
> 
> Could you pass in -f and -p too to addr2line?
> 
> Before:
> 
>  $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
>  /home/rabin/dev/linux/include/linux/compiler.h:222
>  /home/rabin/dev/linux/include/linux/page-flags.h:149
>  /home/rabin/dev/linux/include/linux/page-flags.h:154
>  /home/rabin/dev/linux/include/linux/page-flags.h:287
>  /home/rabin/dev/linux/include/linux/mm.h:1778
>  /home/rabin/dev/linux/include/linux/mm.h:1785
>  /home/rabin/dev/linux/mm/page_alloc.c:6599
> 
> After:
> 
>  $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
>  __read_once_size at /home/rabin/dev/linux/include/linux/compiler.h:222
>   (inlined by) PageTail at 
> /home/rabin/dev/linux/include/linux/page-flags.h:149
>   (inlined by) PageCompound at 
> /home/rabin/dev/linux/include/linux/page-flags.h:154
>   (inlined by) ClearPageReserved at 
> /home/rabin/dev/linux/include/linux/page-flags.h:287
>   (inlined by) __free_reserved_page at 
> /home/rabin/dev/linux/include/linux/mm.h:1778
>   (inlined by) free_reserved_page at 
> /home/rabin/dev/linux/include/linux/mm.h:1785
>   (inlined by) free_reserved_area at 
> /home/rabin/dev/linux/mm/page_alloc.c:6599

Yeah, I think that's much better.

-- 
Josh


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-17 Thread Josh Poimboeuf
On Fri, Sep 16, 2016 at 06:59:22PM -0700, Linus Torvalds wrote:
> On Fri, Sep 16, 2016 at 5:42 PM, Josh Poimboeuf  wrote:
> > On Fri, Sep 16, 2016 at 05:09:15PM -0700, Linus Torvalds wrote:
> >> On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  
> >> wrote:
> >> >
> >> > Ok, how about this.  If this looks ok, would you be willing to apply it?
> >>
> >> Looks good to me. Did you test the size verification with some made-up 
> >> cases?
> >
> > Yep.  And I tested all the other edge cases that occurred to me.
> 
> Hmm. So I tested it a bit, and I found a few issues..

Ok, I agree with pretty much everything you said.  I'll try to add those
improvements next week.

-- 
Josh


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-17 Thread Josh Poimboeuf
On Fri, Sep 16, 2016 at 06:59:22PM -0700, Linus Torvalds wrote:
> On Fri, Sep 16, 2016 at 5:42 PM, Josh Poimboeuf  wrote:
> > On Fri, Sep 16, 2016 at 05:09:15PM -0700, Linus Torvalds wrote:
> >> On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  
> >> wrote:
> >> >
> >> > Ok, how about this.  If this looks ok, would you be willing to apply it?
> >>
> >> Looks good to me. Did you test the size verification with some made-up 
> >> cases?
> >
> > Yep.  And I tested all the other edge cases that occurred to me.
> 
> Hmm. So I tested it a bit, and I found a few issues..

Ok, I agree with pretty much everything you said.  I'll try to add those
improvements next week.

-- 
Josh


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-17 Thread Rabin Vincent
On Fri, Sep 16, 2016 at 04:26:56PM -0500, Josh Poimboeuf wrote:
> + addr2line -ie $objfile $hexaddr

Could you pass in -f and -p too to addr2line?

Before:

 $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
 /home/rabin/dev/linux/include/linux/compiler.h:222
 /home/rabin/dev/linux/include/linux/page-flags.h:149
 /home/rabin/dev/linux/include/linux/page-flags.h:154
 /home/rabin/dev/linux/include/linux/page-flags.h:287
 /home/rabin/dev/linux/include/linux/mm.h:1778
 /home/rabin/dev/linux/include/linux/mm.h:1785
 /home/rabin/dev/linux/mm/page_alloc.c:6599

After:

 $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
 __read_once_size at /home/rabin/dev/linux/include/linux/compiler.h:222
  (inlined by) PageTail at /home/rabin/dev/linux/include/linux/page-flags.h:149
  (inlined by) PageCompound at 
/home/rabin/dev/linux/include/linux/page-flags.h:154
  (inlined by) ClearPageReserved at 
/home/rabin/dev/linux/include/linux/page-flags.h:287
  (inlined by) __free_reserved_page at 
/home/rabin/dev/linux/include/linux/mm.h:1778
  (inlined by) free_reserved_page at 
/home/rabin/dev/linux/include/linux/mm.h:1785
  (inlined by) free_reserved_area at /home/rabin/dev/linux/mm/page_alloc.c:6599


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-17 Thread Rabin Vincent
On Fri, Sep 16, 2016 at 04:26:56PM -0500, Josh Poimboeuf wrote:
> + addr2line -ie $objfile $hexaddr

Could you pass in -f and -p too to addr2line?

Before:

 $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
 /home/rabin/dev/linux/include/linux/compiler.h:222
 /home/rabin/dev/linux/include/linux/page-flags.h:149
 /home/rabin/dev/linux/include/linux/page-flags.h:154
 /home/rabin/dev/linux/include/linux/page-flags.h:287
 /home/rabin/dev/linux/include/linux/mm.h:1778
 /home/rabin/dev/linux/include/linux/mm.h:1785
 /home/rabin/dev/linux/mm/page_alloc.c:6599

After:

 $ scripts/faddr2line ~/dev/kvm2/vmlinux free_reserved_area+0x90
 __read_once_size at /home/rabin/dev/linux/include/linux/compiler.h:222
  (inlined by) PageTail at /home/rabin/dev/linux/include/linux/page-flags.h:149
  (inlined by) PageCompound at 
/home/rabin/dev/linux/include/linux/page-flags.h:154
  (inlined by) ClearPageReserved at 
/home/rabin/dev/linux/include/linux/page-flags.h:287
  (inlined by) __free_reserved_page at 
/home/rabin/dev/linux/include/linux/mm.h:1778
  (inlined by) free_reserved_page at 
/home/rabin/dev/linux/include/linux/mm.h:1785
  (inlined by) free_reserved_area at /home/rabin/dev/linux/mm/page_alloc.c:6599


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Linus Torvalds
On Fri, Sep 16, 2016 at 6:59 PM, Linus Torvalds
 wrote:
>
> And finally, I suspect (5) is not reasonably fixable. Oh well. It
> would require some kind of "figure out the largest common prefix of
> all the filenames in the whole object file". So I'm *not* talking
> about just passing "--basenames" to addr2line.
>
> Hmm. Maybe looking up the "DW_AT_comp_dir" tag in the debug info would
> work? And just stripping that off?

Thinking more about this, that actually sounds like it might be the
right thing to do.

It doesn't work for most projects, but the way the kernel build system
is set up, we don't actually recursively descend into subdirectories,
we always build at the top level. So DW_AT_comp_dir should always (?)
be the actual top-level build directory, and we could just scrape that
off from the addr2line output.

That said, I don't even know what the "real" way to dump the debug
symbol data is. I do *not* believe that you should use

  readelf -W --debug-dump vmlinux | grep DW_AT_comp_dir | head -1

to get the information. There is bound to be something much better.
Somebody who knows the ELF tools can now pipe in and show the world
what a maroon I am.

   Linus


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Linus Torvalds
On Fri, Sep 16, 2016 at 6:59 PM, Linus Torvalds
 wrote:
>
> And finally, I suspect (5) is not reasonably fixable. Oh well. It
> would require some kind of "figure out the largest common prefix of
> all the filenames in the whole object file". So I'm *not* talking
> about just passing "--basenames" to addr2line.
>
> Hmm. Maybe looking up the "DW_AT_comp_dir" tag in the debug info would
> work? And just stripping that off?

Thinking more about this, that actually sounds like it might be the
right thing to do.

It doesn't work for most projects, but the way the kernel build system
is set up, we don't actually recursively descend into subdirectories,
we always build at the top level. So DW_AT_comp_dir should always (?)
be the actual top-level build directory, and we could just scrape that
off from the addr2line output.

That said, I don't even know what the "real" way to dump the debug
symbol data is. I do *not* believe that you should use

  readelf -W --debug-dump vmlinux | grep DW_AT_comp_dir | head -1

to get the information. There is bound to be something much better.
Somebody who knows the ELF tools can now pipe in and show the world
what a maroon I am.

   Linus


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Linus Torvalds
On Fri, Sep 16, 2016 at 5:42 PM, Josh Poimboeuf  wrote:
> On Fri, Sep 16, 2016 at 05:09:15PM -0700, Linus Torvalds wrote:
>> On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  wrote:
>> >
>> > Ok, how about this.  If this looks ok, would you be willing to apply it?
>>
>> Looks good to me. Did you test the size verification with some made-up cases?
>
> Yep.  And I tested all the other edge cases that occurred to me.

Hmm. So I tested it a bit, and I found a few issues..

 (1) actual bug: you really need the "-W" flag to 'readelf'. Otherwise
it will truncate the lines to fit in 80 columns, which in turn limits
symbol names to 25 characters or something like that.

 (2) usability: I have been known to want to look up multiple symbols.
So could we support a syntax like

   /scripts/faddr2line vmlinux function1+15/226 other_fn_name+32/128

 or something like that?

 (3) noise: I have to say that it seems to work really well, but the
"skipping" messages are a bit verbose.

 I guess they practically never actually *trigger*, but

 [torvalds@i7 linux]$ ./scripts/faddr2line vmlinux type_show+0x10/45
 skipping type_show address at 0x81023690 due to size
mismatch (45 != 166)
 skipping type_show address at 0x811894f0 due to size
mismatch (45 != 41)
 /home/torvalds/v2.6/linux/drivers/video/backlight/backlight.c:213
 skipping type_show address at 0x814e9340 due to size
mismatch (45 != 119)
 skipping type_show address at 0x8157a080 due to size
mismatch (45 != 50)
 skipping type_show address at 0x815bbeb0 due to size
mismatch (45 != 38)
 skipping type_show address at 0x815ea8c0 due to size
mismatch (45 != 35)
 skipping type_show address at 0x8162c650 due to size
mismatch (45 != 40)
 skipping type_show address at 0x8162f910 due to size
mismatch (45 != 38)
 skipping type_show address at 0x81694ec0 due to size
mismatch (45 != 26)

 it's almost hard to pick out the case that succeeded from all the
noise from the ones that didn't.

 (4) ambiguous "inlining" vs "multiple possible cases":

 [torvalds@i7 linux]$ ./scripts/faddr2line vmlinux free+15/36
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/lrw.c:377
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/xts.c:334

 That's actually two different cases, both of which inline
crypto_instance_ctx(), and both of which are really the exact same
code (just lrw vs xts), so they have the same name and size.

 (5) I'd love for the pathnames to be shown relative to the root of the project

And (1) is trivial to fix (use "-Ws" instead of "-s" to readelf).

I don't think (2) is a huge deal, but I suspect it wouldn't be nasty
to do by just using a shell function and iterating over the
arguments..

But (3) might be a "don't care, it's so unusual as to not be an
issue", although it might also be a case of "maybe we should only show
the mismatches if there are *no* matches, or if teh user specified
verbose output with '-v' or something"

I think (4) is worth fixing. Maybe by simply outputting the function
name/offset/size again for each hit, which is something you'd need to
do for (2) anyway, so that the above case would become

 [torvalds@i7 linux]$ ./scripts/faddr2line vmlinux free+15
 vmlinux free+15/36:
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/lrw.c:377
 vmlinux free+15/36:
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/xts.c:334

(Note how I didn't give the size on the command line, but the printout
showed it anyway).

And finally, I suspect (5) is not reasonably fixable. Oh well. It
would require some kind of "figure out the largest common prefix of
all the filenames in the whole object file". So I'm *not* talking
about just passing "--basenames" to addr2line.

Hmm. Maybe looking up the "DW_AT_comp_dir" tag in the debug info would
work? And just stripping that off?

But on the whole, this is really nice. I always disliked the stupid
addr2line crap. This just looks like we can get *much* better output
by tweaking things to what the kernel uses/needs..

Would you mind looking at those things? Just (1) I can do myself, but
I'm hoping you'd be willing to maybe do a bit more surgery on your own
script..

  Linus


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Linus Torvalds
On Fri, Sep 16, 2016 at 5:42 PM, Josh Poimboeuf  wrote:
> On Fri, Sep 16, 2016 at 05:09:15PM -0700, Linus Torvalds wrote:
>> On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  wrote:
>> >
>> > Ok, how about this.  If this looks ok, would you be willing to apply it?
>>
>> Looks good to me. Did you test the size verification with some made-up cases?
>
> Yep.  And I tested all the other edge cases that occurred to me.

Hmm. So I tested it a bit, and I found a few issues..

 (1) actual bug: you really need the "-W" flag to 'readelf'. Otherwise
it will truncate the lines to fit in 80 columns, which in turn limits
symbol names to 25 characters or something like that.

 (2) usability: I have been known to want to look up multiple symbols.
So could we support a syntax like

   /scripts/faddr2line vmlinux function1+15/226 other_fn_name+32/128

 or something like that?

 (3) noise: I have to say that it seems to work really well, but the
"skipping" messages are a bit verbose.

 I guess they practically never actually *trigger*, but

 [torvalds@i7 linux]$ ./scripts/faddr2line vmlinux type_show+0x10/45
 skipping type_show address at 0x81023690 due to size
mismatch (45 != 166)
 skipping type_show address at 0x811894f0 due to size
mismatch (45 != 41)
 /home/torvalds/v2.6/linux/drivers/video/backlight/backlight.c:213
 skipping type_show address at 0x814e9340 due to size
mismatch (45 != 119)
 skipping type_show address at 0x8157a080 due to size
mismatch (45 != 50)
 skipping type_show address at 0x815bbeb0 due to size
mismatch (45 != 38)
 skipping type_show address at 0x815ea8c0 due to size
mismatch (45 != 35)
 skipping type_show address at 0x8162c650 due to size
mismatch (45 != 40)
 skipping type_show address at 0x8162f910 due to size
mismatch (45 != 38)
 skipping type_show address at 0x81694ec0 due to size
mismatch (45 != 26)

 it's almost hard to pick out the case that succeeded from all the
noise from the ones that didn't.

 (4) ambiguous "inlining" vs "multiple possible cases":

 [torvalds@i7 linux]$ ./scripts/faddr2line vmlinux free+15/36
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/lrw.c:377
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/xts.c:334

 That's actually two different cases, both of which inline
crypto_instance_ctx(), and both of which are really the exact same
code (just lrw vs xts), so they have the same name and size.

 (5) I'd love for the pathnames to be shown relative to the root of the project

And (1) is trivial to fix (use "-Ws" instead of "-s" to readelf).

I don't think (2) is a huge deal, but I suspect it wouldn't be nasty
to do by just using a shell function and iterating over the
arguments..

But (3) might be a "don't care, it's so unusual as to not be an
issue", although it might also be a case of "maybe we should only show
the mismatches if there are *no* matches, or if teh user specified
verbose output with '-v' or something"

I think (4) is worth fixing. Maybe by simply outputting the function
name/offset/size again for each hit, which is something you'd need to
do for (2) anyway, so that the above case would become

 [torvalds@i7 linux]$ ./scripts/faddr2line vmlinux free+15
 vmlinux free+15/36:
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/lrw.c:377
 vmlinux free+15/36:
 /home/torvalds/v2.6/linux/./include/crypto/algapi.h:302
 /home/torvalds/v2.6/linux/crypto/xts.c:334

(Note how I didn't give the size on the command line, but the printout
showed it anyway).

And finally, I suspect (5) is not reasonably fixable. Oh well. It
would require some kind of "figure out the largest common prefix of
all the filenames in the whole object file". So I'm *not* talking
about just passing "--basenames" to addr2line.

Hmm. Maybe looking up the "DW_AT_comp_dir" tag in the debug info would
work? And just stripping that off?

But on the whole, this is really nice. I always disliked the stupid
addr2line crap. This just looks like we can get *much* better output
by tweaking things to what the kernel uses/needs..

Would you mind looking at those things? Just (1) I can do myself, but
I'm hoping you'd be willing to maybe do a bit more surgery on your own
script..

  Linus


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Peter Zijlstra
On Fri, Sep 16, 2016 at 04:26:56PM -0500, Josh Poimboeuf wrote:
> Ok, how about this.  If this looks ok, would you be willing to apply it?

Looks good, and yes without --inline addr2line would be tons less useful
;-) Thanks for cooking this up.


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Peter Zijlstra
On Fri, Sep 16, 2016 at 04:26:56PM -0500, Josh Poimboeuf wrote:
> Ok, how about this.  If this looks ok, would you be willing to apply it?

Looks good, and yes without --inline addr2line would be tons less useful
;-) Thanks for cooking this up.


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Josh Poimboeuf
On Fri, Sep 16, 2016 at 05:09:15PM -0700, Linus Torvalds wrote:
> On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  wrote:
> >
> > Ok, how about this.  If this looks ok, would you be willing to apply it?
> 
> Looks good to me. Did you test the size verification with some made-up cases?

Yep.  And I tested all the other edge cases that occurred to me.

-- 
Josh


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Josh Poimboeuf
On Fri, Sep 16, 2016 at 05:09:15PM -0700, Linus Torvalds wrote:
> On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  wrote:
> >
> > Ok, how about this.  If this looks ok, would you be willing to apply it?
> 
> Looks good to me. Did you test the size verification with some made-up cases?

Yep.  And I tested all the other edge cases that occurred to me.

-- 
Josh


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Linus Torvalds
On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  wrote:
>
> Ok, how about this.  If this looks ok, would you be willing to apply it?

Looks good to me. Did you test the size verification with some made-up cases?

Linus


Re: [PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Linus Torvalds
On Fri, Sep 16, 2016 at 2:26 PM, Josh Poimboeuf  wrote:
>
> Ok, how about this.  If this looks ok, would you be willing to apply it?

Looks good to me. Did you test the size verification with some made-up cases?

Linus


[PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Josh Poimboeuf
On Fri, Sep 16, 2016 at 12:26:31PM -0700, Linus Torvalds wrote:
> On Fri, Sep 16, 2016 at 12:17 PM, Josh Poimboeuf <jpoim...@redhat.com> wrote:
> >
> > I think that issue is solved by addr2line's '--inline' option, which the
> > script uses:
> 
> Oh, well, even better. I clearly don't know addr2line well enough, and
> having a script that does this correctly automatically is clearly what
> *I* need too.
> 
> >> So both the function offset
> >> filtering and the type filtering could definitely make a difference.
> >
> > Yeah, good ideas.  That would help reduce some of the false duplicates,
> > though they are quite rare.  I'll see what I can do.
> 
> Yeah, in practice the false duplicates almost never happen. We do have
> duplicate function names, but they tend to be for simple things.
> 
> And the call trace often makes it obvious which particular function it
> is for the human that is reading the output, but since it should be
> easy to cut down on the potential duplicates, I think it's a good
> thing to do.

Ok, how about this.  If this looks ok, would you be willing to apply it?

---

From: Josh Poimboeuf <jpoim...@redhat.com>
Subject: [PATCH v2] scripts: add script for translating stack dump function
 offsets

addr2line doesn't work with KASLR addresses.  Add a basic addr2line
wrapper script which takes the 'func+offset/size' format as input.

Signed-off-by: Josh Poimboeuf <jpoim...@redhat.com>
---
v2:
- add size and function type checking
- use readelf for more deterministic output

 scripts/faddr2line | 96 ++
 1 file changed, 96 insertions(+)
 create mode 100755 scripts/faddr2line

diff --git a/scripts/faddr2line b/scripts/faddr2line
new file mode 100755
index 000..a837815
--- /dev/null
+++ b/scripts/faddr2line
@@ -0,0 +1,96 @@
+#!/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 vmlinux meminfo_proc_show+0x5/0x568
+#   fs/proc/meminfo.c:27
+#
+# If the address is part of an inlined function, the full inline call chain is
+# printed:
+#
+#   $ ./scripts/faddr2line vmlinux native_write_msr+0x6/0x27
+#   arch/x86/include/asm/msr.h:121
+#   include/linux/jump_label.h:125
+#   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 vmlinux raw_ioctl+0x5
+#   drivers/char/raw.c:122
+#   net/ipv4/raw.c:876
+
+set -o errexit
+set -o nounset
+
+usage() {
+   echo "usage: faddr2line  <func+offset>" >&2
+   exit 1
+}
+
+die() {
+   echo "ERROR: $1" >&2
+   exit 1
+}
+
+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"
+
+[[ $# != 2 ]] && usage
+
+objfile=$1
+[[ ! -f $objfile ]] && die "can't find objfile $objfile"
+
+func_addr=$2
+func=${func_addr%+*}
+offset=${func_addr#*+}
+offset=${offset%/*}
+size=
+[[ $func_addr =~ "/" ]] && size=${func_addr#*/}
+
+if [[ -z $func ]] || [[ -z $offset ]] || [[ $func = $func_addr ]]; then
+   die "bad func+offset $func_addr"
+fi
+
+# Go through each of the object's symbols which match the func name.
+# In rare cases there might be duplicates.
+while read symbol; do
+   fields=($symbol)
+   sym_base=0x${fields[1]}
+   sym_size=${fields[2]}
+   sym_type=${fields[3]}
+
+   # calculate the address
+   addr=$(($sym_base + $offset))
+   if [[ -z $addr ]] || [[ $addr = 0 ]]; then
+   die "bad address: $sym_base + $offset"
+   fi
+   hexaddr=0x$(printf %x $addr)
+
+   # weed out non-function symbols
+   if [[ $sym_type != "FUNC" ]]; then
+   echo "skipping $func address at $hexaddr due to non-function 
symbol"
+   continue
+   fi
+
+   # if the user provided a size, make sure it matches the symbol's size
+   if [[ -n $size ]] && [[ $size -ne $sym_size ]]; then
+   echo "skipping $func address at $hexaddr due to size mismatch 
($size != $sym_size)"
+   continue;
+   fi
+
+   # make sure the provided offset is within the symbol's range
+   if [[ $offset -gt $sym_size ]]; then
+   echo "skipping $func address at $hexaddr due to size mismatch 
($offset <= $sym_size)"
+   continue
+   fi
+
+   addr2line -ie $objfile $hexaddr
+
+done < <(readelf -s $objfile | awk -v f=$func '$8 == f {print}')
-- 
2.7.4



[PATCH v2] scripts: add script for translating stack dump function offsets

2016-09-16 Thread Josh Poimboeuf
On Fri, Sep 16, 2016 at 12:26:31PM -0700, Linus Torvalds wrote:
> On Fri, Sep 16, 2016 at 12:17 PM, Josh Poimboeuf  wrote:
> >
> > I think that issue is solved by addr2line's '--inline' option, which the
> > script uses:
> 
> Oh, well, even better. I clearly don't know addr2line well enough, and
> having a script that does this correctly automatically is clearly what
> *I* need too.
> 
> >> So both the function offset
> >> filtering and the type filtering could definitely make a difference.
> >
> > Yeah, good ideas.  That would help reduce some of the false duplicates,
> > though they are quite rare.  I'll see what I can do.
> 
> Yeah, in practice the false duplicates almost never happen. We do have
> duplicate function names, but they tend to be for simple things.
> 
> And the call trace often makes it obvious which particular function it
> is for the human that is reading the output, but since it should be
> easy to cut down on the potential duplicates, I think it's a good
> thing to do.

Ok, how about this.  If this looks ok, would you be willing to apply it?

---

From: Josh Poimboeuf 
Subject: [PATCH v2] scripts: add script for translating stack dump function
 offsets

addr2line doesn't work with KASLR addresses.  Add a basic addr2line
wrapper script which takes the 'func+offset/size' format as input.

Signed-off-by: Josh Poimboeuf 
---
v2:
- add size and function type checking
- use readelf for more deterministic output

 scripts/faddr2line | 96 ++
 1 file changed, 96 insertions(+)
 create mode 100755 scripts/faddr2line

diff --git a/scripts/faddr2line b/scripts/faddr2line
new file mode 100755
index 000..a837815
--- /dev/null
+++ b/scripts/faddr2line
@@ -0,0 +1,96 @@
+#!/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 vmlinux meminfo_proc_show+0x5/0x568
+#   fs/proc/meminfo.c:27
+#
+# If the address is part of an inlined function, the full inline call chain is
+# printed:
+#
+#   $ ./scripts/faddr2line vmlinux native_write_msr+0x6/0x27
+#   arch/x86/include/asm/msr.h:121
+#   include/linux/jump_label.h:125
+#   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 vmlinux raw_ioctl+0x5
+#   drivers/char/raw.c:122
+#   net/ipv4/raw.c:876
+
+set -o errexit
+set -o nounset
+
+usage() {
+   echo "usage: faddr2line  " >&2
+   exit 1
+}
+
+die() {
+   echo "ERROR: $1" >&2
+   exit 1
+}
+
+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"
+
+[[ $# != 2 ]] && usage
+
+objfile=$1
+[[ ! -f $objfile ]] && die "can't find objfile $objfile"
+
+func_addr=$2
+func=${func_addr%+*}
+offset=${func_addr#*+}
+offset=${offset%/*}
+size=
+[[ $func_addr =~ "/" ]] && size=${func_addr#*/}
+
+if [[ -z $func ]] || [[ -z $offset ]] || [[ $func = $func_addr ]]; then
+   die "bad func+offset $func_addr"
+fi
+
+# Go through each of the object's symbols which match the func name.
+# In rare cases there might be duplicates.
+while read symbol; do
+   fields=($symbol)
+   sym_base=0x${fields[1]}
+   sym_size=${fields[2]}
+   sym_type=${fields[3]}
+
+   # calculate the address
+   addr=$(($sym_base + $offset))
+   if [[ -z $addr ]] || [[ $addr = 0 ]]; then
+   die "bad address: $sym_base + $offset"
+   fi
+   hexaddr=0x$(printf %x $addr)
+
+   # weed out non-function symbols
+   if [[ $sym_type != "FUNC" ]]; then
+   echo "skipping $func address at $hexaddr due to non-function 
symbol"
+   continue
+   fi
+
+   # if the user provided a size, make sure it matches the symbol's size
+   if [[ -n $size ]] && [[ $size -ne $sym_size ]]; then
+   echo "skipping $func address at $hexaddr due to size mismatch 
($size != $sym_size)"
+   continue;
+   fi
+
+   # make sure the provided offset is within the symbol's range
+   if [[ $offset -gt $sym_size ]]; then
+   echo "skipping $func address at $hexaddr due to size mismatch 
($offset <= $sym_size)"
+   continue
+   fi
+
+   addr2line -ie $objfile $hexaddr
+
+done < <(readelf -s $objfile | awk -v f=$func '$8 == f {print}')
-- 
2.7.4