debug.c revision 2d45b1a8e26a36a9f85dc49e721c4390ca93dc40
1#include <stdio.h> 2#include <stdarg.h> 3 4#include "debug.h" 5#include "options.h" 6#include "output.h" 7 8void 9debug_(int level, const char *file, int line, const char *func, const char *fmt, 10 ...) 11{ 12 char buf[1024]; 13 va_list args; 14 15 if (opt_d < level) { 16 return; 17 } 18 va_start(args, fmt); 19 vsnprintf(buf, 1024, fmt, args); 20 va_end(args); 21 22 output_line(NULL, "DEBUG: %s:%d: %s(): %s", file, line, func, buf); 23} 24 25// The following section provides a way to print things, like hex dumps, 26// with out using buffered output. This was written by Steve Munroe of IBM. 27 28#include <stdio.h> 29#include <errno.h> 30#include <unistd.h> 31#include <stdlib.h> 32#include <sys/ptrace.h> 33 34int xwrite(const char *string, size_t len) 35{ 36 int rc = 0; 37 rc = write(1, string, len); 38 return rc; 39} 40 41int xwrites(const char *string) 42{ 43 size_t len = 0; 44 int rc = 0; 45 const char *tstring = string; 46 47 while (*tstring++ != '\0') { 48 len++; 49 } 50 51 if (len > 0) { 52 rc = xwrite(string, len); 53 } 54 55 return rc; 56} 57 58int xwritehexi(int i) 59{ 60 int rc = 0; 61 char text[9]; 62 int j; 63 unsigned int temp = (unsigned int)i; 64 65 for (j = 7; j >= 0; j--) { 66 char c; 67 c = (char)((temp & 0x0f) + '0'); 68 if (c > '9') { 69 c = (char)(c + ('a' - '9' - 1)); 70 } 71 text[j] = c; 72 temp = temp >> 4; 73 } 74 75 rc = write(1, text, 8); 76 return rc; 77} 78 79int xwritehexl(long i) 80{ 81 int rc = 0; 82 char text[17]; 83 int j; 84 unsigned long temp = (unsigned long)i; 85 86 for (j = 15; j >= 0; j--) { 87 char c; 88 c = (char)((temp & 0x0f) + '0'); 89 if (c > '9') { 90 c = (char)(c + ('a' - '9' - 1)); 91 } 92 text[j] = c; 93 temp = temp >> 4; 94 } 95 96 rc = write(1, text, 16); 97 return rc; 98} 99 100int xwritec(char c) 101{ 102 char temp = c; 103 char *text = &temp; 104 int rc = 0; 105 rc = write(1, text, 1); 106 return rc; 107} 108 109int xwritecr(void) 110{ 111 return xwritec('\n'); 112} 113 114int xwritedump(void *ptr, long addr, int len) 115{ 116 int rc = 0; 117 long *tprt = (long *)ptr; 118 int i; 119 120 for (i = 0; i < len; i += 8) { 121 xwritehexl(addr); 122 xwritec('-'); 123 xwritec('>'); 124 xwritehexl(*tprt++); 125 xwritecr(); 126 addr += sizeof(long); 127 } 128 129 return rc; 130} 131 132int xinfdump(long pid, void *ptr, int len) 133{ 134 int rc; 135 int i; 136 long wrdcnt = len / sizeof(long) + 1; 137 long *infwords = malloc(wrdcnt * sizeof(long)); 138 long addr = (long)ptr; 139 140 addr = ((addr + sizeof(long) - 1) / sizeof(long)) * sizeof(long); 141 142 for (i = 0; i < wrdcnt; ++i) { 143 infwords[i] = ptrace(PTRACE_PEEKTEXT, pid, addr); 144 addr += sizeof(long); 145 } 146 147 rc = xwritedump(infwords, (long)ptr, len); 148 149 free(infwords); 150 return rc; 151} 152