From 81aade769a17e5b5ecfbdd7d57a30e67d78a15d3 Mon Sep 17 00:00:00 2001 From: Nigel Horne Date: Tue, 22 Jun 2004 09:36:28 +0000 Subject: [PATCH] Added backtrace git-svn: trunk@625 --- clamav-devel/test/mbox/debugm.c | 49 +++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/clamav-devel/test/mbox/debugm.c b/clamav-devel/test/mbox/debugm.c index a220a4697..a37454361 100644 --- a/clamav-devel/test/mbox/debugm.c +++ b/clamav-devel/test/mbox/debugm.c @@ -1,5 +1,7 @@ /* - * $CC $CFLAGS debugm.c -lclamav -lefence (or what ever memory debugger) + * $CC $CFLAGS -I../.. debugm.c -lclamav -lefence (or what ever memory debugger) + * If you're going to use HAVE_BACKTRACE, ensure CFLAGS includes -g and doesn't + * include -fomit-frame-pointer * * njh@bandsman.co.uk */ @@ -11,6 +13,48 @@ #include #include #include +#include +#include +#include "clamav-config.h" + +#if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 +/*#define HAVE_BACKTRACE /* Only tested on Linux... */ +#endif + +#ifdef HAVE_BACKTRACE +#include +#endif + +static void print_trace(void); +static void sigsegv(int sig); + +static void +sigsegv(int sig) +{ + signal(SIGSEGV, SIG_DFL); + print_trace(); + _exit(SIGSEGV); +} + +static void +print_trace(void) +{ +#ifdef HAVE_BACKTRACE + void *array[10]; + size_t size, i; + char **strings; + + puts("Segfault caught, backtrace:"); + + size = backtrace(array, 10); + strings = backtrace_symbols(array, size); + + for(i = 0; i < size; i++) + printf("\t%s\n", strings[i]); + + free(strings); +#endif +} int main(int argc, char **argv) @@ -29,6 +73,7 @@ main(int argc, char **argv) perror("/tmp/mboxtest"); return errno; } + signal(SIGSEGV, sigsegv); while(*++argv) { int fd = open(*argv, 0); @@ -42,5 +87,5 @@ main(int argc, char **argv) } puts("Finished - don't forget to rm -rf /tmp/mboxtest"); - exit(0); + return 0; }