Added winemine app.
[wine.git] / debugger / debugger.h
blob1f3d02c6a167452ed1187715c333c204fad5ec47
1 /*
2 * Debugger definitions
4 * Copyright 1995 Alexandre Julliard
5 */
7 #ifndef __WINE_DEBUGGER_H
8 #define __WINE_DEBUGGER_H
10 #include <sys/types.h> /* u_long ... */
11 #include "windef.h"
12 #include "winbase.h"
14 #ifdef __i386__
15 #define STEP_FLAG 0x100 /* single step flag */
16 #define V86_FLAG 0x00020000
17 #endif
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
27 enum debug_type {DT_BASIC, DT_CONST, DT_POINTER, DT_ARRAY, DT_STRUCT, DT_ENUM, DT_TYPEDEF, DT_FUNC, DT_BITFIELD};
31 * Return values for DEBUG_CheckLinenoStatus. Used to determine
32 * what to do when the 'step' command is given.
34 #define FUNC_HAS_NO_LINES (0)
35 #define NOT_ON_LINENUMBER (1)
36 #define AT_LINENUMBER (2)
37 #define FUNC_IS_TRAMPOLINE (3)
40 * For constants generated by the parser, we use this datatype
42 extern struct datatype * DEBUG_TypeInt;
43 extern struct datatype * DEBUG_TypeIntConst;
44 extern struct datatype * DEBUG_TypeUSInt;
45 extern struct datatype * DEBUG_TypeString;
47 typedef struct
49 struct datatype * type;
50 DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
51 DWORD off;
52 } DBG_ADDR;
54 struct list_id
56 char * sourcefile;
57 int line;
60 struct wine_lines {
61 unsigned long line_number;
62 DBG_ADDR pc_offset;
65 struct symbol_info
67 struct name_hash * sym;
68 struct list_id list;
71 typedef struct wine_lines WineLineNo;
74 * This structure holds information about stack variables, function
75 * parameters, and register variables, which are all local to this
76 * function.
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 */
87 typedef struct wine_locals WineLocals;
89 enum exec_mode
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.
105 typedef struct
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;
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;
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;
139 extern WINE_DBG_PROCESS* DEBUG_CurrProcess;
140 extern WINE_DBG_THREAD* DEBUG_CurrThread;
141 extern CONTEXT DEBUG_context;
143 #define DEBUG_READ_MEM(addr, buf, len) \
144 (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
146 #define DEBUG_WRITE_MEM(addr, buf, len) \
147 (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
149 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
150 (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
152 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
153 (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
155 #ifdef __i386__
156 #ifdef REG_SP /* Some Sun includes define this */
157 #undef REG_SP
158 #endif
160 enum debug_regs
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
168 #endif
170 #define OFFSET_OF(__c,__f) ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
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( DWORD code, 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);
185 /* debugger/db_disasm.c */
186 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
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);
210 /* more debugger/break.c */
211 extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
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);
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 );
255 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
256 struct datatype * type);
257 BOOL DEBUG_Normalize(struct name_hash * nh );
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);
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
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);
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);
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);
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);
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 *);
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 );
360 /* debugger/external.c */
361 extern void DEBUG_ExternalDebugger(void);
363 /* debugger/dbg.y */
364 extern void DEBUG_Exit( DWORD exit_code );
365 extern BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code );
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);
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
393 #define DEBUG_STATUS_NO_SYMBOL 0x80003000
395 #endif /* __WINE_DEBUGGER_H */