2 * Wine debugger utility routines
13 extern unsigned int dbg_mask
;
14 extern unsigned int dbg_mode
;
16 void application_not_running()
18 fprintf(stderr
,"Application not running\n");
21 void print_address(unsigned int addr
, FILE * outfile
){
23 extern char * find_nearest_symbol(unsigned int *);
25 name
= find_nearest_symbol((unsigned int *) addr
);
27 fprintf(outfile
,"0x%8.8x(%s)", addr
, name
);
29 fprintf(outfile
,"0x%8.8x", addr
);
34 void print_address_info(bfd_vma addr
, disassemble_info
* info
){
35 print_address((unsigned int) addr
, info
->stream
);
38 int print_insn(char *realmemaddr
, char *memaddr
, FILE *stream
, int addrlen
){
39 static disassemble_info info
;
40 static int initialized
= 0;
43 INIT_DISASSEMBLE_INFO(info
, stderr
);
44 info
.print_address_func
= print_address_info
;
48 info
.buffer
= memaddr
;
49 info
.buffer_vma
= (bfd_vma
) realmemaddr
;
50 info
.buffer_length
= 1024;
52 return print_insn_i286((bfd_vma
) realmemaddr
, &info
);
54 return print_insn_i386((bfd_vma
) realmemaddr
, &info
);
55 fprintf(stderr
, "invalid address length %d.\n", addrlen
);
59 void db_task_printsym(unsigned int addr
){
60 print_address(addr
, stderr
);
63 int print_insn(char *realmemaddr
, char *memaddr
, FILE *stream
, int addrlen
)
66 return db_disasm((unsigned int) realmemaddr
, 0, 1) -
67 ((unsigned int) realmemaddr
);
69 return db_disasm((unsigned int) realmemaddr
, 0, 0) -
70 ((unsigned int) realmemaddr
);
71 fprintf(stderr
, "invalid address length %d.\n", addrlen
);
79 application_not_running();
83 fprintf(stderr
,"Register dump:\n");
84 /* First get the segment registers out of the way */
85 fprintf(stderr
," CS:%4.4x SS:%4.4x DS:%4.4x ES:%4.4x GS:%4.4x FS:%4.4x\n",
86 SC_CS
, SC_SS
, SC_DS
, SC_ES
, SC_GS
, SC_FS
);
88 /* Now dump the main registers */
89 fprintf(stderr
," EIP:%8.8x ESP:%8.8x EBP:%8.8x EFLAGS:%8.8x\n",
90 SC_EIP(dbg_mask
), SC_ESP(dbg_mask
), SC_EBP(dbg_mask
), SC_EFLAGS
);
92 /* And dump the regular registers */
94 fprintf(stderr
," EAX:%8.8x EBX:%8.8x ECX:%8.8x EDX:%8.8x\n",
95 SC_EAX(dbg_mask
), SC_EBX(dbg_mask
), SC_ECX(dbg_mask
), SC_EDX(dbg_mask
));
97 /* Finally dump these main registers */
98 fprintf(stderr
," EDI:%8.8x ESI:%8.8x\n",
99 SC_EDI(dbg_mask
), SC_ESI(dbg_mask
));
108 application_not_running();
112 fprintf(stderr
,"Stack dump:\n");
113 dump
= (int*) SC_EIP(dbg_mask
);
116 fprintf(stderr
," %8.8x", *dump
++);
118 fprintf(stderr
,"\n");
120 fprintf(stderr
,"\n");
124 void examine_memory(int addr
, int count
, char format
){
127 unsigned short int * wdump
;
130 if((addr
& 0xffff0000) == 0 && dbg_mode
== 16)
131 addr
|= (format
== 'i' ? SC_CS
: SC_DS
) << 16;
134 if(format
!= 'i' && count
> 1) {
135 print_address(addr
, stderr
);
136 fprintf(stderr
,": ");
143 if (count
== 1) count
= 256;
144 while(*pnt
&& count
) {
145 fputc( *pnt
++, stderr
);
148 fprintf(stderr
,"\n");
152 for(i
=0; i
<count
; i
++) {
153 print_address(addr
, stderr
);
154 fprintf(stderr
,": ");
155 addr
+= print_insn((char *) addr
, (char *) addr
, stderr
, dbg_mode
);
156 fprintf(stderr
,"\n");
160 dump
= (unsigned int *) addr
;
161 for(i
=0; i
<count
; i
++)
163 fprintf(stderr
," %8.8x", *dump
++);
165 fprintf(stderr
,"\n");
166 print_address((unsigned int) dump
, stderr
);
167 fprintf(stderr
,": ");
170 fprintf(stderr
,"\n");
174 dump
= (unsigned int *) addr
;
175 for(i
=0; i
<count
; i
++)
177 fprintf(stderr
," %d", *dump
++);
179 fprintf(stderr
,"\n");
180 print_address((unsigned int) dump
, stderr
);
181 fprintf(stderr
,": ");
184 fprintf(stderr
,"\n");
188 wdump
= (unsigned short int *) addr
;
189 for(i
=0; i
<count
; i
++)
191 fprintf(stderr
," %x", *wdump
++);
193 fprintf(stderr
,"\n");
194 print_address((unsigned int) wdump
, stderr
);
195 fprintf(stderr
,": ");
198 fprintf(stderr
,"\n");
203 for(i
=0; i
<count
; i
++)
209 fprintf(stderr
," %c", *pnt
++);
211 fprintf(stderr
,"\n");
212 print_address((unsigned int) pnt
, stderr
);
213 fprintf(stderr
,": ");
216 fprintf(stderr
,"\n");
221 for(i
=0; i
<count
; i
++)
223 fprintf(stderr
," %02x", (*pnt
++) & 0xff);
225 fprintf(stderr
,"\n");
226 print_address((unsigned int) pnt
, stderr
);
227 fprintf(stderr
,": ");
230 fprintf(stderr
,"\n");
234 /* The rest are fairly straightforward */
236 fprintf(stderr
,"examine mem: %x %d %c\n", addr
, count
, format
);
239 char * helptext
[] = {
240 "The commands accepted by the Wine debugger are a small subset",
241 "of the commands that gdb would accept. The commands currently",
244 " disable bpnum enable bpnum",
247 " mode [16,32] print <expr>",
248 " set <reg> = <expr> set *<expr> = <expr>",
249 " info [reg,stack,break,segments] symbolfile <filename>",
250 " define <identifier> <expr>",
252 "The 'x' command accepts repeat counts and formats (including 'i') in the",
253 "same way that gdb does.",
255 " The following are examples of legal expressions:",
256 " $eax $eax+0x3 0x1000 ($eip + 256) *$eax *($esp + 3)",
257 " Also, a nm format symbol table can be read from a file using the",
258 " symbolfile command. Symbols can also be defined individually with",
259 " the define command.",
266 while(helptext
[i
]) fprintf(stderr
,"%s\n", helptext
[i
++]);
273 unsigned short saved_bp
;
274 unsigned short saved_ip
;
275 unsigned short saved_cs
;
278 unsigned long saved_bp
;
279 unsigned long saved_ip
;
280 unsigned short saved_cs
;
287 struct frame
* frame
;
292 application_not_running();
296 frame
= (struct frame
*) ((SC_EBP(dbg_mask
) & ~1) | (SC_SS
<< 16));
298 fprintf(stderr
,"Backtrace:\n");
299 fprintf(stderr
,"%d ",frameno
);
300 print_address(frame
->u
.win32
.saved_ip
,stderr
);
302 while((cs
& 3) == 3) {
303 /* See if in 32 bit mode or not. Assume GDT means 32 bit. */
306 fprintf(stderr
,"\n%d ",frameno
++);
307 print_address(frame
->u
.win32
.saved_ip
,stderr
);
308 if(frame
->u
.win32
.saved_ip
<((unsigned long)CallTo32
+1000))break;
309 frame
= (struct frame
*) frame
->u
.win32
.saved_bp
;
311 cs
= frame
->u
.win16
.saved_cs
;
312 fprintf(stderr
,"%d %4.4x:%4.4x\n", frameno
++, cs
,
313 frame
->u
.win16
.saved_ip
);
314 frame
= (struct frame
*) ((frame
->u
.win16
.saved_bp
& ~1) |