From 0a99a3c4c1c9aab7be017682b43ddf12d609ff4b Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Wed, 17 Apr 2013 17:10:20 -0700 Subject: [PATCH] stacktrace: remove usage of FILE in stacktrace The original print_stacktrace() function required a FILE pointer, so we manufactured one. We really should avoid the bugs that can come from the allocation and buffering done with FILE, since this is used on error paths. --- common.cc | 4 +--- stacktrace.h | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/common.cc b/common.cc index 9cb7239d..66b563a8 100644 --- a/common.cc +++ b/common.cc @@ -22,9 +22,7 @@ int model_out = STDOUT_FILENO; void print_trace(void) { #ifdef CONFIG_STACKTRACE - FILE *file = fdopen(model_out, "w"); - print_stacktrace(file); - fclose(file); + print_stacktrace(model_out); #else void *array[MAX_TRACE_LEN]; char **strings; diff --git a/stacktrace.h b/stacktrace.h index 01d31d2f..a3b03509 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; } @@ -65,17 +68,17 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames funcname, &funcnamesize, &status); if (status == 0) { funcname = ret; // use possibly realloc()-ed string - fprintf(out, " %s : %s+%s\n", + 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", + 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); } +static inline void print_stacktrace(FILE *out, unsigned int max_frames = 63) +{ + print_stacktrace(fileno(out), max_frames); +} + #endif // __STACKTRACE_H__ -- 2.34.1