X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fbacktrace.c;h=ca7591c51682e1fd71875ae42805f33871c36f2f;hb=61717cc38;hp=bbfb792c656cef3ab055bb1ef4b76759f6cc951e;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vppinfra/backtrace.c b/src/vppinfra/backtrace.c old mode 100644 new mode 100755 index bbfb792c656..ca7591c5168 --- a/src/vppinfra/backtrace.c +++ b/src/vppinfra/backtrace.c @@ -219,43 +219,36 @@ backtrace_done: #ifndef clib_backtrace_defined #define clib_backtrace_defined -typedef struct clib_generic_stack_frame_t -{ - struct clib_generic_stack_frame_t *prev; - void *return_address; -} clib_generic_stack_frame_t; +/* use glibc backtrace for stack trace */ +#include -/* This will only work if we have a frame pointer. - Without a frame pointer we have to parse the machine code to - parse the stack frames. */ uword clib_backtrace (uword * callers, uword max_callers, uword n_frames_to_skip) { - clib_generic_stack_frame_t *f; - uword i; - - f = __builtin_frame_address (0); - + int size; + void *array[20]; /* Also skip current frame. */ n_frames_to_skip += 1; - for (i = 0; i < max_callers + n_frames_to_skip; i++) + size = clib_min (ARRAY_LEN (array), max_callers + n_frames_to_skip); + + size = backtrace (array, size); + + uword i; + + for (i = 0; i < max_callers + n_frames_to_skip && i < size; i++) { - f = f->prev; - if (!f) - goto backtrace_done; - if (clib_abs ((void *) f - (void *) f->prev) > (64 * 1024)) - goto backtrace_done; if (i >= n_frames_to_skip) - callers[i - n_frames_to_skip] = pointer_to_uword (f->return_address); + callers[i - n_frames_to_skip] = pointer_to_uword (array[i]); } -backtrace_done: if (i < n_frames_to_skip) return 0; else return i - n_frames_to_skip; } + + #endif /* clib_backtrace_defined */ /*