X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=stacktrace.h;h=2430818a0cda6582bc044f1f80166b088ac74d80;hp=01d31d2f33c2e72fcc54ce8d120baed359fead08;hb=7742256df627848c1c375f979f5369a45c92057b;hpb=d4f6c8b91fb6c85bbb5d2ba3477c14fc10383c44;ds=sidebyside diff --git a/stacktrace.h b/stacktrace.h index 01d31d2f..2430818a 100644 --- a/stacktrace.h +++ b/stacktrace.h @@ -9,10 +9,13 @@ #include #include -/** Print a demangled stack backtrace of the caller function to FILE* out. */ -static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63) +/** + * @brief Print a demangled stack backtrace of the caller function to file + * descriptor fd. + */ +static inline void print_stacktrace(int fd = STDERR_FILENO, unsigned int max_frames = 63) { - fprintf(out, "stack trace:\n"); + dprintf(fd, "stack trace:\n"); // storage array for stack trace address data void* addrlist[max_frames+1]; @@ -21,7 +24,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*)); if (addrlen == 0) { - fprintf(out, " \n"); + dprintf(fd, " \n"); return; } @@ -35,12 +38,12 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames // iterate over the returned symbol lines. skip the first, it is the // address of this function. - for (int i = 1; i < addrlen; i++) { + for (int i = 1;i < addrlen;i++) { char *begin_name = 0, *begin_offset = 0, *end_offset = 0; // find parentheses and +address offset surrounding the mangled name: // ./module(function+0x15c) [0x8048a6d] - for (char *p = symbollist[i]; *p; ++p) { + for (char *p = symbollist[i];*p;++p) { if (*p == '(') begin_name = p; else if (*p == '+') @@ -62,20 +65,20 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames int status; char* ret = abi::__cxa_demangle(begin_name, - funcname, &funcnamesize, &status); + funcname, &funcnamesize, &status); if (status == 0) { - funcname = ret; // use possibly realloc()-ed string - fprintf(out, " %s : %s+%s\n", - symbollist[i], funcname, begin_offset); + funcname = ret; // use possibly realloc()-ed string + dprintf(fd, " %s : %s+%s\n", + symbollist[i], funcname, begin_offset); } else { // demangling failed. Output function name as a C function with // no arguments. - fprintf(out, " %s : %s()+%s\n", - symbollist[i], begin_name, begin_offset); + dprintf(fd, " %s : %s()+%s\n", + symbollist[i], begin_name, begin_offset); } } else { // couldn't parse the line? print the whole line. - fprintf(out, " %s\n", symbollist[i]); + dprintf(fd, " %s\n", symbollist[i]); } } @@ -83,4 +86,9 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames free(symbollist); } -#endif // __STACKTRACE_H__ +static inline void print_stacktrace(FILE *out, unsigned int max_frames = 63) +{ + print_stacktrace(fileno(out), max_frames); +} + +#endif // __STACKTRACE_H__