Added atfork support.
[wine/multimedia.git] / debugger / debugger.h
blob9190b37afcc642d27da594652deca09be9008129
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 <assert.h>
12 #include "windef.h"
13 #include "winbase.h"
14 #include "wine/exception.h"
16 #ifdef __i386__
17 #define STEP_FLAG 0x00000100 /* single step flag */
18 #define V86_FLAG 0x00020000
19 #endif
21 #define SYM_FUNC 0x0
22 #define SYM_DATA 0x1
23 #define SYM_WIN32 0x2
24 #define SYM_WINE 0x4
25 #define SYM_INVALID 0x8
26 #define SYM_TRAMPOLINE 0x10
27 #define SYM_STEP_THROUGH 0x20
29 enum debug_type {DT_BASIC, DT_CONST, DT_POINTER, DT_ARRAY, DT_STRUCT, DT_ENUM, DT_TYPEDEF, DT_FUNC, DT_BITFIELD};
33 * Return values for DEBUG_CheckLinenoStatus. Used to determine
34 * what to do when the 'step' command is given.
36 #define FUNC_HAS_NO_LINES (0)
37 #define NOT_ON_LINENUMBER (1)
38 #define AT_LINENUMBER (2)
39 #define FUNC_IS_TRAMPOLINE (3)
42 * For constants generated by the parser, we use this datatype
44 extern struct datatype * DEBUG_TypeShortUInt;
45 extern struct datatype * DEBUG_TypeInt;
46 extern struct datatype * DEBUG_TypeIntConst;
47 extern struct datatype * DEBUG_TypeUSInt;
48 extern struct datatype * DEBUG_TypeString;
50 typedef struct
52 DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
53 DWORD off;
54 } DBG_ADDR;
56 #define DV_TARGET 0xF00D
57 #define DV_HOST 0x50DA
59 typedef struct
61 struct datatype* type;
62 int cookie; /* DV_??? */
63 DBG_ADDR addr;
64 } DBG_VALUE;
66 struct list_id
68 char * sourcefile;
69 int line;
72 struct wine_lines {
73 unsigned long line_number;
74 DBG_ADDR pc_offset;
77 struct symbol_info
79 struct name_hash * sym;
80 struct list_id list;
83 typedef struct wine_lines WineLineNo;
86 * This structure holds information about stack variables, function
87 * parameters, and register variables, which are all local to this
88 * function.
90 struct wine_locals {
91 unsigned int regno:8; /* For register symbols */
92 signed int offset:24; /* offset from esp/ebp to symbol */
93 unsigned int pc_start; /* For RBRAC/LBRAC */
94 unsigned int pc_end; /* For RBRAC/LBRAC */
95 char * name; /* Name of symbol */
96 struct datatype * type; /* Datatype of symbol */
99 typedef struct wine_locals WineLocals;
101 enum exec_mode
103 EXEC_CONT, /* Continuous execution */
104 EXEC_PASS, /* Continue, passing exception to app */
105 EXEC_STEP_OVER, /* Stepping over a call to next source line */
106 EXEC_STEP_INSTR, /* Step to next source line, stepping in if needed */
107 EXEC_STEPI_OVER, /* Stepping over a call */
108 EXEC_STEPI_INSTR, /* Single-stepping an instruction */
109 EXEC_FINISH, /* Step until we exit current frame */
110 EXEC_STEP_OVER_TRAMPOLINE, /* Step over trampoline. Requires that
111 * we dig the real return value off the stack
112 * and set breakpoint there - not at the
113 * instr just after the call.
115 EXEC_KILL /* terminate debugging session */
118 #define DBG_BREAK 0
119 #define DBG_WATCH 1
121 typedef struct
123 DBG_ADDR addr;
124 WORD enabled : 1,
125 type : 1,
126 is32 : 1,
127 refcount : 13;
128 WORD skipcount;
129 union {
130 BYTE opcode;
131 struct {
132 BYTE rw : 1,
133 len : 2;
134 BYTE reg;
135 DWORD oldval;
136 } w;
137 } u;
138 struct expr * condition;
139 } DBG_BREAKPOINT;
141 typedef struct tagDBG_THREAD {
142 struct tagDBG_PROCESS* process;
143 HANDLE handle;
144 DWORD tid;
145 LPVOID start;
146 LPVOID teb;
147 int wait_for_first_exception;
148 int dbg_mode;
149 enum exec_mode dbg_exec_mode;
150 int dbg_exec_count;
151 DBG_BREAKPOINT stepOverBP;
152 struct tagDBG_THREAD* next;
153 struct tagDBG_THREAD* prev;
154 } DBG_THREAD;
156 typedef struct tagDBG_PROCESS {
157 HANDLE handle;
158 DWORD pid;
159 DBG_THREAD* threads;
160 int num_threads;
161 struct tagDBG_MODULE* modules;
163 * This is an index we use to keep track of the debug information
164 * when we have multiple sources. We use the same database to also
165 * allow us to do an 'info shared' type of deal, and we use the index
166 * to eliminate duplicates.
168 int next_index;
169 struct tagDBG_PROCESS* next;
170 struct tagDBG_PROCESS* prev;
171 } DBG_PROCESS;
173 extern DBG_PROCESS* DEBUG_CurrProcess;
174 extern DBG_THREAD* DEBUG_CurrThread;
175 extern CONTEXT DEBUG_context;
177 #define DEBUG_READ_MEM(addr, buf, len) \
178 (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
180 #define DEBUG_WRITE_MEM(addr, buf, len) \
181 (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
183 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
184 (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
186 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
187 (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
189 typedef struct tagDBG_MODULE {
190 struct tagDBG_MODULE* next;
191 void* load_addr;
192 char* module_name;
193 char status;
194 char type;
195 short int dbg_index;
196 HMODULE handle;
197 void* extra_info;
198 } DBG_MODULE;
200 /* status field */
201 #define DM_STATUS_NEW 0
202 #define DM_STATUS_LOADED 1
203 #define DM_STATUS_ERROR 2
205 /* type field */
206 #define DM_TYPE_UNKNOWN 0
207 #define DM_TYPE_ELF 1
208 #define DM_TYPE_NE 2
209 #define DM_TYPE_PE 3
211 typedef struct {
212 DWORD val;
213 const char* name;
214 LPDWORD pval;
215 struct datatype* type;
216 } DBG_INTVAR;
218 #define OFFSET_OF(__c,__f) ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
220 /* debugger/break.c */
221 extern void DEBUG_SetBreakpoints( BOOL set );
222 extern void DEBUG_AddBreakpoint( const DBG_VALUE *addr );
223 extern void DEBUG_AddWatchpoint( const DBG_VALUE *addr, int is_write );
224 extern void DEBUG_DelBreakpoint( int num );
225 extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
226 extern void DEBUG_InfoBreakpoints(void);
227 extern BOOL DEBUG_HandleTrap(void);
228 extern BOOL DEBUG_ShouldContinue( DWORD code, enum exec_mode mode, int * count );
229 extern void DEBUG_SuspendExecution( void );
230 extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
231 extern BOOL DEBUG_IsFctReturn(void);
232 extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
234 /* debugger/db_disasm.c */
235 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
237 /* debugger/dbg.y */
238 extern BOOL DEBUG_Main( BOOL is_debug, BOOL force, DWORD code );
239 extern void DEBUG_Exit( DWORD );
241 /* debugger/debug.l */
242 extern void flush_symbols(void);
244 /* debugger/display.c */
245 extern int DEBUG_DoDisplay(void);
246 extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
247 extern int DEBUG_DoDisplay(void);
248 extern int DEBUG_DelDisplay(int displaynum);
249 extern int DEBUG_InfoDisplay(void);
251 /* debugger/editline.c */
252 extern char * readline(const char *);
253 extern void add_history(char *);
255 /* debugger/expr.c */
256 extern void DEBUG_FreeExprMem(void);
257 struct expr * DEBUG_IntVarExpr(const char* name);
258 struct expr * DEBUG_SymbolExpr(const char * name);
259 struct expr * DEBUG_ConstExpr(int val);
260 struct expr * DEBUG_StringExpr(const char * str);
261 struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
262 struct expr * DEBUG_USConstExpr(unsigned int val);
263 struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
264 struct expr * DEBUG_UnopExpr(int oper, struct expr *);
265 struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
266 struct expr * DEBUG_StructExpr(struct expr *, const char * element);
267 struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
268 struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
269 struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
270 extern DBG_VALUE DEBUG_EvalExpr(struct expr *);
271 extern int DEBUG_DelDisplay(int displaynum);
272 extern struct expr * DEBUG_CloneExpr(const struct expr * exp);
273 extern int DEBUG_FreeExpr(struct expr * exp);
274 extern int DEBUG_DisplayExpr(const struct expr * exp);
276 /* debugger/external.c */
277 extern void DEBUG_ExternalDebugger(void);
279 /* debugger/hash.c */
280 extern struct name_hash * DEBUG_AddSymbol( const char *name,
281 const DBG_VALUE *addr,
282 const char *sourcefile,
283 int flags);
284 extern BOOL DEBUG_GetSymbolValue( const char * name, const int lineno,
285 DBG_VALUE *addr, int );
286 extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_VALUE *addr );
287 extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
288 struct name_hash ** rtn,
289 unsigned int ebp,
290 struct list_id * source);
291 extern void DEBUG_ReadSymbolTable( const char * filename );
292 extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
293 unsigned long offset );
294 extern struct wine_locals *
295 DEBUG_AddLocal( struct name_hash * func, int regno,
296 int offset,
297 int pc_start,
298 int pc_end,
299 char * name);
300 extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
301 extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file,
302 const char * func);
303 extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
304 extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
305 extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
306 extern int DEBUG_cmp_sym(const void * p1, const void * p2);
307 extern BOOL DEBUG_GetLineNumberAddr( struct name_hash *, const int lineno,
308 DBG_ADDR *addr, int bp_flag );
310 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
311 struct datatype * type);
312 extern BOOL DEBUG_Normalize(struct name_hash * nh );
314 /* debugger/info.c */
315 extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
316 extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
317 int addrlen, int flag );
318 extern void DEBUG_Help(void);
319 extern void DEBUG_HelpInfo(void);
320 extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
321 int addrlen,
322 unsigned int ebp,
323 int flag );
324 extern void DEBUG_InfoClass(const char* clsName);
325 extern void DEBUG_WalkClasses(void);
326 extern void DEBUG_WalkModref(DWORD p);
327 extern void DEBUG_DumpModule(DWORD mod);
328 extern void DEBUG_WalkModules(void);
329 extern void DEBUG_WalkProcess(void);
330 extern void DEBUG_WalkThreads(void);
331 extern void DEBUG_DumpQueue(DWORD q);
332 extern void DEBUG_WalkQueues(void);
333 extern void DEBUG_InfoSegments(DWORD s, int v);
334 extern void DEBUG_InfoVirtual(void);
335 extern void DEBUG_InfoWindow(HWND hWnd);
336 extern void DEBUG_WalkWindows(HWND hWnd, int indent);
338 /* debugger/memory.c */
339 extern int DEBUG_ReadMemory( const DBG_VALUE* value );
340 extern void DEBUG_WriteMemory( const DBG_VALUE* val, int value );
341 extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
342 extern void DEBUG_InvalAddr( const DBG_ADDR* addr );
343 extern void DEBUG_InvalLinAddr( void* addr );
344 #ifdef __i386__
345 extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
346 extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
347 extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
348 extern BOOL DEBUG_FixSegment( DBG_ADDR* addr );
349 extern int DEBUG_GetSelectorType( WORD sel );
350 extern int DEBUG_IsSelectorSystem( WORD sel );
351 #endif
353 /* debugger/module.c */
354 extern int DEBUG_LoadEntryPoints( const char * prefix );
355 extern void DEBUG_LoadModule32( const char* name, HANDLE hFile, DWORD base );
356 extern DBG_MODULE* DEBUG_AddModule(const char* name, int type,
357 void* mod_addr, HMODULE hmod);
358 extern DBG_MODULE* DEBUG_FindModuleByName(const char* name, int type);
359 extern DBG_MODULE* DEBUG_FindModuleByHandle(HANDLE handle, int type);
360 extern DBG_MODULE* DEBUG_RegisterPEModule(HMODULE, u_long load_addr, const char* name);
361 extern DBG_MODULE* DEBUG_RegisterELFModule(u_long load_addr, const char* name);
362 extern void DEBUG_InfoShare(void);
364 /* debugger/msc.c */
365 extern int DEBUG_RegisterMSCDebugInfo(DBG_MODULE* module, HANDLE hFile, void* nth, unsigned long nth_ofs);
366 extern int DEBUG_RegisterStabsDebugInfo(DBG_MODULE* module, HANDLE hFile, void* nth, unsigned long nth_ofs);
367 extern void DEBUG_InitCVDataTypes(void);
369 /* debugger/registers.c */
370 extern void DEBUG_InfoRegisters(void);
371 extern BOOL DEBUG_ValidateRegisters(void);
373 /* debugger/stack.c */
374 extern void DEBUG_InfoStack(void);
375 extern void DEBUG_BackTrace(BOOL noisy);
376 extern int DEBUG_InfoLocals(void);
377 extern int DEBUG_SetFrame(int newframe);
378 extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
379 unsigned int * eip,
380 unsigned int * ebp);
382 /* debugger/stabs.c */
383 extern int DEBUG_ReadExecutableDbgInfo(const char* exe_name);
384 extern int DEBUG_ProcessElfObject(const char* filename, unsigned int load_offset);
385 extern int DEBUG_ParseStabs(char * addr, unsigned int load_offset, unsigned int staboff,
386 int stablen, unsigned int strtaboff, int strtablen);
388 /* debugger/types.c */
389 extern int DEBUG_nchar;
390 extern void DEBUG_InitTypes(void);
391 extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
392 const char * typename);
393 extern unsigned int DEBUG_TypeDerefPointer(const DBG_VALUE *value, struct datatype ** newtype);
394 extern int DEBUG_AddStructElement(struct datatype * dt,
395 char * name, struct datatype * type,
396 int offset, int size);
397 extern int DEBUG_SetStructSize(struct datatype * dt, int size);
398 extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
399 extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
400 struct datatype * dt2);
401 extern void DEBUG_Print( const DBG_VALUE *addr, int count, char format, int level );
402 extern unsigned int DEBUG_FindStructElement(DBG_VALUE * addr,
403 const char * ele_name, int * tmpbuf);
404 extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
405 extern int DEBUG_GetObjectSize(struct datatype * dt);
406 extern unsigned int DEBUG_ArrayIndex(const DBG_VALUE * addr, DBG_VALUE * result, int index);
407 extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
408 extern long long int DEBUG_GetExprValue(const DBG_VALUE * addr, char ** format);
409 extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
410 int nbits, struct datatype * dt2);
411 extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
412 extern enum debug_type DEBUG_GetType(struct datatype * dt);
413 extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
414 extern int DEBUG_PrintTypeCast(const struct datatype *);
415 extern int DEBUG_PrintType( const DBG_VALUE* addr );
417 /* debugger/source.c */
418 extern void DEBUG_ShowDir(void);
419 extern void DEBUG_AddPath(const char * path);
420 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
421 int delta);
422 extern void DEBUG_NukePath(void);
423 extern void DEBUG_Disassemble( const DBG_VALUE *, const DBG_VALUE*, int offset );
425 /* debugger/winedbg.c */
426 #define DBG_CHN_MESG 1
427 #define DBG_CHN_ERR 2
428 #define DBG_CHN_WARN 4
429 #define DBG_CHN_FIXME 8
430 #define DBG_CHN_TRACE 16
431 extern void DEBUG_Output(int chn, const char* buffer, int len);
432 extern int DEBUG_Printf(int chn, const char* format, ...);
433 extern DBG_INTVAR* DEBUG_GetIntVar(const char*);
435 /* Choose your allocator! */
436 #if 1
437 /* this one is libc's fast one */
438 extern void* DEBUG_XMalloc(size_t size);
439 extern void* DEBUG_XReAlloc(void *ptr, size_t size);
440 extern char* DEBUG_XStrDup(const char *str);
442 #define DBG_alloc(x) DEBUG_XMalloc(x)
443 #define DBG_realloc(x,y) DEBUG_XReAlloc(x,y)
444 #define DBG_free(x) free(x)
445 #define DBG_strdup(x) DEBUG_XStrDup(x)
446 #else
447 /* this one is slow (takes 5 minutes to load the debugger on my machine),
448 but is pretty crash-proof (can step through malloc() without problems,
449 malloc() arena (and other heaps) can be totally wasted and it'll still
450 work, etc... if someone could make optimized routines so it wouldn't
451 take so long to load, it could be made default) */
452 #include "heap.h"
453 #define DBG_alloc(x) HeapAlloc(dbg_heap,0,x)
454 #define DBG_realloc(x,y) HeapRealloc(dbg_heap,0,x,y)
455 #define DBG_free(x) HeapFree(dbg_heap,0,x)
456 #define DBG_strdup(x) HEAP_strdupA(dbg_heap,0,x)
457 #define DBG_need_heap
458 extern HANDLE dbg_heap;
459 #endif
461 #define DEBUG_STATUS_OFFSET 0x80003000
462 #define DEBUG_STATUS_INTERNAL_ERROR (DEBUG_STATUS_OFFSET+0)
463 #define DEBUG_STATUS_NO_SYMBOL (DEBUG_STATUS_OFFSET+1)
464 #define DEBUG_STATUS_DIV_BY_ZERO (DEBUG_STATUS_OFFSET+2)
465 #define DEBUG_STATUS_BAD_TYPE (DEBUG_STATUS_OFFSET+3)
467 extern DBG_INTVAR DEBUG_IntVars[];
469 #define DBG_IVARNAME(_var) DEBUG_IV_##_var
470 #define DBG_IVARSTRUCT(_var) DEBUG_IntVars[DBG_IVARNAME(_var)]
471 #define DBG_IVAR(_var) (*(DBG_IVARSTRUCT(_var).pval))
472 #define INTERNAL_VAR(_var,_val,_ref,_typ) DBG_IVARNAME(_var),
473 enum debug_int_var {
474 #include "intvar.h"
475 DBG_IV_LAST
477 #undef INTERNAL_VAR
479 #endif /* __WINE_DEBUGGER_H */