Release 970101
[wine] / debugger / info.c
1 /*
2  * Wine debugger utility routines
3  *
4  * Copyright 1993 Eric Youngdale
5  * Copyright 1995 Alexandre Julliard
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "debugger.h"
11
12 /***********************************************************************
13  *           DEBUG_Print
14  *
15  * Implementation of the 'print' command.
16  */
17 void DEBUG_Print( const DBG_ADDR *addr, int count, char format )
18 {
19     if (count != 1)
20     {
21         fprintf( stderr, "Count other than 1 is meaningless in 'print' command\n" );
22         return;
23     }
24
25     if (addr->seg && (addr->seg != 0xffffffff))
26     {
27         switch(format)
28         {
29         case 'x':
30             fprintf( stderr, "0x%04lx:", addr->seg );
31             break;
32
33         case 'd':
34             fprintf( stderr, "%ld:", addr->seg );
35             break;
36
37         case 'c':
38             break;  /* No segment to print */
39
40         case 'i':
41         case 's':
42         case 'w':
43         case 'b':
44             break;  /* Meaningless format */
45         }
46     }
47
48     switch(format)
49     {
50     case 'x':
51         if (addr->seg) fprintf( stderr, "0x%04lx\n", addr->off );
52         else fprintf( stderr, "0x%08lx\n", addr->off );
53         break;
54
55     case 'd':
56         fprintf( stderr, "%ld\n", addr->off );
57         break;
58
59     case 'c':
60         fprintf( stderr, "%d = '%c'\n",
61                  (char)(addr->off & 0xff), (char)(addr->off & 0xff) );
62         break;
63
64     case 'i':
65     case 's':
66     case 'w':
67     case 'b':
68         fprintf( stderr, "Format specifier '%c' is meaningless in 'print' command\n", format );
69         break;
70     }
71 }
72
73
74 /***********************************************************************
75  *           DEBUG_PrintAddress
76  *
77  * Print an 16- or 32-bit address, with the nearest symbol if any.
78  */
79 struct name_hash *
80 DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen, int flag )
81 {
82     struct name_hash * nh;
83     const char *name = DEBUG_FindNearestSymbol( addr, flag, &nh, 0 );
84
85     if (addr->seg) fprintf( stderr, "0x%04lx:", addr->seg );
86     if (addrlen == 16) fprintf( stderr, "0x%04lx", addr->off );
87     else fprintf( stderr, "0x%08lx", addr->off );
88     if (name) fprintf( stderr, " (%s)", name );
89     return nh;
90 }
91 /***********************************************************************
92  *           DEBUG_PrintAddressAndArgs
93  *
94  * Print an 16- or 32-bit address, with the nearest symbol if any.
95  * Similar to DEBUG_PrintAddress, but we print the arguments to
96  * each function (if known).  This is useful in a backtrace.
97  */
98 struct name_hash *
99 DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr, int addrlen, 
100                            unsigned int ebp, int flag )
101 {
102     struct name_hash * nh;
103     const char *name = DEBUG_FindNearestSymbol( addr, flag, &nh, ebp );
104
105     if (addr->seg) fprintf( stderr, "0x%04lx:", addr->seg );
106     if (addrlen == 16) fprintf( stderr, "0x%04lx", addr->off );
107     else fprintf( stderr, "0x%08lx", addr->off );
108     if (name) fprintf( stderr, " (%s)", name );
109
110     return nh;
111 }
112
113
114 /***********************************************************************
115  *           DEBUG_Help
116  *
117  * Implementation of the 'help' command.
118  */
119 void DEBUG_Help(void)
120 {
121     int i = 0;
122     static const char * const helptext[] =
123 {
124 "The commands accepted by the Wine debugger are a small subset",
125 "of the commands that gdb would accept.",
126 "The commands currently are:",
127 "  break [*<addr>]                        delete break bpnum",
128 "  disable bpnum                          enable bpnum",
129 "  help                                   quit",
130 "  bt                                     cont",
131 "  step                                   next",
132 "  x <addr>                               print <expr>",
133 "  set <reg> = <expr>                     set *<addr> = <expr>",
134 "  symbolfile <filename>                  define <identifier> <addr>",
135 "  up                                     down\n",
136 "  list <addr>                            frame <n>\n",
137
138 "Wine-specific commands:",
139 "  mode [16,32]                           walk [wnd,class,queue] <handle>",
140 "  info [reg,stack,break,segments,locals] info [wnd, queue] <handle>\n",
141
142 "The 'x' command accepts repeat counts and formats (including 'i') in the",
143 "same way that gdb does.\n",
144
145 " The following are examples of legal expressions:",
146 " $eax     $eax+0x3   0x1000   ($eip + 256)  *$eax   *($esp + 3)",
147 " Also, a nm format symbol table can be read from a file using the",
148 " symbolfile command.  Symbols can also be defined individually with",
149 " the define command.",
150 "",
151 NULL
152 };
153
154     while(helptext[i]) fprintf(stderr,"%s\n", helptext[i++]);
155 }
156
157
158
159 /***********************************************************************
160  *           DEBUG_List
161  *
162  * Implementation of the 'list' command.
163  */
164 void DEBUG_List( DBG_ADDR *addr, int count )
165 {
166     static DBG_ADDR lasttime = { 0xffffffff, 0 };
167
168     if (addr == NULL) addr = &lasttime;
169     DBG_FIX_ADDR_SEG( addr, CS_reg(&DEBUG_context) );
170     while (count-- > 0)
171     {
172         DEBUG_PrintAddress( addr, dbg_mode, FALSE );
173         fprintf( stderr, ":  " );
174         if (!DBG_CHECK_READ_PTR( addr, 1 )) return;
175         DEBUG_Disasm( addr );
176         fprintf (stderr, "\n");
177     }
178     lasttime = *addr;
179 }