https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71951

--- Comment #12 from Icenowy Zheng <icenowy at aosc dot io> ---
(In reply to Wilco from comment #11)
> (In reply to Icenowy Zheng from comment #10)
> > In my environment (glibc 2.25, and both the building scripts of glibc and
> > gcc have -fomit-frame-pointer automatically enabled), this bug is not fully
> > resolved yet.
> > 
> > With GCC upgraded to 6.4.0, GDB debugger started to work correctly. (With
> > GCC 6.3.0 GDB cannot even work and segfault at unwind code in libgcc).
> > 
> > However, if I still build GCC with -fomit-frame-pointer in CFLAGS, the
> > backtrace() function of glibc cannot work, and segfault at line 240 of
> > libgcc/unwind-dw2.c .
> > 
> > By reading the source code, I think the unwind code is still trying to get
> > CFA from the register x29, and when debugging I found that the x29 register
> > in the unwind context is 0 (because of -fomit-frame-pointer), so line 240 is
> > dereferencing a NULL pointer, so it segfaulted.
> > 
> > Maybe the behavior that accessing x29 register to get CFA is not correct?
> 
> Well if everything built with -fomit-frame-pointer then it is definitely
> wrong to read x29. Can you give more info similar to comment #3?

I didn't remember a lot as this issue is already fixed in our build system by
removing -fomit-frame-pointer.

But I remember part of the stacktrace:

_Unwind_GetGR(index=29) at libgcc/unwind-dw2.c:240 <= segfault here
_Unwind_GetPtr(index=29) at libgcc/unwind-dw2.c:251
uw_update_context_1() at libgcc/unwind-dw2.c:1410
_Unwind_Backtrace() at libgcc/unwind.inc (line number forgot)
backtrace() in libc.so.6

Reply via email to