GSoC'11: DWARF2 call frame information

Xingxing Pan panxingxing at mprc.pku.edu.cn
Tue Mar 22 15:40:00 UTC 2011


2011/3/22 Kostik Belousov <kostikbel at gmail.com>:
> On Mon, Mar 21, 2011 at 08:32:04PM +0300, Chagin Dmitry wrote:
>> On Mon, Mar 21, 2011 at 05:36:13PM +0800, Xingxing Pan wrote:
>> > 2011/3/21 Chagin Dmitry <dchagin at freebsd.org>:
>> > >> powerfull script.
>> > >>
>> > >> Xingxing Pan
>> > >
>> > > hmm, which script? I think enough amd64, i386 and amd64/ia32.
>> > >
>> > > I suggest to write a example before continuing the conversation
>> > > about the GSoC. For example (bcopy || bzero) && cpu_switch.
>> > > Is it ok for you?
>> > >
>> > > --
>> > > Have fun!
>> > > chd
>> > >
>> >
>> > Hi Chargin,
>> >
>> > Thank you for your reply.
>> > The followings shows how I try to add DWARF for bcopy.
>> >
>> > --- ../8.2.0/sys/i386/include/asm.h     2011-03-21 14:35:56.111973722 +0800
>> > +++ asm.h       2011-03-21 15:25:31.564636162 +0800
>> > @@ -71,7 +71,7 @@
>> >
>> >  #define _ENTRY(x)      _START_ENTRY; \
>> >                         .globl CNAME(x); .type CNAME(x), at function; CNAME(x):
>> > -#define        END(x)          .size x, . - x
>> > +#define        END(x)          .cfi_endproc; .size x, . - x
>> >
>> >  #ifdef PROF
>> >  #define        ALTENTRY(x)     _ENTRY(x); \
>> > @@ -80,9 +80,10 @@
>> >                         popl %ebp; \
>> >                         jmp 9f
>> >  #define        ENTRY(x)        _ENTRY(x); \
>> > -                       pushl %ebp; movl %esp,%ebp; \
>> > +                       .cfi_startproc; \
>> > +                       pushl %ebp; .cfi_adjust_cfa_offset 4; movl
>> > %esp,%ebp; .cfi_def_cfa_register %ebp; \
>> >                         call PIC_PLT(HIDENAME(mcount)); \
>> > -                       popl %ebp; \
>> > +                       popl %ebp; .cfi_def_cfa %esp, 4; \
>> >
>> > --- bcopy.S     2011-03-21 15:51:26.804203809 +0800
>> > +++ ../8.2.0/lib/libc/i386/string/bcopy.S       2011-03-21
>> > 14:28:15.023069890 +0800
>> > @@ -51,9 +51,7 @@ ENTRY(bcopy)
>> >  #endif
>> >  #endif
>> >         pushl   %esi
>> > -       .cfi_adjust_cfa_offset 4;
>> >         pushl   %edi
>> > -       .cfi_adjust_cfa_offset 4;
>> >  #if defined(MEMCOPY) || defined(MEMMOVE)
>> >         movl    12(%esp),%edi
>> >         movl    16(%esp),%esi
>> > @@ -77,9 +75,7 @@ ENTRY(bcopy)
>> >         rep
>> >         movsb
>> >         popl    %edi
>> > -       .cfi_adjust_cfa_offset -4;
>> >         popl    %esi
>> > -       .cfi_adjust_cfa_offset -4;
>> >         ret
>> >  1:
>> >         addl    %ecx,%edi       /* copy backwards. */
>> > @@ -98,9 +94,7 @@ ENTRY(bcopy)
>> >         rep
>> >         movsl
>> >         popl    %edi
>> > -       .cfi_adjust_cfa_offset -4;
>> >         popl    %esi
>> > -       .cfi_adjust_cfa_offset -4;
>> >         cld
>> >         ret
>> >  #ifdef MEMCOPY
>> >
>> > But I don't know how to add DWARF for cpu_switch, because I have no
>> > idea about the circumstance when we need to backtrace through this
>> > function. Suppose there's a cpu switch like this,
>> > threadA->kernel->threadB. Then should the expected backtrace has the
>> > following result?
>> >
>> > threadB's stack
>> > kernel's stack
>> > threadA's stack
>>
>>
>> hmm, ok. good, avoid cpu_switch.
>> First of all, please, read style(9) man page.
>> In the second, evaluate the proposed plan (discussed with kib@):
>>
>> 1) Annotate libc, msun, rtld, libthr (you)
> 1a) Develop and implement a testing plan to verify the implementation.
> 1b) consider doing full register tracking for assembler code.
>
>> 2) vdso (I'm)
>> 3) Annotate signal trampolines (you, after vdso)
>>
>> And i'm going to understand what I need to do to start GSoC for you.
>> Thanks!
>>
>>
>> --
>> Have fun!
>> chd
>
>
>

Hi Kostik,

I think the basic testing method can be using GDB to set breakpoint in
functions and observing the backtrace result. GDB uses Expect. I can
learn something from GDB's testsuite.

AFAIK, CFA and return address are enough for unwinding. Dose full
register tracking
means to emit DWARF for all the registers's saving and restoring in
the life time of the function?

Thanks.

Xingxing Pan


More information about the freebsd-hackers mailing list