PDB symbol header format depends only on version code.
[wine/dcerpc.git] / debugger / debugger.h
blobbf860a7980b7638cd25501d2932519f069dda84f
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 typedef struct
58 struct datatype* type;
59 int cookie; /* DV_??? */
60 /* DV_TARGET references an address in debugger's address space, whereas DV_HOST
61 * references the debuggee address space
63 # define DV_TARGET 0xF00D
64 # define DV_HOST 0x50DA
65 # define DV_INVALID 0x0000
67 DBG_ADDR addr;
68 } DBG_VALUE;
70 struct list_id
72 char * sourcefile;
73 int line;
76 struct wine_lines {
77 unsigned long line_number;
78 DBG_ADDR pc_offset;
81 struct symbol_info
83 struct name_hash * sym;
84 struct list_id list;
87 typedef struct wine_lines WineLineNo;
90 * This structure holds information about stack variables, function
91 * parameters, and register variables, which are all local to this
92 * function.
94 struct wine_locals {
95 unsigned int regno:8; /* For register symbols */
96 signed int offset:24; /* offset from esp/ebp to symbol */
97 unsigned int pc_start; /* For RBRAC/LBRAC */
98 unsigned int pc_end; /* For RBRAC/LBRAC */
99 char * name; /* Name of symbol */
100 struct datatype * type; /* Datatype of symbol */
103 typedef struct wine_locals WineLocals;
105 enum exec_mode
107 EXEC_CONT, /* Continuous execution */
108 EXEC_PASS, /* Continue, passing exception to app */
109 EXEC_STEP_OVER, /* Stepping over a call to next source line */
110 EXEC_STEP_INSTR, /* Step to next source line, stepping in if needed */
111 EXEC_STEPI_OVER, /* Stepping over a call */
112 EXEC_STEPI_INSTR, /* Single-stepping an instruction */
113 EXEC_FINISH, /* Step until we exit current frame */
114 EXEC_STEP_OVER_TRAMPOLINE, /* Step over trampoline. Requires that
115 * we dig the real return value off the stack
116 * and set breakpoint there - not at the
117 * instr just after the call.
121 #define DBG_BREAK 0
122 #define DBG_WATCH 1
124 typedef struct
126 DBG_ADDR addr;
127 WORD enabled : 1,
128 type : 1,
129 is32 : 1,
130 refcount : 13;
131 WORD skipcount;
132 union {
133 struct {
134 BYTE opcode;
135 BOOL (*func)(void);
136 } b;
137 struct {
138 BYTE rw : 1,
139 len : 2;
140 BYTE reg;
141 DWORD oldval;
142 } w;
143 } u;
144 struct expr * condition;
145 } DBG_BREAKPOINT;
147 enum dbg_mode
149 MODE_INVALID, MODE_16, MODE_32, MODE_VM86
152 typedef struct tagDBG_THREAD {
153 struct tagDBG_PROCESS* process;
154 HANDLE handle;
155 DWORD tid;
156 LPVOID start;
157 LPVOID teb;
158 int wait_for_first_exception;
159 enum dbg_mode dbg_mode;
160 enum exec_mode dbg_exec_mode;
161 int dbg_exec_count;
162 DBG_BREAKPOINT stepOverBP;
163 struct tagDBG_THREAD* next;
164 struct tagDBG_THREAD* prev;
165 } DBG_THREAD;
167 typedef struct tagDBG_PROCESS {
168 HANDLE handle;
169 DWORD pid;
170 DBG_THREAD* threads;
171 int num_threads;
172 unsigned continue_on_first_exception;
173 struct tagDBG_MODULE* modules;
174 unsigned long dbg_hdr_addr;
176 * This is an index we use to keep track of the debug information
177 * when we have multiple sources. We use the same database to also
178 * allow us to do an 'info shared' type of deal, and we use the index
179 * to eliminate duplicates.
181 int next_index;
182 struct tagDBG_PROCESS* next;
183 struct tagDBG_PROCESS* prev;
184 } DBG_PROCESS;
186 extern DBG_PROCESS* DEBUG_CurrProcess;
187 extern DBG_THREAD* DEBUG_CurrThread;
188 extern DWORD DEBUG_CurrTid;
189 extern DWORD DEBUG_CurrPid;
190 extern CONTEXT DEBUG_context;
192 #define DEBUG_READ_MEM(addr, buf, len) \
193 (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
195 #define DEBUG_WRITE_MEM(addr, buf, len) \
196 (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
198 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
199 (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
201 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
202 (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
204 typedef struct tagDBG_MODULE {
205 struct tagDBG_MODULE* next;
206 void* load_addr;
207 char* module_name;
208 char status;
209 char type;
210 short int dbg_index;
211 HMODULE handle;
212 void* extra_info;
213 } DBG_MODULE;
215 /* status field */
216 #define DM_STATUS_NEW 0
217 #define DM_STATUS_LOADED 1
218 #define DM_STATUS_ERROR 2
220 /* type field */
221 #define DM_TYPE_UNKNOWN 0
222 #define DM_TYPE_ELF 1
223 #define DM_TYPE_NE 2
224 #define DM_TYPE_PE 3
226 typedef struct {
227 DWORD val;
228 const char* name;
229 LPDWORD pval;
230 struct datatype* type;
231 } DBG_INTVAR;
233 #define OFFSET_OF(__c,__f) ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
235 /* from winelib.so */
236 extern void DEBUG_ExternalDebugger(void);
238 /* debugger/break.c */
239 extern void DEBUG_SetBreakpoints( BOOL set );
240 extern void DEBUG_AddBreakpoint( const DBG_VALUE *addr, BOOL (*func)(void) );
241 extern void DEBUG_AddBreakpointFromId( const char *name, int lineno );
242 extern void DEBUG_AddBreakpointFromLineno( int lineno );
243 extern void DEBUG_AddWatchpoint( const DBG_VALUE *addr, int is_write );
244 extern void DEBUG_AddWatchpointFromId( const char *name, int lineno );
245 extern void DEBUG_DelBreakpoint( int num );
246 extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
247 extern void DEBUG_InfoBreakpoints(void);
248 extern BOOL DEBUG_HandleTrap(void);
249 extern BOOL DEBUG_ShouldContinue( DBG_ADDR *addr, DWORD code, enum exec_mode mode, int * count );
250 extern void DEBUG_SuspendExecution( void );
251 extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
252 extern BOOL DEBUG_IsFctReturn(void);
253 extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
255 /* debugger/db_disasm.c */
256 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
258 /* debugger/dbg.y */
259 extern BOOL DEBUG_Parser(void);
260 extern void DEBUG_Exit( DWORD );
262 /* debugger/debug.l */
263 extern void DEBUG_FlushSymbols(void);
265 /* debugger/display.c */
266 extern int DEBUG_DoDisplay(void);
267 extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
268 extern int DEBUG_DoDisplay(void);
269 extern int DEBUG_DelDisplay(int displaynum);
270 extern int DEBUG_InfoDisplay(void);
272 /* debugger/editline.c */
273 extern char * readline(const char *);
274 extern void add_history(char *);
276 /* debugger/expr.c */
277 extern void DEBUG_FreeExprMem(void);
278 struct expr * DEBUG_IntVarExpr(const char* name);
279 struct expr * DEBUG_SymbolExpr(const char * name);
280 struct expr * DEBUG_ConstExpr(int val);
281 struct expr * DEBUG_StringExpr(const char * str);
282 struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
283 struct expr * DEBUG_USConstExpr(unsigned int val);
284 struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
285 struct expr * DEBUG_UnopExpr(int oper, struct expr *);
286 struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
287 struct expr * DEBUG_StructExpr(struct expr *, const char * element);
288 struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
289 struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
290 struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
291 extern DBG_VALUE DEBUG_EvalExpr(struct expr *);
292 extern int DEBUG_DelDisplay(int displaynum);
293 extern struct expr * DEBUG_CloneExpr(const struct expr * exp);
294 extern int DEBUG_FreeExpr(struct expr * exp);
295 extern int DEBUG_DisplayExpr(const struct expr * exp);
297 /* debugger/hash.c */
298 extern struct name_hash * DEBUG_AddSymbol( const char *name,
299 const DBG_VALUE *addr,
300 const char *sourcefile,
301 int flags);
302 extern BOOL DEBUG_GetSymbolValue( const char * name, const int lineno,
303 DBG_VALUE *addr, int );
304 extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_VALUE *addr );
305 extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
306 struct name_hash ** rtn,
307 unsigned int ebp,
308 struct list_id * source);
309 extern void DEBUG_ReadSymbolTable( const char * filename );
310 extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
311 unsigned long offset );
312 extern struct wine_locals *
313 DEBUG_AddLocal( struct name_hash * func, int regno,
314 int offset,
315 int pc_start,
316 int pc_end,
317 char * name);
318 extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
319 extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file,
320 const char * func);
321 extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
322 extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
323 extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
324 extern int DEBUG_cmp_sym(const void * p1, const void * p2);
325 extern BOOL DEBUG_GetLineNumberAddr( struct name_hash *, const int lineno,
326 DBG_ADDR *addr, int bp_flag );
328 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
329 struct datatype * type);
330 extern BOOL DEBUG_Normalize(struct name_hash * nh );
332 /* debugger/info.c */
333 extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
334 extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr, enum dbg_mode mode, int flag );
335 extern void DEBUG_Help(void);
336 extern void DEBUG_HelpInfo(void);
337 extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
338 enum dbg_mode mode,
339 unsigned int ebp,
340 int flag );
341 extern void DEBUG_InfoClass(const char* clsName);
342 extern void DEBUG_WalkClasses(void);
343 extern void DEBUG_WalkModref(DWORD p);
344 extern void DEBUG_DumpModule(DWORD mod);
345 extern void DEBUG_WalkModules(void);
346 extern void DEBUG_WalkProcess(void);
347 extern void DEBUG_WalkThreads(void);
348 extern void DEBUG_DumpQueue(DWORD q);
349 extern void DEBUG_WalkQueues(void);
350 extern void DEBUG_InfoSegments(DWORD s, int v);
351 extern void DEBUG_InfoVirtual(void);
352 extern void DEBUG_InfoWindow(HWND hWnd);
353 extern void DEBUG_WalkWindows(HWND hWnd, int indent);
355 /* debugger/memory.c */
356 extern int DEBUG_ReadMemory( const DBG_VALUE* value );
357 extern void DEBUG_WriteMemory( const DBG_VALUE* val, int value );
358 extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
359 extern void DEBUG_InvalAddr( const DBG_ADDR* addr );
360 extern void DEBUG_InvalLinAddr( void* addr );
361 extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
362 extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
363 extern BOOL DEBUG_GrabAddress( DBG_VALUE* value, BOOL fromCode );
364 extern enum dbg_mode DEBUG_GetSelectorType( WORD sel );
365 #ifdef __i386__
366 extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
367 extern int DEBUG_IsSelectorSystem( WORD sel );
368 #endif
370 /* debugger/module.c */
371 extern int DEBUG_LoadEntryPoints( const char * prefix );
372 extern void DEBUG_LoadModule32( const char* name, HANDLE hFile, DWORD base );
373 extern DBG_MODULE* DEBUG_AddModule(const char* name, int type,
374 void* mod_addr, HMODULE hmod);
375 extern DBG_MODULE* DEBUG_FindModuleByName(const char* name, int type);
376 extern DBG_MODULE* DEBUG_FindModuleByHandle(HANDLE handle, int type);
377 extern DBG_MODULE* DEBUG_GetProcessMainModule(DBG_PROCESS* process);
378 extern DBG_MODULE* DEBUG_RegisterPEModule(HMODULE, u_long load_addr, const char* name);
379 extern DBG_MODULE* DEBUG_RegisterELFModule(u_long load_addr, const char* name);
380 extern void DEBUG_InfoShare(void);
382 /* debugger/msc.c */
383 extern int DEBUG_RegisterMSCDebugInfo(DBG_MODULE* module, HANDLE hFile, void* nth, unsigned long nth_ofs);
384 extern int DEBUG_RegisterStabsDebugInfo(DBG_MODULE* module, HANDLE hFile, void* nth, unsigned long nth_ofs);
385 extern void DEBUG_InitCVDataTypes(void);
387 /* debugger/registers.c */
388 extern void DEBUG_InfoRegisters(void);
389 extern BOOL DEBUG_ValidateRegisters(void);
391 /* debugger/source.c */
392 extern void DEBUG_ShowDir(void);
393 extern void DEBUG_AddPath(const char * path);
394 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
395 int delta);
396 extern void DEBUG_NukePath(void);
397 extern void DEBUG_Disassemble(const DBG_VALUE *, const DBG_VALUE*, int offset);
398 extern BOOL DEBUG_DisassembleInstruction(DBG_ADDR *addr);
400 /* debugger/stack.c */
401 extern void DEBUG_InfoStack(void);
402 extern void DEBUG_BackTrace(BOOL noisy);
403 extern int DEBUG_InfoLocals(void);
404 extern int DEBUG_SetFrame(int newframe);
405 extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
406 unsigned int * eip,
407 unsigned int * ebp);
409 /* debugger/stabs.c */
410 extern int DEBUG_ReadExecutableDbgInfo(const char* exe_name);
411 extern int DEBUG_ParseStabs(char * addr, unsigned int load_offset, unsigned int staboff,
412 int stablen, unsigned int strtaboff, int strtablen);
414 /* debugger/types.c */
415 extern int DEBUG_nchar;
416 extern void DEBUG_InitTypes(void);
417 extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
418 const char * typename);
419 extern unsigned int DEBUG_TypeDerefPointer(const DBG_VALUE *value, struct datatype ** newtype);
420 extern int DEBUG_AddStructElement(struct datatype * dt,
421 char * name, struct datatype * type,
422 int offset, int size);
423 extern int DEBUG_SetStructSize(struct datatype * dt, int size);
424 extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
425 extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
426 struct datatype * dt2);
427 extern void DEBUG_Print( const DBG_VALUE *addr, int count, char format, int level );
428 extern unsigned int DEBUG_FindStructElement(DBG_VALUE * addr,
429 const char * ele_name, int * tmpbuf);
430 extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
431 extern int DEBUG_GetObjectSize(struct datatype * dt);
432 extern unsigned int DEBUG_ArrayIndex(const DBG_VALUE * addr, DBG_VALUE * result, int index);
433 extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
434 extern long long int DEBUG_GetExprValue(const DBG_VALUE * addr, char ** format);
435 extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
436 int nbits, struct datatype * dt2);
437 extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
438 extern enum debug_type DEBUG_GetType(struct datatype * dt);
439 extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
440 extern int DEBUG_PrintTypeCast(const struct datatype *);
441 extern int DEBUG_PrintType( const DBG_VALUE* addr );
443 /* debugger/winedbg.c */
444 #define DBG_CHN_MESG 1
445 #define DBG_CHN_ERR 2
446 #define DBG_CHN_WARN 4
447 #define DBG_CHN_FIXME 8
448 #define DBG_CHN_TRACE 16
449 extern void DEBUG_Output(int chn, const char* buffer, int len);
450 #ifdef __GNUC__
451 extern int DEBUG_Printf(int chn, const char* format, ...) __attribute__((format (printf,2,3)));
452 #else
453 extern int DEBUG_Printf(int chn, const char* format, ...);
454 #endif
455 extern DBG_INTVAR* DEBUG_GetIntVar(const char*);
456 extern BOOL DEBUG_Attach(DWORD pid, BOOL cofe);
457 extern void DEBUG_Run(const char* args);
458 extern int curr_frame;
460 /* Choose your allocator! */
461 #if 1
462 /* this one is libc's fast one */
463 extern void* DEBUG_XMalloc(size_t size);
464 extern void* DEBUG_XReAlloc(void *ptr, size_t size);
465 extern char* DEBUG_XStrDup(const char *str);
467 #define DBG_alloc(x) DEBUG_XMalloc(x)
468 #define DBG_realloc(x,y) DEBUG_XReAlloc(x,y)
469 #define DBG_free(x) free(x)
470 #define DBG_strdup(x) DEBUG_XStrDup(x)
471 #else
472 /* this one is slow (takes 5 minutes to load the debugger on my machine),
473 but is pretty crash-proof (can step through malloc() without problems,
474 malloc() arena (and other heaps) can be totally wasted and it'll still
475 work, etc... if someone could make optimized routines so it wouldn't
476 take so long to load, it could be made default) */
477 #include "heap.h"
478 #define DBG_alloc(x) HeapAlloc(dbg_heap,0,x)
479 #define DBG_realloc(x,y) HeapRealloc(dbg_heap,0,x,y)
480 #define DBG_free(x) HeapFree(dbg_heap,0,x)
481 #define DBG_strdup(x) HEAP_strdupA(dbg_heap,0,x)
482 #define DBG_need_heap
483 extern HANDLE dbg_heap;
484 #endif
486 #define DEBUG_STATUS_OFFSET 0x80003000
487 #define DEBUG_STATUS_INTERNAL_ERROR (DEBUG_STATUS_OFFSET+0)
488 #define DEBUG_STATUS_NO_SYMBOL (DEBUG_STATUS_OFFSET+1)
489 #define DEBUG_STATUS_DIV_BY_ZERO (DEBUG_STATUS_OFFSET+2)
490 #define DEBUG_STATUS_BAD_TYPE (DEBUG_STATUS_OFFSET+3)
492 extern DBG_INTVAR DEBUG_IntVars[];
494 #define DBG_IVARNAME(_var) DEBUG_IV_##_var
495 #define DBG_IVARSTRUCT(_var) DEBUG_IntVars[DBG_IVARNAME(_var)]
496 #define DBG_IVAR(_var) (*(DBG_IVARSTRUCT(_var).pval))
497 #define INTERNAL_VAR(_var,_val,_ref,_typ) DBG_IVARNAME(_var),
498 enum debug_int_var {
499 #include "intvar.h"
500 DBG_IV_LAST
502 #undef INTERNAL_VAR
504 #endif /* __WINE_DEBUGGER_H */