summaryrefslogtreecommitdiff
path: root/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'debug.c')
-rw-r--r--debug.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/debug.c b/debug.c
new file mode 100644
index 0000000..1be873b
--- /dev/null
+++ b/debug.c
@@ -0,0 +1,112 @@
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "common.h"
+
+void
+debug_(int level, const char *file, int line, const char *fmt, ...) {
+ char buf[1024];
+ va_list args;
+
+ if (!(options.debug & level)) {
+ return;
+ }
+ va_start(args, fmt);
+ vsnprintf(buf, 1024, fmt, args);
+ va_end(args);
+
+ output_line(NULL, "DEBUG: %s:%d: %s", file, line, 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 <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/ptrace.h>
+
+static 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;
+}
+
+static int
+xwritec(char c) {
+ char temp = c;
+ char *text = &temp;
+ int rc = 0;
+ rc = write(1, text, 1);
+ return rc;
+}
+
+static int
+xwritecr(void) {
+ return xwritec('\n');
+}
+
+static 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;
+ long *infwords;
+ long addr;
+
+ wrdcnt = len / sizeof(long) + 1;
+ infwords = malloc(wrdcnt * sizeof(long));
+ if (!infwords) {
+ perror("ltrace: malloc");
+ exit(1);
+ }
+ 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;
+}