From 2f217659a45a04a5f4b78855bf18a4e64bc04840 Mon Sep 17 00:00:00 2001 From: Juho Snellman Date: Tue, 17 Apr 2007 06:54:10 +0000 Subject: [PATCH] 1.0.4.93: backtrace_from_fp * Split the ldb x86oid backtrace into two parts (backtrace and backtrace_from_fp), to make debugging e.g. thread deadlocks from gdb easier. For example: call backtrace_from_fp($rbp, 10) --- src/runtime/backtrace.c | 49 ++++++++++++++++++++++++++++++++++------------- version.lisp-expr | 2 +- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/runtime/backtrace.c b/src/runtime/backtrace.c index b4503ad..07114aa 100644 --- a/src/runtime/backtrace.c +++ b/src/runtime/backtrace.c @@ -284,15 +284,26 @@ backtrace(int nframes) #else static int +altstack_pointer_p (void *p) { + char* stack_start = ((char *) arch_os_get_current_thread()) + + dynamic_values_bytes; + char* stack_end = stack_start + 32*SIGSTKSZ; + + return (p > stack_start && p <= stack_end); +} + +static int stack_pointer_p (void *p) { /* we are using sizeof(long) here, because that is the right value on both * x86 and x86-64. (But note that false positives would not cause much harm * given the heuristical nature of x86_call_context.) */ unsigned long stack_alignment = sizeof(long); - return (p < (void *) arch_os_get_current_thread()->control_stack_end - && p > (void *) &p - && (((unsigned long) p) & (stack_alignment-1)) == 0); + + return (altstack_pointer_p(p) + || (p < (void *) arch_os_get_current_thread()->control_stack_end + && (p > (void *) &p || altstack_pointer_p(&p)) + && (((unsigned long) p) & (stack_alignment-1)) == 0)); } static int @@ -511,20 +522,15 @@ print_entry_points (struct code *code) } } +/* This function has been split from backtrace() to enable Lisp + * backtraces from gdb with call backtrace_from_fp(...). Useful for + * example when debugging threading deadlocks. + */ void -backtrace(int nframes) +backtrace_from_fp(void *fp, int nframes) { - void *fp; int i; -#if defined(LISP_FEATURE_X86) - asm("movl %%ebp,%0" : "=g" (fp)); -#elif defined (LISP_FEATURE_X86_64) - asm("movq %%rbp,%0" : "=g" (fp)); -#else -#error "How did we get here?" -#endif - for (i = 0; i < nframes; ++i) { lispobj *p; void *ra; @@ -563,4 +569,21 @@ backtrace(int nframes) } } +void +backtrace(int nframes) +{ + void *fp; + int i; + +#if defined(LISP_FEATURE_X86) + asm("movl %%ebp,%0" : "=g" (fp)); +#elif defined (LISP_FEATURE_X86_64) + asm("movq %%rbp,%0" : "=g" (fp)); +#else +#error "How did we get here?" +#endif + + backtrace_from_fp(fp, nframes); +} + #endif diff --git a/version.lisp-expr b/version.lisp-expr index 4fac3a1..3d44c11 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.4.92" +"1.0.4.93" -- 1.7.10.4