> >
> > 2. unwinding with -fomit-frame-pointer doesn't work and often
> > segfaults.
> >
>
> Which version of libunwind are you testing?
I first noticed problems with whatever Fedora rawhide has. So I
built 0.99-alpha myself and still have the same problems.
You can compile with --enable-debug and then try:
UNW_DEBUG_LEVEL=15 ./unw-test
to see what's going on.
Looks like some of my patches that worked around the problem on x86_64 need to be back ported to x86.
http://git.kernel.org/gitweb.cgi?p=libs/libunwind/libunwind.git;a=blobdiff;f=src/x86_64/Gis_signal_frame.c;h=67eab27ff0f775670643dc1acb7da7cc1f91ac57;hp=221eab89266a5ba6274a1030ee67b241f96e6401;hb=7c0907634d5639158ed762bb2d14f1ac06228615;hpb=58888a5060d5e732c1ab1f0bf6a6c480153dabbd
http://git.kernel.org/gitweb.cgi?p=libs/libunwind/libunwind.git;a=commit;h=527225e492553b997d16adca7cc3bb472d5ef628
With these patches, unw_step() will return 0 instead of seg faulting. The real problem however needs to be fixed.
This is how far I got:
>_Ux86_step: (cursor=0xffffc584, ip=0x08048771)
>_Ux86_dwarf_find_proc_info: looking for IP=0x8048770
>callback: checking , base=0x0)
>callback: found table `': segbase=0x8048cd0, len=110, gp=0x804aff4, table_data=0x8048cdc
>_Ux86_dwarf_search_unwind_table: ip=0x8048770, start_ip=0x804875f
>_Ux86_dwarf_extract_proc_info_from_fde: FDE @ 0x8048f0c
>parse_cie: CIE parsed OK, augmentation = "", handler=0x0
>_Ux86_dwarf_extract_proc_info_from_fde: FDE covers IP 0x804875f-0x8048771, LSDA=0x0
>run_cfi_program: CFA_def_cfa r4+0x4
>run_cfi_program: CFA_offset r8 at cfa+0xfffffffc
>run_cfi_program: CFA_advance_loc to 0x8048760
>run_cfi_program: CFA_def_cfa_offset 0x8
>run_cfi_program: CFA_offset r3 at cfa+0xfffffff8
>_Ux86_dwarf_step: returning 1
>_Ux86_step: returning 1
>_Ux86_step: (cursor=0xffffc584, ip=0x000000e9)
>_Ux86_dwarf_find_proc_info: looking for IP=0xe8
Obviously, ip=0x000000e9 is bogus. We need to figure out if the compiler generated bad unwind descriptors or it was libunwind's fault. I'll keep looking.
-Arun