diff options
Diffstat (limited to 'tests/fs-tests')
-rw-r--r-- | tests/fs-tests/integrity/integck.c | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 522c6de..9822b3b 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -17,7 +17,6 @@ * * Author: Adrian Hunter */ - #include <unistd.h> #include <stdlib.h> #include <stdio.h> @@ -32,6 +31,7 @@ #include <getopt.h> #include <assert.h> #include <mntent.h> +#include <execinfo.h> #include <sys/mman.h> #include <sys/vfs.h> #include <sys/mount.h> @@ -54,15 +54,9 @@ */ #define stringify1(x) #x #define stringify(x) stringify1(x) -#define CHECK(cond) do { \ - if (!(cond)) { \ - int _err = errno; \ - fflush(stdout); \ - errmsg("condition '%s' failed at %s:%d", \ - stringify(cond), __FILE__, __LINE__); \ - errmsg("error %d (%s)", _err, strerror(_err)); \ - exit(EXIT_FAILURE); \ - } \ +#define CHECK(cond) do { \ + if (!(cond)) \ + check_failed(stringify(cond), __func__, __FILE__, __LINE__); \ } while(0) #define pcv(fmt, ...) do { \ @@ -215,6 +209,31 @@ static unsigned int check_run_no; static char *random_name_buf; /* + * This is a helper for the 'CHECK()' macro - prints a scary error message and + * terminates the program. + */ +static void check_failed(const char *cond, const char *func, const char *file, + int line) +{ + int error = errno, count; + void *addresses[128]; + + fflush(stdout); + errmsg("condition '%s' failed in %s() at %s:%d", + cond, func, __FILE__, __LINE__); + normsg("error %d (%s)", error, strerror(error)); + /* + * Note, to make this work well you need: + * 1. Make all functions non-static - add "#define static' + * 2. Compile with -rdynamic and -g gcc options + * 3. Preferrably compile with -O0 to avoid inlining + */ + count = backtrace(addresses, 128); + backtrace_symbols_fd(addresses, count, fileno(stdout)); + exit(EXIT_FAILURE); +} + +/* * Is this 'struct write_info' actually holds information about a truncation? */ static int is_truncation(struct write_info *w) |