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.
void print_trace(void)
{
#ifdef CONFIG_STACKTRACE
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;
#else
void *array[MAX_TRACE_LEN];
char **strings;
#include <execinfo.h>
#include <cxxabi.h>
#include <execinfo.h>
#include <cxxabi.h>
-/** 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];
// storage array for stack trace address data
void* addrlist[max_frames+1];
int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*));
if (addrlen == 0) {
int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*));
if (addrlen == 0) {
- fprintf(out, " <empty, possibly corrupt>\n");
+ dprintf(fd, " <empty, possibly corrupt>\n");
funcname, &funcnamesize, &status);
if (status == 0) {
funcname = ret; // use possibly realloc()-ed string
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.
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.
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]);
+static inline void print_stacktrace(FILE *out, unsigned int max_frames = 63)
+{
+ print_stacktrace(fileno(out), max_frames);
+}
+
#endif // __STACKTRACE_H__
#endif // __STACKTRACE_H__