2 * Wine debugger utility routines
10 #include "db_disasm.h"
14 extern unsigned int dbg_mask;
15 extern unsigned int dbg_mode;
17 void application_not_running()
19 fprintf(stderr,"Application not running\n");
22 void print_address(unsigned int addr, FILE * outfile, int addrlen)
26 fprintf( outfile, "%4.4x:%4.4x", addr >> 16, addr & 0xffff );
30 extern char * find_nearest_symbol(unsigned int *);
32 char * name = find_nearest_symbol((unsigned int *) addr);
34 fprintf(outfile,"0x%8.8x(%s)", addr, name);
36 fprintf(outfile,"0x%8.8x", addr);
44 application_not_running();
48 fprintf(stderr,"Register dump:\n");
49 /* First get the segment registers out of the way */
50 fprintf(stderr," CS:%4.4x SS:%4.4x DS:%4.4x ES:%4.4x GS:%4.4x FS:%4.4x\n",
51 SC_CS, SC_SS, SC_DS, SC_ES, SC_GS, SC_FS);
53 /* Now dump the main registers */
54 fprintf(stderr," EIP:%8.8x ESP:%8.8x EBP:%8.8x EFLAGS:%8.8x\n",
55 SC_EIP(dbg_mask), SC_ESP(dbg_mask), SC_EBP(dbg_mask), SC_EFLAGS);
57 /* And dump the regular registers */
59 fprintf(stderr," EAX:%8.8x EBX:%8.8x ECX:%8.8x EDX:%8.8x\n",
60 SC_EAX(dbg_mask), SC_EBX(dbg_mask), SC_ECX(dbg_mask), SC_EDX(dbg_mask));
62 /* Finally dump these main registers */
63 fprintf(stderr," EDI:%8.8x ESI:%8.8x\n",
64 SC_EDI(dbg_mask), SC_ESI(dbg_mask));
73 application_not_running();
77 fprintf(stderr,"Stack dump:\n");
78 dump = (int*) SC_EIP(dbg_mask);
81 fprintf(stderr," %8.8x", *dump++);
89 void examine_memory(int addr, int count, char format){
92 unsigned short int * wdump;
95 if((addr & 0xffff0000) == 0 && dbg_mode == 16)
96 addr |= (format == 'i' ? SC_CS : SC_DS) << 16;
98 if(format != 'i' && count > 1) {
99 print_address(addr, stderr, dbg_mode);
100 fprintf(stderr,": ");
105 pnt = dbg_mode == 16 ? (char *)PTR_SEG_TO_LIN(addr)
107 if (count == 1) count = 256;
108 while(*pnt && count) {
109 fputc( *pnt++, stderr);
112 fprintf(stderr,"\n");
116 for(i=0; i<count; i++) {
117 print_address(addr, stderr, dbg_mode);
118 fprintf(stderr,": ");
119 addr = db_disasm( addr, 0, (dbg_mode == 16) );
120 fprintf(stderr,"\n");
124 dump = dbg_mode == 16 ? (unsigned int *)PTR_SEG_TO_LIN(addr)
125 : (unsigned int *)addr;
126 for(i=0; i<count; i++)
128 fprintf(stderr," %8.8x", *dump++);
131 fprintf(stderr,"\n");
132 print_address(addr, stderr, dbg_mode);
133 fprintf(stderr,": ");
136 fprintf(stderr,"\n");
140 dump = dbg_mode == 16 ? (unsigned int *)PTR_SEG_TO_LIN(addr)
141 : (unsigned int *)addr;
142 for(i=0; i<count; i++)
144 fprintf(stderr," %d", *dump++);
147 fprintf(stderr,"\n");
148 print_address(addr, stderr, dbg_mode);
149 fprintf(stderr,": ");
152 fprintf(stderr,"\n");
156 wdump = dbg_mode == 16 ? (unsigned short *)PTR_SEG_TO_LIN(addr)
157 : (unsigned short *)addr;
158 for(i=0; i<count; i++)
160 fprintf(stderr," %x", *wdump++);
163 fprintf(stderr,"\n");
164 print_address(addr, stderr, dbg_mode);
165 fprintf(stderr,": ");
168 fprintf(stderr,"\n");
172 pnt = dbg_mode == 16 ? (char *)PTR_SEG_TO_LIN(addr)
174 for(i=0; i<count; i++)
180 fprintf(stderr," %c", *pnt++);
183 fprintf(stderr,"\n");
184 print_address(addr, stderr, dbg_mode);
185 fprintf(stderr,": ");
188 fprintf(stderr,"\n");
192 pnt = dbg_mode == 16 ? (char *)PTR_SEG_TO_LIN(addr)
194 for(i=0; i<count; i++)
196 fprintf(stderr," %02x", (*pnt++) & 0xff);
199 fprintf(stderr,"\n");
200 print_address(addr, stderr, dbg_mode);
201 fprintf(stderr,": ");
204 fprintf(stderr,"\n");
208 /* The rest are fairly straightforward */
210 fprintf(stderr,"examine mem: %x %d %c\n", addr, count, format);
213 char * helptext[] = {
214 "The commands accepted by the Wine debugger are a small subset",
215 "of the commands that gdb would accept. The commands currently",
218 " disable bpnum enable bpnum",
221 " mode [16,32] print <expr>",
222 " set <reg> = <expr> set *<expr> = <expr>",
223 " info [reg,stack,break,segments] symbolfile <filename>",
224 " define <identifier> <expr>",
226 "The 'x' command accepts repeat counts and formats (including 'i') in the",
227 "same way that gdb does.",
229 " The following are examples of legal expressions:",
230 " $eax $eax+0x3 0x1000 ($eip + 256) *$eax *($esp + 3)",
231 " Also, a nm format symbol table can be read from a file using the",
232 " symbolfile command. Symbols can also be defined individually with",
233 " the define command.",
240 while(helptext[i]) fprintf(stderr,"%s\n", helptext[i++]);
247 unsigned short saved_bp;
248 unsigned short saved_ip;
249 unsigned short saved_cs;
252 unsigned long saved_bp;
253 unsigned long saved_ip;
254 unsigned short saved_cs;
261 struct frame * frame;
266 application_not_running();
271 frame = (struct frame *)PTR_SEG_OFF_TO_LIN( SC_SS, SC_BP & ~1 );
273 frame = (struct frame *)SC_EBP(dbg_mask);
275 fprintf(stderr,"Backtrace:\n");
277 while((cs & 3) == 3) {
278 /* See if in 32 bit mode or not. Assume GDT means 32 bit. */
281 fprintf(stderr,"%d ",frameno++);
282 print_address(frame->u.win32.saved_ip,stderr,32);
283 fprintf( stderr, "\n" );
284 if (frame->u.win32.saved_ip >= ((unsigned long)main) &&
285 frame->u.win32.saved_ip <= ((unsigned long)main+1000)) break;
286 frame = (struct frame *) frame->u.win32.saved_bp;
288 if (frame->u.win16.saved_bp & 1) cs = frame->u.win16.saved_cs;
289 fprintf(stderr,"%d %4.4x:%4.4x\n", frameno++, cs,
290 frame->u.win16.saved_ip);
291 frame = (struct frame *) PTR_SEG_OFF_TO_LIN( SC_SS, frame->u.win16.saved_bp & ~1);
292 if ((cs & 7) != 7) /* switching to 32-bit mode */
294 extern int IF1632_Saved32_ebp;
295 frame = (struct frame *)IF1632_Saved32_ebp;