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