#include #include #include "debug.h" #include "options.h" #include "output.h" void debug_(int level, const char *file, int line, const char *func, const char *fmt, ...) { char buf[1024]; va_list args; if (opt_d < level) { return; } va_start(args, fmt); vsnprintf(buf, 1024, fmt, args); va_end(args); output_line(NULL, "DEBUG: %s:%d: %s(): %s", file, line, func, buf); } // The following section provides a way to print things, like hex dumps, // with out using buffered output. This was written by Steve Munroe of IBM. #include #include #include #include #include int xwrite(const char *string, size_t len) { int rc = 0; rc = write(1, string, len); return rc; } int xwrites(const char *string) { size_t len = 0; int rc = 0; const char *tstring = string; while (*tstring++ != '\0') { len++; } if (len > 0) { rc = xwrite(string, len); } return rc; } int xwritehexi(int i) { int rc = 0; char text[9]; int j; unsigned int temp = (unsigned int)i; for (j = 7; j >= 0; j--) { char c; c = (char)((temp & 0x0f) + '0'); if (c > '9') { c = (char)(c + ('a' - '9' - 1)); } text[j] = c; temp = temp >> 4; } rc = write(1, text, 8); return rc; } int xwritehexl(long i) { int rc = 0; char text[17]; int j; unsigned long temp = (unsigned long)i; for (j = 15; j >= 0; j--) { char c; c = (char)((temp & 0x0f) + '0'); if (c > '9') { c = (char)(c + ('a' - '9' - 1)); } text[j] = c; temp = temp >> 4; } rc = write(1, text, 16); return rc; } int xwritec(char c) { char temp = c; char *text = &temp; int rc = 0; rc = write(1, text, 1); return rc; } int xwritecr(void) { return xwritec('\n'); } int xwritedump(void *ptr, long addr, int len) { int rc = 0; long *tprt = (long *)ptr; int i; for (i = 0; i < len; i += 8) { xwritehexl(addr); xwritec('-'); xwritec('>'); xwritehexl(*tprt++); xwritecr(); addr += sizeof(long); } return rc; } int xinfdump(long pid, void *ptr, int len) { int rc; int i; long wrdcnt = len / sizeof(long) + 1; long *infwords = malloc(wrdcnt * sizeof(long)); long addr = (long)ptr; addr = ((addr + sizeof(long) - 1) / sizeof(long)) * sizeof(long); for (i = 0; i < wrdcnt; ++i) { infwords[i] = ptrace(PTRACE_PEEKTEXT, pid, addr); addr += sizeof(long); } rc = xwritedump(infwords, (long)ptr, len); free(infwords); return rc; }