[Crash-utility] [PATCH] Use backtrace() instead of __builtin_return_address()
Dave Anderson
anderson at redhat.com
Tue May 13 19:36:27 UTC 2008
Bernhard Walle wrote:
> When crash is compiled with gcc 4.3 and -O2, the __builtin_return_address()
> causes crash to crash. See also [1] for a discussion about that.
It appears that [1] only describes a problem if you ask for more frames
than exist. Given the usage in crash, it's impossible to have a frame count
of less than 4. So it must be some other bug, no?
Dave
> The gcc documentation [2] says
>
> __builtin_return_address()
>
> On some machines it may be impossible to determine the return address of
> any function other than the current one; in such cases, or when the top
> of the stack has been reached, this function will return 0 or a random
> value. In addition, __builtin_frame_address may be used to determine if
> the top of the stack has been reached.
>
> This function should only be used with a nonzero argument for debugging
> purposes.
>
> Even the __builtin_frame_address() does not work here. Instead of checking
> if the crash is built with -O2 and introducing new preprocessor checks here,
> I use the backtrace() function which is available via glibc. This works here
> (tested without the other patch which brought my attention to this bug).
>
> Since crash only runs on Linux (IIRC), the glibc dependency should not be
> a problem.
>
> Signed-off-by: Bernhard Walle <bwalle at suse.de>
>
>
> [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=165992
> [2] http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
>
> ---
> defs.h | 10 +---------
> 1 file changed, 1 insertion(+), 9 deletions(-)
>
> --- a/defs.h
> +++ b/defs.h
> @@ -1803,15 +1803,7 @@ struct alias_data { /* c
> static inline void
> save_return_address(ulong *retaddr)
> {
> - retaddr[0] = (ulong) __builtin_return_address(0);
> -#if defined(X86) || defined(PPC) || defined(X86_64) || defined(PPC64)
> - if (__builtin_frame_address(1))
> - retaddr[1] = (ulong) __builtin_return_address(1);
> - if (__builtin_frame_address(2))
> - retaddr[2] = (ulong) __builtin_return_address(2);
> - if (__builtin_frame_address(3))
> - retaddr[3] = (ulong) __builtin_return_address(3);
> -#endif
> + backtrace(retaddr, 4);
> }
>
> #endif /* !GDB_COMMON */
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
More information about the Crash-utility
mailing list