No longer directly accessing debuggee memory.
[wine] / debugger / debugger.h
1 /*
2  * Debugger definitions
3  *
4  * Copyright 1995 Alexandre Julliard
5  */
6
7 #ifndef __WINE_DEBUGGER_H
8 #define __WINE_DEBUGGER_H
9
10 #include <sys/types.h> /* u_long ... */
11 #include "windef.h"
12 #include "winbase.h"
13
14 #ifdef __i386__
15 #define STEP_FLAG 0x100 /* single step flag */
16 #define V86_FLAG  0x00020000
17 #endif
18
19 #define SYM_FUNC         0x0
20 #define SYM_DATA         0x1
21 #define SYM_WIN32        0x2
22 #define SYM_WINE         0x4
23 #define SYM_INVALID      0x8
24 #define SYM_TRAMPOLINE   0x10
25 #define SYM_STEP_THROUGH 0x20
26
27 enum    debug_type {DT_BASIC, DT_CONST, DT_POINTER, DT_ARRAY, DT_STRUCT, DT_ENUM, DT_TYPEDEF, DT_FUNC, DT_BITFIELD};
28
29
30 /*
31  * Return values for DEBUG_CheckLinenoStatus.  Used to determine
32  * what to do when the 'step' command is given.
33  */
34 #define FUNC_HAS_NO_LINES       (0)
35 #define NOT_ON_LINENUMBER       (1)
36 #define AT_LINENUMBER           (2)
37 #define FUNC_IS_TRAMPOLINE      (3)
38
39 /*
40  * For constants generated by the parser, we use this datatype
41  */
42 extern struct datatype * DEBUG_TypeInt;
43 extern struct datatype * DEBUG_TypeIntConst;
44 extern struct datatype * DEBUG_TypeUSInt;
45 extern struct datatype * DEBUG_TypeString;
46
47 typedef struct
48 {
49     struct datatype * type;
50     DWORD seg;  /* 0xffffffff means current default segment (cs or ds) */
51     DWORD off;
52 } DBG_ADDR;
53
54 struct list_id
55 {
56     char * sourcefile;
57     int    line;
58 };
59
60 struct  wine_lines {
61   unsigned long         line_number;
62   DBG_ADDR              pc_offset;
63 };
64
65 struct symbol_info
66 {
67   struct name_hash * sym;
68   struct list_id     list;
69 };
70
71 typedef struct wine_lines WineLineNo;
72
73 /*
74  * This structure holds information about stack variables, function
75  * parameters, and register variables, which are all local to this
76  * function.
77  */
78 struct  wine_locals {
79   unsigned int          regno:8;        /* For register symbols */
80   signed int            offset:24;      /* offset from esp/ebp to symbol */
81   unsigned int          pc_start;       /* For RBRAC/LBRAC */
82   unsigned int          pc_end;         /* For RBRAC/LBRAC */
83   char                * name;           /* Name of symbol */
84   struct datatype     * type;           /* Datatype of symbol */
85 };
86
87 typedef struct wine_locals WineLocals;
88
89 enum exec_mode
90 {
91     EXEC_CONT,                  /* Continuous execution */
92     EXEC_PASS,                  /* Continue, passing exception to app */
93     EXEC_STEP_OVER,             /* Stepping over a call to next source line */
94     EXEC_STEP_INSTR,            /* Step to next source line, stepping in if needed */
95     EXEC_STEPI_OVER,            /* Stepping over a call */
96     EXEC_STEPI_INSTR,           /* Single-stepping an instruction */
97     EXEC_FINISH,                /* Step until we exit current frame */
98     EXEC_STEP_OVER_TRAMPOLINE   /* Step over trampoline.  Requires that
99                                  * we dig the real return value off the stack
100                                  * and set breakpoint there - not at the
101                                  * instr just after the call.
102                                  */
103 };
104  
105 typedef struct
106 {
107     DBG_ADDR      addr;
108     BYTE          addrlen;
109     BYTE          opcode;
110     WORD          skipcount;
111     WORD          enabled : 1, 
112                   refcount;
113     struct expr * condition;
114 } BREAKPOINT;
115
116 typedef struct tagWINE_DBG_THREAD {
117     struct tagWINE_DBG_PROCESS* process;
118     HANDLE                      handle;
119     DWORD                       tid;
120     LPVOID                      start;
121     LPVOID                      teb;
122     int                         wait_for_first_exception;
123     int                         dbg_mode;
124     enum exec_mode              dbg_exec_mode;
125     int                         dbg_exec_count;
126     BREAKPOINT                  stepOverBP;
127     struct tagWINE_DBG_THREAD*  next;
128     struct tagWINE_DBG_THREAD*  prev;
129 } WINE_DBG_THREAD;
130
131 typedef struct tagWINE_DBG_PROCESS {
132     HANDLE                      handle;
133     DWORD                       pid;
134     WINE_DBG_THREAD*            threads;
135     struct tagWINE_DBG_PROCESS* next;
136     struct tagWINE_DBG_PROCESS* prev;
137 } WINE_DBG_PROCESS;
138
139 extern  WINE_DBG_PROCESS* DEBUG_CurrProcess;
140 extern  WINE_DBG_THREAD*  DEBUG_CurrThread;
141 extern  CONTEXT           DEBUG_context;
142
143 #define DEBUG_READ_MEM(addr, buf, len) \
144       (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
145
146 #define DEBUG_WRITE_MEM(addr, buf, len) \
147       (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
148
149 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
150       (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
151
152 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
153       (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
154
155 #ifdef __i386__
156 #ifdef REG_SP  /* Some Sun includes define this */
157 #undef REG_SP
158 #endif
159
160 enum debug_regs
161 {
162     REG_EAX, REG_EBX, REG_ECX, REG_EDX, REG_ESI,
163     REG_EDI, REG_EBP, REG_EFL, REG_EIP, REG_ESP,
164     REG_AX,  REG_BX,  REG_CX,  REG_DX,  REG_SI,
165     REG_DI,  REG_BP,  REG_FL,  REG_IP,  REG_SP,
166     REG_CS,  REG_DS,  REG_ES,  REG_SS,  REG_FS, REG_GS
167 };
168 #endif
169
170 #define OFFSET_OF(__c,__f)              ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
171
172   /* debugger/break.c */
173 extern void DEBUG_SetBreakpoints( BOOL set );
174 extern int  DEBUG_FindBreakpoint( const DBG_ADDR *addr );
175 extern void DEBUG_AddBreakpoint( const DBG_ADDR *addr );
176 extern void DEBUG_DelBreakpoint( int num );
177 extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
178 extern void DEBUG_InfoBreakpoints(void);
179 extern BOOL DEBUG_HandleTrap(void);
180 extern BOOL DEBUG_ShouldContinue( enum exec_mode mode, int * count );
181 extern void DEBUG_SuspendExecution( void );
182 extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
183 extern BOOL DEBUG_IsFctReturn(void);
184
185   /* debugger/db_disasm.c */
186 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
187
188   /* debugger/expr.c */
189 extern void DEBUG_FreeExprMem(void);
190 struct expr * DEBUG_RegisterExpr(enum debug_regs);
191 struct expr * DEBUG_SymbolExpr(const char * name);
192 struct expr * DEBUG_ConstExpr(int val);
193 struct expr * DEBUG_StringExpr(const char * str);
194 struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
195 struct expr * DEBUG_USConstExpr(unsigned int val);
196 struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
197 struct expr * DEBUG_UnopExpr(int oper, struct expr *);
198 struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
199 struct expr * DEBUG_StructExpr(struct expr *, const char * element);
200 struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
201 struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
202 struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
203 extern int  DEBUG_ExprValue(const DBG_ADDR *, unsigned int *);
204 extern DBG_ADDR DEBUG_EvalExpr(struct expr *);
205 extern int DEBUG_DelDisplay(int displaynum);
206 extern struct expr * DEBUG_CloneExpr(struct expr * exp);
207 extern int DEBUG_FreeExpr(struct expr * exp);
208 extern int DEBUG_DisplayExpr(struct expr * exp);
209
210   /* more debugger/break.c */
211 extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
212
213   /* debugger/display.c */
214 extern int DEBUG_DoDisplay(void);
215 extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
216 extern int DEBUG_DoDisplay(void);
217 extern int DEBUG_DelDisplay(int displaynum);
218 extern int DEBUG_InfoDisplay(void);
219
220   /* debugger/hash.c */
221 extern struct name_hash * DEBUG_AddSymbol( const char *name, 
222                                            const DBG_ADDR *addr,
223                                            const char * sourcefile,
224                                            int flags);
225 extern struct name_hash * DEBUG_AddInvSymbol( const char *name, 
226                                            const DBG_ADDR *addr,
227                                            const char * sourcefile);
228 extern BOOL DEBUG_GetSymbolValue( const char * name, const int lineno,
229                                      DBG_ADDR *addr, int );
230 extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr );
231 extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
232                                              struct name_hash ** rtn,
233                                              unsigned int ebp,
234                                              struct list_id * source);
235 extern void DEBUG_ReadSymbolTable( const char * filename );
236 extern int  DEBUG_LoadEntryPoints( const char * prefix );
237 extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num, 
238                      unsigned long offset );
239 extern struct wine_locals *
240             DEBUG_AddLocal( struct name_hash * func, int regno, 
241                             int offset,
242                             int pc_start,
243                             int pc_end,
244                             char * name);
245 extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
246 extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file, 
247                               const char * func);
248 extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
249 extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
250 extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
251 extern int DEBUG_cmp_sym(const void * p1, const void * p2);
252 extern BOOL DEBUG_GetLineNumberAddr( struct name_hash *, const int lineno, 
253                                 DBG_ADDR *addr, int bp_flag );
254
255 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym, 
256                                     struct datatype * type);
257 BOOL DEBUG_Normalize(struct name_hash * nh );
258
259   /* debugger/info.c */
260 extern void DEBUG_PrintBasic( const DBG_ADDR *addr, int count, char format );
261 extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr, 
262                                               int addrlen, int flag );
263 extern void DEBUG_Help(void);
264 extern void DEBUG_HelpInfo(void);
265 extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr, 
266                                                      int addrlen, 
267                                                      unsigned int ebp, 
268                                                      int flag );
269 extern void DEBUG_InfoClass(const char* clsName);
270 extern void DEBUG_WalkClasses(void);
271 extern void DEBUG_WalkModref(DWORD p);
272 extern void DEBUG_DumpModule(DWORD mod);
273 extern void DEBUG_WalkModules(void);
274 extern void DEBUG_WalkProcess(void);
275 extern void DEBUG_DumpQueue(DWORD q);
276 extern void DEBUG_WalkQueues(void);
277 extern void DEBUG_InfoSegments(DWORD s, int v);
278 extern void DEBUG_InfoVirtual(void);
279 extern void DEBUG_InfoWindow(HWND hWnd);
280 extern void DEBUG_WalkWindows(HWND hWnd, int indent);
281
282   /* debugger/memory.c */
283 extern int DEBUG_ReadMemory( const DBG_ADDR *address );
284 extern void DEBUG_WriteMemory( const DBG_ADDR *address, int value );
285 extern void DEBUG_ExamineMemory( const DBG_ADDR *addr, int count, char format);
286 extern void DEBUG_InvalLinAddr( void* addr );
287 #ifdef __i386__
288 extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
289 extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
290 extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
291 extern BOOL DEBUG_FixSegment( DBG_ADDR* addr );
292 extern int  DEBUG_GetSelectorType( WORD sel );
293 extern int  DEBUG_IsSelectorSystem( WORD sel );
294 #endif
295
296   /* debugger/registers.c */
297 extern void DEBUG_SetRegister( enum debug_regs reg, int val );
298 extern int DEBUG_GetRegister( enum debug_regs reg );
299 extern void DEBUG_InfoRegisters(void);
300 extern BOOL DEBUG_ValidateRegisters(void);
301 extern int DEBUG_PrintRegister(enum debug_regs reg);
302
303   /* debugger/stack.c */
304 extern void DEBUG_InfoStack(void);
305 extern void DEBUG_BackTrace(BOOL noisy);
306 extern int  DEBUG_InfoLocals(void);
307 extern int  DEBUG_SetFrame(int newframe);
308 extern int  DEBUG_GetCurrentFrame(struct name_hash ** name, 
309                                   unsigned int * eip,
310                                   unsigned int * ebp);
311
312   /* debugger/stabs.c */
313 extern int DEBUG_ReadExecutableDbgInfo(void);
314 extern int DEBUG_ParseStabs(char * addr, unsigned int load_offset, unsigned int staboff, int stablen, unsigned int strtaboff, int strtablen);
315
316   /* debugger/msc.c */
317 extern int DEBUG_RegisterDebugInfo( HMODULE, const char *);
318 extern int DEBUG_ProcessDeferredDebug(void);
319 extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, const char * name);
320 extern void DEBUG_InfoShare(void);
321 extern void DEBUG_InitCVDataTypes(void);
322
323   /* debugger/types.c */
324 extern int DEBUG_nchar;
325 extern void DEBUG_InitTypes(void);
326 extern struct datatype * DEBUG_NewDataType(enum debug_type xtype, 
327                                            const char * typename);
328 extern unsigned int 
329 DEBUG_TypeDerefPointer(const DBG_ADDR * addr, struct datatype ** newtype);
330 extern int DEBUG_AddStructElement(struct datatype * dt, 
331                                   char * name, struct datatype * type, 
332                                   int offset, int size);
333 extern int DEBUG_SetStructSize(struct datatype * dt, int size);
334 extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
335 extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
336                                 struct datatype * dt2);
337 extern void DEBUG_Print( const DBG_ADDR *addr, int count, char format, int level );
338 extern unsigned int DEBUG_FindStructElement(DBG_ADDR * addr, 
339                                             const char * ele_name, int * tmpbuf);
340 extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
341 extern int DEBUG_GetObjectSize(struct datatype * dt);
342 extern unsigned int DEBUG_ArrayIndex(const DBG_ADDR * addr, DBG_ADDR * result, int index);
343 extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
344 extern long long int DEBUG_GetExprValue(const DBG_ADDR * addr, char ** format);
345 extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset, 
346                                    int nbits, struct datatype * dt2);
347 extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
348 extern enum debug_type DEBUG_GetType(struct datatype * dt);
349 extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
350 extern int DEBUG_PrintTypeCast(struct datatype *);
351
352   /* debugger/source.c */
353 extern void DEBUG_ShowDir(void);
354 extern void DEBUG_AddPath(const char * path);
355 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,  
356                        int delta);
357 extern void DEBUG_NukePath(void);
358 extern void DEBUG_Disassemble( const DBG_ADDR *, const DBG_ADDR*, int offset );
359
360   /* debugger/external.c */
361 extern void DEBUG_ExternalDebugger(void);
362
363   /* debugger/dbg.y */
364 extern void DEBUG_Exit( DWORD exit_code );
365 extern BOOL DEBUG_Main( BOOL is_debug, BOOL force );
366
367   /* Choose your allocator! */
368 #if 1
369 /* this one is libc's fast one */
370 extern void*    DEBUG_XMalloc(size_t size);
371 extern void*    DEBUG_XReAlloc(void *ptr, size_t size);
372 extern char*    DEBUG_XStrDup(const char *str);
373
374 #define DBG_alloc(x)            DEBUG_XMalloc(x)
375 #define DBG_realloc(x,y)        DEBUG_XReAlloc(x,y)
376 #define DBG_free(x)             free(x)
377 #define DBG_strdup(x)           DEBUG_XStrDup(x)
378 #else
379 /* this one is slow (takes 5 minutes to load the debugger on my machine),
380    but is pretty crash-proof (can step through malloc() without problems,
381    malloc() arena (and other heaps) can be totally wasted and it'll still
382    work, etc... if someone could make optimized routines so it wouldn't
383    take so long to load, it could be made default) */
384 #include "heap.h"
385 #define DBG_alloc(x) HEAP_xalloc(dbg_heap,0,x)
386 #define DBG_realloc(x,y) HEAP_xrealloc(dbg_heap,0,x,y)
387 #define DBG_free(x) HeapFree(dbg_heap,0,x)
388 #define DBG_strdup(x) HEAP_strdupA(dbg_heap,0,x)
389 #define DBG_need_heap
390 extern HANDLE dbg_heap;
391 #endif
392
393 #define         DEBUG_STATUS_NO_SYMBOL  0x80003000
394
395 #endif  /* __WINE_DEBUGGER_H */