backtrace() not working on ARMv7a
Filippo ARCIDIACONO
filippo.arcidiacono at st.com
Thu Sep 12 14:14:04 UTC 2013
On 9/12/2013 2:49 PM, Rajendra Dendukuri wrote:
> Thanks Shreyas for the tip. But it is not working even with "-fexceptions" or "-fasynchronous-unwind-tables" options.
>
> Forum,
> Anyone faced this issue before?
Yes. I got the same behavior using your test.
Doing some googling , see
http://stackoverflow.com/questions/9229702/gcc-return-address-of-calling-function-in-arm-architecture
on ARM arch the gcc __builtin_return_address() function does not work
beyond the current function|||| (only __builtin_return_address(0) works),
this explain because we don't obtain a full backtrace.
Using -finstrument-function compiler option (see gcc documentation at
http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Code-Gen-Options.html#Code-Gen-Options)
I got a full backtrace:
root at arcidiaf:/home/filippo# gcc -o crash_test -O0 -fexceptions
-finstrument-functions crash_tst.c
root at arcidiaf:/home/filippo# ./crash_test
Trying to access NULL pointer!
SIGSEGV Handler!
Got Backtrace Size=6
0x00008854
0x0000894c
0x76ef1c24
0x000089b4
0x00008b18
0x76f3c7bc
||
>
> /Thanks
>
> From: SHREYAS JOSHI [mailto:dexterous.me82 at yahoo.com]
> Sent: Thursday, September 12, 2013 2:33 AM
> To: Rajendra Dendukuri; uclibc at uclibc.org
> Subject: Re: backtrace() not working on ARMv7a
>
> Try -fexceptions.
>
> For further details, check the following link.
>
> http://www.tune2wizard.com/backtrace/
>
>
> Thanks & regards,
> Shreyas Joshi
>
>
> ________________________________
> From: Rajendra Dendukuri <rajendra at broadcom.com<mailto:rajendra at broadcom.com>>
> To: "uclibc at uclibc.org<mailto:uclibc at uclibc.org>" <uclibc at uclibc.org<mailto:uclibc at uclibc.org>>
> Sent: Wednesday, September 11, 2013 10:01 PM
> Subject: backtrace() not working on ARMv7a
>
> Hi uclibc list,
>
> I am trying to generate a call stack trace using backtrace() API which is part of libubacktrace. The idea is to catch a SIGSEGV signal and call backtrace() to print all the address values and compare the obtained addresses from objdump -D of executable. Attached is a simplified version of the application. Following is the output seen on ARMv7a platform with buildroot cross-toolchain (gcc- 4.6.3, uClibc-0.9.33.2, binutis-2.21.1).
>
> To compile the application:
> ${CROSS_COMPILE}gcc -o crash_test -O0 -funwind-tables -rdynamic crash_test.c
>
> ARMv7a# ./crash_test
> Trying to access NULL pointer!
> SIGSEGV Handler!
> Got Backtrace Size=2
> 0x00008724
> 0x000087c4
> ARMv7a#
>
> The above function call trace is only that of the signal hander (print_back_trace, sigsegv_handler) and does not show the entire call stack for the function where program crashed (print_back_trace, sigsegv_handler, func2, main).
>
> On x86 host same program shows a deeper function call trace right up to the main function and even beyond:
> x86-RHEL5-host$./crash_test
> Trying to access NULL pointer!
> SIGSEGV Handler!
> Got Backtrace Size=7
> 0x00400939
> 0x004009ab
> 0x30930302f0
> 0x004009d3
> 0x00400a7b
> 0x309301d994
> 0x00400889
> x86-RHEL5-host$
>
> Can someone please comment on what is going wrong. Any special flags that need to be used while compiling/linking the program.
>
> /Thanks
>
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org<mailto:uClibc at uclibc.org>
> http://lists.busybox.net/mailman/listinfo/uclibc
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc
>
>
More information about the uClibc
mailing list