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