From a5bb4b567e042fb4ec51fc233ffac84bf6af1428 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 19 Jan 2015 23:54:58 +0100 Subject: [PATCH] debug: refactor a lot of buffer debug functions using a shared formatter. --- src/libzzuf/debug.c | 41 +++++++++++++++++++-- src/libzzuf/debug.h | 8 +++-- src/libzzuf/lib-fd.c | 78 +++++++++++++++------------------------- src/libzzuf/lib-mem.c | 46 ++++++++++-------------- src/libzzuf/lib-stream.c | 16 +++------ 5 files changed, 97 insertions(+), 92 deletions(-) diff --git a/src/libzzuf/debug.c b/src/libzzuf/debug.c index ad027e7..8d98a61 100644 --- a/src/libzzuf/debug.c +++ b/src/libzzuf/debug.c @@ -38,6 +38,8 @@ static void mydebug(char const *format, va_list args); +static char const *hex2char = "0123456789abcdef"; + /** * Helper macro to write an integer value to a given file descriptor, * either in base 10 or in hexadecimal. @@ -172,8 +174,6 @@ static inline void append(void const *data, size_t count) static void mydebug(char const *format, va_list args) { - static char const *hex2char = "0123456789abcdef"; - zzuf_mutex_lock(&debug_mutex); int saved_errno = errno; @@ -331,3 +331,40 @@ static void mydebug(char const *format, va_list args) errno = saved_errno; } +void zzuf_debug_str(char *str, uint8_t const *buffer, + unsigned len, unsigned maxlen) +{ + /* Open the double quotes */ + *str++ = '"'; + + /* Print as many escaped characters as possible */ + for (unsigned i = 0; i < len && i < maxlen; ++i) + { + if (buffer[i] >= 0x20 && buffer[i] < 0x7f + && buffer[i] != '\\' && buffer[i] != '\"') + { + *str++ = buffer[i]; + } + else + { + *str++ = '\\'; + *str++ = buffer[i] == '\0' ? '0' + : buffer[i] == '\n' ? 'n' + : buffer[i] == '\t' ? 't' + : buffer[i] == '\r' ? 'r' + : buffer[i] == '\\' ? '\\' + : buffer[i] == '\"' ? '\"' + : 'x'; + + if (str[-1] == 'x') + { + *str++ = hex2char[(buffer[i] & 0xf0) >> 4]; + *str++ = hex2char[buffer[i] & 0x0f]; + } + } + } + + /* Close the double quotes */ + strcpy(str, len > maxlen ? "…\"" : "\""); +} + diff --git a/src/libzzuf/debug.h b/src/libzzuf/debug.h index 6476f63..43b6d54 100644 --- a/src/libzzuf/debug.h +++ b/src/libzzuf/debug.h @@ -14,14 +14,18 @@ * debug.h: debugging support */ -extern void zzuf_debug(const char *format, ...) ATTRIBUTE_PRINTF(1,2); -extern void zzuf_debug2(const char *format, ...) ATTRIBUTE_PRINTF(1,2); +extern void zzuf_debug(char const *format, ...) ATTRIBUTE_PRINTF(1,2); +extern void zzuf_debug2(char const *format, ...) ATTRIBUTE_PRINTF(1,2); +extern void zzuf_debug_str(char *str, uint8_t const *buffer, + unsigned len, unsigned maxlen); #ifdef LIBZZUF # define debug zzuf_debug # define debug2 zzuf_debug2 +# define debug_str zzuf_debug_str #else # define debug(...) do {} while (0) # define debug2(...) do {} while (0) +# define debug_str(...) do {} while (0) #endif diff --git a/src/libzzuf/lib-fd.c b/src/libzzuf/lib-fd.c index 6a03fc4..461dc31 100644 --- a/src/libzzuf/lib-fd.c +++ b/src/libzzuf/lib-fd.c @@ -383,20 +383,14 @@ int NEW(socket)(int domain, int type, int protocol) \ if (ret > 0) \ { \ - char *b = buf; \ _zz_fuzz(s, buf, ret); \ _zz_addpos(s, ret); \ - if (ret >= 4) \ - debug("%s(%i, %p, %li, 0x%x) = %i \"%c%c%c%c...", __func__, \ - s, buf, (long int)len, flags, ret, \ - b[0], b[1], b[2], b[3]); \ - else \ - debug("%s(%i, %p, %li, 0x%x) = %i \"%c...", __func__, \ - s, buf, (long int)len, flags, ret, b[0]); \ } \ - else \ - debug("%s(%i, %p, %li, 0x%x) = %i", __func__, \ - s, buf, (long int)len, flags, ret); \ + \ + char tmp[128]; \ + debug_str(tmp, buf, ret, 8); \ + debug("%s(%i, %p, %li, 0x%x) = %i %s", __func__, \ + s, buf, (long int)len, flags, ret, tmp); \ } while (0); #if defined HAVE_RECV @@ -426,26 +420,20 @@ RECV_T NEW(__recv_chk)(int s, void *buf, size_t len, size_t buflen, int flags) \ if (ret > 0) \ { \ - char tmp[128]; \ - char *b = buf; \ _zz_fuzz(s, buf, ret); \ _zz_addpos(s, ret); \ - if (fromlen) \ - sprintf(tmp, "&%i", (int)*fromlen); \ - else \ - strcpy(tmp, "NULL"); \ - if (ret >= 4) \ - debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c%c%c%c...", \ - __func__, s, buf, (long int)len, flags, from, tmp, \ - ret, b[0], b[1], b[2], b[3]); \ - else \ - debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c...", \ - __func__, s, buf, (long int)len, flags, from, tmp, \ - ret, b[0]); \ } \ + \ + char tmp[128], tmp2[128]; \ + if (ret > 0 && fromlen) \ + sprintf(tmp, "&%i", (int)*fromlen); \ + else if (ret > 0) \ + strcpy(tmp, "NULL"); \ else \ - debug("%s(%i, %p, %li, 0x%x, %p, %p) = %i", __func__, \ - s, buf, (long int)len, flags, from, fromlen, ret); \ + tmp[0] = '\0'; \ + debug_str(tmp2, buf, ret, 8); \ + debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i %s", __func__, \ + s, buf, (long int)len, flags, from, tmp, ret, tmp2); \ } while (0) #if defined HAVE_RECVFROM @@ -498,19 +486,15 @@ RECV_T NEW(recvmsg)(int s, struct msghdr *hdr, int flags) \ if (ret > 0) \ { \ - char *b = buf; \ _zz_fuzz(fd, buf, ret); \ _zz_addpos(fd, ret); \ - if (ret >= 4) \ - debug("%s(%i, %p, %li) = %i \"%c%c%c%c...", __func__, fd, \ - buf, (long int)count, ret, b[0], b[1], b[2], b[3]); \ - else \ - debug("%s(%i, %p, %li) = %i \"%c...", __func__, fd, \ - buf, (long int)count, ret, b[0]); \ } \ - else \ - debug("%s(%i, %p, %li) = %i", __func__, fd, \ - buf, (long int)count, ret); \ + \ + char tmp[128]; \ + debug_str(tmp, buf, ret, 8); \ + debug("%s(%i, %p, %li) = %i %s", __func__, \ + fd, buf, (long int)count, ret, tmp); \ + \ offset_check(fd); \ } while (0) @@ -567,23 +551,16 @@ ssize_t NEW(pread)(int fd, void *buf, size_t count, off_t offset) if (ret > 0) { long int curoff = _zz_getpos(fd); - char *b = buf; _zz_setpos(fd, offset); _zz_fuzz(fd, buf, ret); _zz_setpos(fd, curoff); - - if (ret >= 4) - debug("%s(%i, %p, %li, %li) = %i \"%c%c%c%c...", __func__, fd, buf, - (long int)count, (long int)offset, ret, - b[0], b[1], b[2], b[3]); - else - debug("%s(%i, %p, %li, %li) = %i \"%c...", __func__, fd, buf, - (long int)count, (long int)offset, ret, b[0]); } - else - debug("%s(%i, %p, %li, %li) = %i", __func__, fd, buf, - (long int)count, (long int)offset, ret); + + char tmp[128]; + debug_str(tmp, buf, ret, 8); + debug("%s(%i, %p, %li, %li) = %i %s", __func__, + fd, buf, (long int)count, (long int)offset, ret, tmp); return ret; } @@ -733,7 +710,8 @@ static void offset_check(int fd) off_t ret = ORIG(lseek)(fd, 0, SEEK_CUR); #endif if (ret != -1 && ret != _zz_getpos(fd)) - debug("warning: offset inconsistency"); + debug("warning: lseek(%d, 0, SEEK_CUR) = %lli (expected %lli)", + fd, (long long int)ret, (long long int)_zz_getpos(fd)); errno = orig_errno; } diff --git a/src/libzzuf/lib-mem.c b/src/libzzuf/lib-mem.c index 441369e..d5be992 100644 --- a/src/libzzuf/lib-mem.c +++ b/src/libzzuf/lib-mem.c @@ -314,6 +314,8 @@ int nbmaps = 0; ret = MAP_FAILED; \ } \ } \ + \ + size_t data_length = 0; \ if (b != MAP_FAILED) \ { \ int i, oldpos; \ @@ -331,7 +333,7 @@ int nbmaps = 0; /* If we requested a memory area larger than the end of the * file, it was not actually allocated, so do not try to * copy data beyond that point. */ \ - size_t data_length = _zz_bytes_until_eof(fd, offset); \ + data_length = _zz_bytes_until_eof(fd, offset); \ if (data_length > length) \ data_length = length; \ \ @@ -345,19 +347,13 @@ int nbmaps = 0; _zz_fuzz(fd, (uint8_t *)b, length); \ _zz_setpos(fd, oldpos); \ ret = b; \ - if (data_length >= 4) \ - debug("%s(%p, %li, %i, %i, %i, %lli) = %p \"%c%c%c%c...", \ - __func__, start, (long int)length, prot, flags, fd, \ - (long long int)offset, ret, b[0], b[1], b[2], b[3]); \ - else \ - debug("%s(%p, %li, %i, %i, %i, %lli) = %p \"%c...", \ - __func__, start, (long int)length, prot, flags, fd, \ - (long long int)offset, ret, b[0]); \ } \ - else \ - debug("%s(%p, %li, %i, %i, %i, %lli) = %p", \ - __func__, start, (long int)length, prot, flags, fd, \ - (long long int)offset, ret); \ + \ + char tmp[128]; \ + debug_str(tmp, (uint8_t *)b, (unsigned)data_length, 8); \ + debug("%s(%p, %li, %i, %i, %i, %lli) = %p %s", __func__, start, \ + (long int)length, prot, flags, fd, (long long int)offset, \ + ret, tmp); \ } while (0) #if defined HAVE_MMAP @@ -412,7 +408,10 @@ kern_return_t NEW(map_fd)(int fd, vm_offset_t offset, vm_offset_t *addr, if (!must_fuzz_fd(fd)) return ret; - if (ret == 0 && numbytes) + if (ret != 0) + numbytes = 0; + + if (numbytes) { /* FIXME: do we also have to rewind the filedescriptor like in mmap? */ char *b = malloc(numbytes); @@ -422,20 +421,13 @@ kern_return_t NEW(map_fd)(int fd, vm_offset_t offset, vm_offset_t *addr, /* FIXME: the map is never freed; there is no such thing as unmap_fd, * but I suppose that kind of map should go when the filedescriptor is * closed (unlike mmap, which returns a persistent buffer). */ - - if (numbytes >= 4) - debug("%s(%i, %lli, &%p, %i, %lli) = %i \"%c%c%c%c", __func__, - fd, (long long int)offset, (void *)*addr, (int)find_space, - (long long int)numbytes, ret, b[0], b[1], b[2], b[3]); - else - debug("%s(%i, %lli, &%p, %i, %lli) = %i \"%c", __func__, fd, - (long long int)offset, (void *)*addr, (int)find_space, - (long long int)numbytes, ret, b[0]); } - else - debug("%s(%i, %lli, &%p, %i, %lli) = %i", __func__, fd, - (long long int)offset, (void *)*addr, (int)find_space, - (long long int)numbytes, ret); + + char tmp[128]; + debug_str(tmp, (uint8_t *)*addr, numbytes, 8); + debug("%s(%i, %lli, &%p, %i, %lli) = %i %s", __func__, fd, + (long long int)offset, (void *)*addr, (int)find_space, + (long long int)numbytes, ret, tmp); return ret; } diff --git a/src/libzzuf/lib-stream.c b/src/libzzuf/lib-stream.c index 184c4dc..d9c906d 100644 --- a/src/libzzuf/lib-stream.c +++ b/src/libzzuf/lib-stream.c @@ -561,17 +561,11 @@ void NEW(rewind)(FILE *stream) } \ _zz_setpos(fd, newpos); \ debug_stream("after", stream); \ - if (newpos >= oldpos + 4) \ - debug("%s(%p, %li, %li, [%i]) = %li \"%c%c%c%c...", __func__, \ - ptr, (long int)size, (long int)nmemb, fd, \ - (long int)ret, b[0], b[1], b[2], b[3]); \ - else if (newpos > oldpos) \ - debug("%s(%p, %li, %li, [%i]) = %li \"%c...", __func__, ptr, \ - (long int)size, (long int)nmemb, fd, \ - (long int)ret, b[0]); \ - else \ - debug("%s(%p, %li, %li, [%i]) = %li", __func__, ptr, \ - (long int)size, (long int)nmemb, fd, (long int)ret); \ + \ + char tmp[128]; \ + debug_str(tmp, b, newpos - oldpos, 8); \ + debug("%s(%p, %li, %li, [%i]) = %li %s", __func__, ptr, \ + (long int)size, (long int)nmemb, fd, (long int)ret, tmp); \ } while (0) #undef fread