diff options
author | John Reiser <jreiser@BitWagon.com> | 2011-03-18 19:41:44 -0700 |
---|---|---|
committer | William Cohen <wcohen@redhat.com> | 2011-03-22 13:04:40 -0400 |
commit | ea107f58cd9624042aef6581d082c01065391159 (patch) | |
tree | 34030b8a2cf57546466c2f37edc8c88ad07e8e8c | |
parent | cba95c2d81193ba6ffc5fa53971ea460140d7f28 (diff) | |
download | memstomp-ea107f58cd9624042aef6581d082c01065391159.tar.gz memstomp-ea107f58cd9624042aef6581d082c01065391159.tar.xz memstomp-ea107f58cd9624042aef6581d082c01065391159.zip |
Format output using iovec+writev instead of malloc+copy.
-rw-r--r-- | memstomp.c | 52 |
1 files changed, 14 insertions, 38 deletions
@@ -202,7 +202,9 @@ static bool verify_frame(const char *s) { return true; } -static char* generate_stacktrace(void) +#include <sys/uio.h> + +static void generate_stacktrace(int const fd) { void *retaddr[frames_max]; /* c99 or gcc extension */ int const n = real_backtrace(retaddr, frames_max); @@ -211,42 +213,18 @@ static char* generate_stacktrace(void) char **const strings = real_backtrace_symbols(retaddr, n); assert(strings); - char *ret; - { - size_t k = 0; - int i; - for (i = 0; i < n; i++) - k += strlen(strings[i]) + 2; - - ret = malloc(k + 1); - } - assert(ret); - - char *p; + struct iovec iov[3]; + iov[0].iov_base = "\t"; + iov[0].iov_len = 1; + iov[2].iov_base = "\n"; + iov[2].iov_len = 1; + int i; - bool b = false; - for (i = 0, p = ret; i < n; i++) { - if (!b && !verify_frame(strings[i])) - continue; - - if (!b && i > 0) { - /* Skip all but the first stack frame of ours */ - *(p++) = '\t'; - strcpy(p, strings[i-1]); - p += strlen(strings[i-1]); - *(p++) = '\n'; - } - - b = true; - - *(p++) = '\t'; - strcpy(p, strings[i]); - p += strlen(strings[i]); - *(p++) = '\n'; + for (i = 0; i < n; i++) if (strings[i]) { + iov[1].iov_base = strings[i]; + iov[1].iov_len = strlen(strings[i]); + writev(fd, iov, 3); } - *p = 0; - free(strings); - return ret; } int backtrace(void **array, int size) @@ -290,9 +268,7 @@ static void warn_memcpy(void * dest, const void * src, size_t count) * then this is not async signal safe. But the write() above will produce * some evidence before any possible trouble below. */ - char *const info = generate_stacktrace(); - fprintf(stderr, "%s", info); - free(info); + generate_stacktrace(STDERR_FILENO); } |