1 | /* sdump - dump memory */
|
---|
2 |
|
---|
3 | #include <minix/config.h>
|
---|
4 | #include <sys/types.h>
|
---|
5 | #include <minix/const.h>
|
---|
6 | #include <minix/type.h>
|
---|
7 | #include <minix/ipc.h>
|
---|
8 | #include <timers.h>
|
---|
9 | #include <signal.h>
|
---|
10 |
|
---|
11 | #undef EXTERN
|
---|
12 | #define EXTERN
|
---|
13 | #include "../../servers/pm/const.h"
|
---|
14 | #include "../../servers/pm/type.h"
|
---|
15 | #include "../../servers/pm/mproc.h"
|
---|
16 | #include "../../kernel/const.h"
|
---|
17 | #include "../../kernel/type.h"
|
---|
18 | #include "../../kernel/proc.h"
|
---|
19 | #undef printf /* printf was misdefined by the sys headers */
|
---|
20 |
|
---|
21 | #include <ctype.h>
|
---|
22 | #include <fcntl.h>
|
---|
23 | #include <limits.h>
|
---|
24 | #include <stdarg.h>
|
---|
25 | #include <stdlib.h>
|
---|
26 | #include <string.h>
|
---|
27 | #include <unistd.h>
|
---|
28 | #include <stdio.h>
|
---|
29 |
|
---|
30 | #define STACK_BYTES 30000
|
---|
31 |
|
---|
32 | char *default_core = "core";
|
---|
33 | int stack[STACK_BYTES / sizeof (int)];
|
---|
34 |
|
---|
35 | _PROTOTYPE(int main, (int argc, char **argv));
|
---|
36 | _PROTOTYPE(void read_segmap, (int fd, struct mproc *mp, long *seg_size));
|
---|
37 | _PROTOTYPE(void read_registers, (int fd, struct proc *p));
|
---|
38 | _PROTOTYPE(void dump_stack, (int fd, struct mproc *mp, long *seg_size));
|
---|
39 | _PROTOTYPE(void error, (char *s1, char *s2));
|
---|
40 |
|
---|
41 | int main(argc, argv)
|
---|
42 | int argc;
|
---|
43 | char *argv[];
|
---|
44 | {
|
---|
45 | int fd;
|
---|
46 | long seg_size[NR_LOCAL_SEGS]; /* segment sizes in bytes */
|
---|
47 | struct mproc *mp;
|
---|
48 | struct proc *p;
|
---|
49 | char *file;
|
---|
50 |
|
---|
51 | if (argc > 2) error("Usage: rdump [core_file]\n", "");
|
---|
52 |
|
---|
53 | if (argc == 1)
|
---|
54 | file = default_core;
|
---|
55 | else
|
---|
56 | file = argv[1];
|
---|
57 |
|
---|
58 | if ( (fd = open(file, O_RDONLY)) < 0) error("Cannot open", file);
|
---|
59 |
|
---|
60 | mp = &mproc[0];
|
---|
61 | p = &proc[0];
|
---|
62 | read_segmap(fd, mp, seg_size);
|
---|
63 | read_registers(fd, p);
|
---|
64 | dump_stack(fd, mp, seg_size);
|
---|
65 | return(0);
|
---|
66 | }
|
---|
67 |
|
---|
68 | void read_segmap(fd, mp, seg_size)
|
---|
69 | int fd;
|
---|
70 | struct mproc *mp;
|
---|
71 | long seg_size[NR_LOCAL_SEGS];
|
---|
72 | {
|
---|
73 | int i, segmap_size;
|
---|
74 |
|
---|
75 | /* Read in the segment map. */
|
---|
76 | segmap_size = sizeof mp->mp_seg;
|
---|
77 | if (read(fd, (char *) mp, segmap_size) != segmap_size)
|
---|
78 | error("Cannot read segmap map from core image file", "");
|
---|
79 |
|
---|
80 | for (i = 0; i < NR_LOCAL_SEGS; i++)
|
---|
81 | seg_size[i] = (long) mp->mp_seg[i].mem_len << CLICK_SHIFT;
|
---|
82 | printf("Seg sizes in bytes: Text: %ld Data: %ld, Stack: %ld\n",
|
---|
83 | seg_size[T], seg_size[D], seg_size[S]);
|
---|
84 | }
|
---|
85 |
|
---|
86 | void read_registers(fd, p)
|
---|
87 | int fd;
|
---|
88 | struct proc *p;
|
---|
89 | {
|
---|
90 | int proctblsize;
|
---|
91 | struct stackframe_s r;
|
---|
92 |
|
---|
93 | proctblsize = sizeof (struct proc);
|
---|
94 | if (read(fd, (char *) p, proctblsize) != proctblsize)
|
---|
95 | error("Cannot read process table from core image file", "");
|
---|
96 | r = p->p_reg;
|
---|
97 |
|
---|
98 | /* Print proc table. */
|
---|
99 | printf("\n");
|
---|
100 | #if (CHIP == INTEL)
|
---|
101 | #if _WORD_SIZE == 4
|
---|
102 | printf("eax=%8lX ebx=%8lX ecx=%8lX edx=%8lX\n",
|
---|
103 | r.retreg, r.bx, r.cx, r.dx);
|
---|
104 | printf("esi=%8lX edi=%8lX ebp=%8lX esp=%8lX eip=%8lX\n",
|
---|
105 | r.si, r.di, r.fp, r.sp, r.pc);
|
---|
106 | printf(" ds=%8lX es=%8lX ss=%8lX cs=%8lX\n",
|
---|
107 | r.ds, r.es, r.ss, r.cs);
|
---|
108 | printf(" fs=%8lX gs=%8lX ef=%8lX\n",
|
---|
109 | r.fs, r.gs, r.psw);
|
---|
110 | #else
|
---|
111 | printf(
|
---|
112 | "ax=%4X bx=%4X cx=%4X dx=%4X si=%4X di=%4X bp=%4X sp=%4X ip=%4X\n",
|
---|
113 | r.retreg, r.bx, r.cx, r.dx, r.si, r.di, r.fp, r.sp, r.pc);
|
---|
114 | printf(
|
---|
115 | " f=%4X ds=%4X es=%4X ss=%4X cs=%4X\n",
|
---|
116 | r.psw, r.ds, r.es, r.ss, r.cs);
|
---|
117 | #endif
|
---|
118 | #endif /* (CHIP == INTEL) */
|
---|
119 | #if (CHIP == M68000)
|
---|
120 | printf("pc=%8lx psw=%4x\n", r.pc, r.psw);
|
---|
121 | printf("d0=%8lx d1=%8lx d2=%8lx d3=%8lx\n", r.retreg, r.d1, r.d2, r.d3);
|
---|
122 | printf("d4=%8lx d5=%8lx d6=%8lx d7=%8lx\n", r.d4, r.d5, r.d6, r.d7);
|
---|
123 | printf("a0=%8lx a1=%8lx a2=%8lx a3=%8lx\n", r.a0, r.a1, r.a2, r.a3);
|
---|
124 | printf("a4=%8lx a5=%8lx a6=%8lx a7=%8lx\n", r.a4, r.a5, r.a6, r.sp);
|
---|
125 | #endif
|
---|
126 | printf("\n");
|
---|
127 | }
|
---|
128 |
|
---|
129 | void dump_stack(fd, mp, seg_size)
|
---|
130 | int fd;
|
---|
131 | struct mproc *mp;
|
---|
132 | long seg_size[NR_LOCAL_SEGS];
|
---|
133 | {
|
---|
134 | unsigned char ch;
|
---|
135 | char format[32];
|
---|
136 | int word, i, stack_size, j;
|
---|
137 | vir_bytes v, vi;
|
---|
138 |
|
---|
139 | /* Seek past text and data segments. */
|
---|
140 | lseek(fd, seg_size[T] + seg_size[D], SEEK_CUR);
|
---|
141 | v = mp->mp_seg[S].mem_vir << CLICK_SHIFT;
|
---|
142 |
|
---|
143 | stack_size = (int) seg_size[S];
|
---|
144 | if (stack_size != seg_size[S] || stack_size < 0 || stack_size > STACK_BYTES)
|
---|
145 | error("Stack too large", "");
|
---|
146 |
|
---|
147 | /* Dump the stack. */
|
---|
148 | if (read(fd, (char *) stack, stack_size) != stack_size)
|
---|
149 | error("Error reading stack from core file", "");
|
---|
150 |
|
---|
151 | #define BYTES(num) ((unsigned) sizeof (num))
|
---|
152 | #define DEC_DIGITS(num) (sizeof (num) <= 2 ? 6 : 11) /* for 16/32 bit num */
|
---|
153 | #define HEX_DIGITS(num) (((unsigned) sizeof (num) * CHAR_BIT + 3) / 4)
|
---|
154 |
|
---|
155 | printf("%*s %*s %*s %*s\n",
|
---|
156 | HEX_DIGITS(vi), "Addr",
|
---|
157 | HEX_DIGITS(word), "Hex",
|
---|
158 | DEC_DIGITS(word), "Dec",
|
---|
159 | BYTES(word), "Char");
|
---|
160 |
|
---|
161 | /* The format string depends messily on the size of various things. */
|
---|
162 | strcpy(format, "%*");
|
---|
163 | if (sizeof v > sizeof (int)) strcat(format, "l");
|
---|
164 | strcat(format, "X: %*");
|
---|
165 | if (sizeof word > sizeof (int)) strcat(format, "l");
|
---|
166 | strcat(format, "X %*");
|
---|
167 | if (sizeof word > sizeof (int)) strcat(format, "l");
|
---|
168 | strcat(format, "d ");
|
---|
169 |
|
---|
170 | for (i = stack_size / sizeof (int) - 1, vi = v + stack_size - sizeof (int);
|
---|
171 | i >= 0; --i, vi -= sizeof (int)) {
|
---|
172 | word = stack[i];
|
---|
173 | printf(format,
|
---|
174 | HEX_DIGITS(vi), vi,
|
---|
175 | HEX_DIGITS(word), word,
|
---|
176 | DEC_DIGITS(word), word);
|
---|
177 | for (j = 0; j < BYTES(word); ++j, word >>= CHAR_BIT) {
|
---|
178 | ch = (unsigned char) word;
|
---|
179 | if (!isprint(ch)) ch = '.';
|
---|
180 | putchar(ch);
|
---|
181 | }
|
---|
182 | putchar('\n');
|
---|
183 | }
|
---|
184 | }
|
---|
185 |
|
---|
186 | void error(s1, s2)
|
---|
187 | char *s1, *s2;
|
---|
188 | {
|
---|
189 | printf("%s %s\n", s1, s2);
|
---|
190 | exit(1);
|
---|
191 | }
|
---|