libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Libunwind-devel] Some questions from a dwarf newbee


From: Dave Watson
Subject: Re: [Libunwind-devel] Some questions from a dwarf newbee
Date: Mon, 14 Aug 2017 07:42:02 -0700
User-agent: Mutt/1.6.0 (2016-04-01)

This stuff always makes my head spin, but here is how I would parse it (and I 
could definitely be wrong...)

On 08/13/17 08:46 PM, Tim Chou wrote:
> Hi All,
> 
> I don't know if it's the right place to ask some basic questions. I tried
> to understand dwarf for several weeks. But the progress is very slow. I
> really need someone to instruct me, so I send this email. If the email
> disturbed you, I'm so sorry about this. I really hope someone can help me.
> 
> My environment is x86_64 linux.
> I find a open-source stack unwinding program with libunwind. I use readelf
> to generate the dwarf to a file.
> 
> The unwinding program's result is shown below:
> 
>   7 [unwind.c, process_stack(), ln 172] INFO: STACK FRAME 0
>   8 [unwind.c, process_stack(), ln 189] INFO: RIP = 0x00007f86cbd3c7b0
> __nanosleep_nocancel+0x0000000000000007
>   9 [unwind.c, process_stack(), ln 190] INFO: RSP = 0x00007ffd5668f928 RBP
> = 0x0000000000000000
>  10 [unwind.c, process_stack(), ln 198] INFO: frame range =
> (0x00007f86cbd3c7a0 <-> 0x00007f86cbd3c7fa)
>  11 [unwind.c, process_stack(), ln 199] INFO: handler = 0 lsda = 0
>  12
>  13
>  14 [unwind.c, process_stack(), ln 172] INFO: STACK FRAME 1
>  15 [unwind.c, process_stack(), ln 189] INFO: RIP = 0x00007f86cbd3c71a
> sleep+0x000000000000002a
>  16 [unwind.c, process_stack(), ln 190] INFO: RSP = 0x00007ffd5668f930 RBP
> = 0x0000000000000000
>  17 [unwind.c, process_stack(), ln 198] INFO: frame range =
> (0x00007f86cbd3c6f0 <-> 0x00007f86cbd3c73a)
>  18 [unwind.c, process_stack(), ln 199] INFO: handler = 0 lsda = 0
>  19
>  20
>  21 [unwind.c, process_stack(), ln 172] INFO: STACK FRAME 2
>  22 [unwind.c, process_stack(), ln 189] INFO: RIP = 0x00000000004006cf
> main+0x000000000000002c
>  23 [unwind.c, process_stack(), ln 190] INFO: RSP = 0x00007ffd5668f960 RBP
> = 0x00007ffd5668f970
>  24 [unwind.c, process_stack(), ln 198] INFO: frame range =
> (0x00000000004006a3 <-> 0x00000000004006d1)
>  25 [unwind.c, process_stack(), ln 199] INFO: handler = 0 lsda = 0
>  26
>  27
>  28 [unwind.c, process_stack(), ln 172] INFO: STACK FRAME 3
>  29 [unwind.c, process_stack(), ln 189] INFO: RIP = 0x00007f86cbc90401
> __libc_start_main+0x00000000000000f1
>  30 [unwind.c, process_stack(), ln 190] INFO: RSP = 0x00007ffd5668f980 RBP
> = 0x00000000004006e0
>  31 [unwind.c, process_stack(), ln 198] INFO: frame range =
> (0x00007f86cbc90310 <-> 0x00007f86cbc904da)
>  32 [unwind.c, process_stack(), ln 199] INFO: handler = 0 lsda = 0
> 
> Dwarf info is shown below:
> 
> Frame 0: (The absolute address of RIP is 0xcc7a8.)
> 30189 0000f1f0 0000000000000014 0000f1f4 FDE cie=00000000
> pc=00000000000cc7a0..00000000000cc7fa
> 30190   DW_CFA_advance_loc: 29 to 00000000000cc7bd
> 30191   DW_CFA_def_cfa_offset: 16
> 30192   DW_CFA_advance_loc: 35 to 00000000000cc7e0
> 30193   DW_CFA_def_cfa_offset: 8
> 30194   DW_CFA_nop
> 
> The CFA's value should be $RSP+16 (0x00007ffd5668f938). But in frame 1, the
> value is 0x00007ffd5668f930. Why the two value is different? I guess
> there's a alignment rule in CIE?

It looks like you're actually at ..c7b0, which would be line 30190

> 
> Frame 1: (The absolute address of RIP is 0xcc71a.)
> 30152 0000f1a0 0000000000000034 0000f1a4 FDE cie=00000000
> pc=00000000000cc6f0..00000000000cc73a
> 30153   DW_CFA_advance_loc: 1 to 00000000000cc6f1
> 30154   DW_CFA_def_cfa_offset: 16
> 30155   DW_CFA_offset: r6 (rbp) at cfa-16
> 30156   DW_CFA_advance_loc: 1 to 00000000000cc6f2
> 30157   DW_CFA_def_cfa_offset: 24
> 30158   DW_CFA_offset: r3 (rbx) at cfa-24
> 30159   DW_CFA_advance_loc: 6 to 00000000000cc6f8
> 30160   DW_CFA_def_cfa_offset: 48
> 30161   DW_CFA_advance_loc: 45 to 00000000000cc725
> 30162   DW_CFA_remember_state
> 30163   DW_CFA_def_cfa_offset: 24
> 30164   DW_CFA_advance_loc: 3 to 00000000000cc728
> 30165   DW_CFA_def_cfa_offset: 16
> 30166   DW_CFA_advance_loc: 1 to 00000000000cc729
> 30167   DW_CFA_def_cfa_offset: 8
> 30168   DW_CFA_advance_loc: 7 to 00000000000cc730
> 30169   DW_CFA_restore_state
> 30170   DW_CFA_advance_loc: 7 to 00000000000cc737
> 30171   DW_CFA_def_cfa_offset: 24
> 30172   DW_CFA_advance_loc: 1 to 00000000000cc738
> 30173   DW_CFA_def_cfa_offset: 16
> 30174   DW_CFA_advance_loc: 1 to 00000000000cc739
> 30175   DW_CFA_def_cfa_offset: 8
> 30176   DW_CFA_nop
> 30177   DW_CFA_nop
> 30178   DW_CFA_nop
> 30179   DW_CFA_nop
> 30180   DW_CFA_nop
> 
> In Frame 2, CFA should be $RSP+24 (0x00007ffd5668f930 + 24 =
> 0x00007ffd5668f48). However, in frame 2, we can see the $RSP is equal to
> 0x00007ffd5668f960. I guess DW_CFA_remember_state is the reason. If it's
> true, why do we need the next line "30163   DW_CFA_def_cfa_offset: 24" in
> dwarf?

RIP is ...c71a, which means line 30161, so cfa_offset is 48, which
looks correct here

> 
> Frame 2: (The absolute address of RIP is .0x4006cf)
>  83 000000d0 000000000000001c 000000a4 FDE cie=00000030
> pc=00000000004006a3..00000000004006d1
>  84   DW_CFA_advance_loc: 1 to 00000000004006a4
>  85   DW_CFA_def_cfa_offset: 16
>  86   DW_CFA_offset: r6 (rbp) at cfa-16
>  87   DW_CFA_advance_loc: 3 to 00000000004006a7
>  88   DW_CFA_def_cfa_register: r6 (rbp)
>  89   DW_CFA_nop
>  90   DW_CFA_nop
>  91   DW_CFA_nop
>  92   DW_CFA_nop
>  93   DW_CFA_nop
>  94   DW_CFA_nop
>  95   DW_CFA_nop
> 
> In frame 2, I don't know how to parse this one. How to calculate CFA for
> this frame? In line 85, CFA=$RSP+16, $RBP=CFA-16. In line 88, CFA=$RBP. I'm
> really confused about this one.

CFA is RBP, but you need to know what RBP is, which is calculated from
all the previous unwindings.  Line 86 only tells you where the
previous value of RBP is on the stack, if you want to unwind past this
frame, and doesn't help you after line 88.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]