4 * Copyright 1995 Alexandre Julliard
7 #ifndef __WINE_DEBUGGER_H
8 #define __WINE_DEBUGGER_H
10 #include <sys/types.h> /* u_long ... */
14 #include "wine/exception.h"
17 #define STEP_FLAG 0x00000100 /* single step flag */
18 #define V86_FLAG 0x00020000
25 #define SYM_INVALID 0x8
26 #define SYM_TRAMPOLINE 0x10
27 #define SYM_STEP_THROUGH 0x20
29 enum debug_type {DT_BASIC, DT_POINTER, DT_ARRAY, DT_STRUCT, DT_ENUM,
30 DT_FUNC, DT_BITFIELD};
34 * Return values for DEBUG_CheckLinenoStatus. Used to determine
35 * what to do when the 'step' command is given.
37 #define FUNC_HAS_NO_LINES (0)
38 #define NOT_ON_LINENUMBER (1)
39 #define AT_LINENUMBER (2)
40 #define FUNC_IS_TRAMPOLINE (3)
43 * For constants generated by the parser, we use this datatype
45 extern struct datatype * DEBUG_TypeShortUInt;
46 extern struct datatype * DEBUG_TypeInt;
47 extern struct datatype * DEBUG_TypeIntConst;
48 extern struct datatype * DEBUG_TypeUSInt;
49 extern struct datatype * DEBUG_TypeString;
53 DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
59 struct datatype* type;
60 int cookie; /* DV_??? */
61 /* DV_TARGET references an address in debugger's address space, whereas DV_HOST
62 * references the debuggee address space
64 # define DV_TARGET 0xF00D
65 # define DV_HOST 0x50DA
66 # define DV_INVALID 0x0000
78 unsigned long line_number;
84 struct name_hash * sym;
88 typedef struct wine_lines WineLineNo;
91 * This structure holds information about stack variables, function
92 * parameters, and register variables, which are all local to this
96 unsigned int regno:8; /* For register symbols */
97 signed int offset:24; /* offset from esp/ebp to symbol */
98 unsigned int pc_start; /* For RBRAC/LBRAC */
99 unsigned int pc_end; /* For RBRAC/LBRAC */
100 char * name; /* Name of symbol */
101 struct datatype * type; /* Datatype of symbol */
104 typedef struct wine_locals WineLocals;
108 EXEC_CONT, /* Continuous execution */
109 EXEC_PASS, /* Continue, passing exception to app */
110 EXEC_STEP_OVER, /* Stepping over a call to next source line */
111 EXEC_STEP_INSTR, /* Step to next source line, stepping in if needed */
112 EXEC_STEPI_OVER, /* Stepping over a call */
113 EXEC_STEPI_INSTR, /* Single-stepping an instruction */
114 EXEC_FINISH, /* Step until we exit current frame */
115 EXEC_STEP_OVER_TRAMPOLINE, /* Step over trampoline. Requires that
116 * we dig the real return value off the stack
117 * and set breakpoint there - not at the
118 * instr just after the call.
145 struct expr * condition;
150 MODE_INVALID, MODE_16, MODE_32, MODE_VM86
155 /* Wine extension; Windows doesn't have a name for this code. This is an
156 undocumented exception understood by MS VC debugger, allowing the program
157 to name a particular thread. Search google.com or deja.com for "0x406d1388"
159 #define EXCEPTION_NAME_THREAD 0x406D1388
161 /* Helper structure */
162 typedef struct tagTHREADNAME_INFO
164 DWORD dwType; /* Must be 0x1000 */
165 LPCTSTR szName; /* Pointer to name - limited to 9 bytes (8 characters + terminator) */
166 DWORD dwThreadID; /* Thread ID (-1 = caller thread) */
167 DWORD dwFlags; /* Reserved for future use. Must be zero. */
170 typedef struct tagDBG_THREAD {
171 struct tagDBG_PROCESS* process;
176 int wait_for_first_exception;
177 enum dbg_mode dbg_mode;
178 enum exec_mode dbg_exec_mode;
180 DBG_BREAKPOINT stepOverBP;
182 struct tagDBG_THREAD* next;
183 struct tagDBG_THREAD* prev;
186 typedef struct tagDBG_PROCESS {
191 unsigned continue_on_first_exception;
192 struct tagDBG_MODULE** modules;
194 unsigned long dbg_hdr_addr;
196 * This is an index we use to keep track of the debug information
197 * when we have multiple sources. We use the same database to also
198 * allow us to do an 'info shared' type of deal, and we use the index
199 * to eliminate duplicates.
202 struct tagDBG_PROCESS* next;
203 struct tagDBG_PROCESS* prev;
206 extern DBG_PROCESS* DEBUG_CurrProcess;
207 extern DBG_THREAD* DEBUG_CurrThread;
208 extern DWORD DEBUG_CurrTid;
209 extern DWORD DEBUG_CurrPid;
210 extern CONTEXT DEBUG_context;
211 extern BOOL DEBUG_interactiveP;
213 #define DEBUG_READ_MEM(addr, buf, len) \
214 (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
216 #define DEBUG_WRITE_MEM(addr, buf, len) \
217 (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
219 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
220 (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
222 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
223 (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
225 enum DbgInfoLoad {DIL_DEFERRED, DIL_LOADED, DIL_NOINFO, DIL_ERROR};
226 enum DbgModuleType {DMT_UNKNOWN, DMT_ELF, DMT_NE, DMT_PE};
228 typedef struct tagDBG_MODULE {
232 enum DbgInfoLoad dil;
233 enum DbgModuleType type;
234 unsigned short main : 1;
237 struct tagMSC_DBG_INFO* msc_info;
238 struct tagELF_DBG_INFO* elf_info;
245 struct datatype* type;
248 #define OFFSET_OF(__c,__f) ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
250 /* from winelib.so */
251 extern void DEBUG_ExternalDebugger(void);
253 /* debugger/break.c */
254 extern void DEBUG_SetBreakpoints( BOOL set );
255 extern void DEBUG_AddBreakpoint( const DBG_VALUE *addr, BOOL (*func)(void) );
256 extern void DEBUG_AddBreakpointFromId( const char *name, int lineno );
257 extern void DEBUG_AddBreakpointFromLineno( int lineno );
258 extern void DEBUG_AddWatchpoint( const DBG_VALUE *addr, int is_write );
259 extern void DEBUG_AddWatchpointFromId( const char *name );
260 extern void DEBUG_DelBreakpoint( int num );
261 extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
262 extern void DEBUG_InfoBreakpoints(void);
263 extern BOOL DEBUG_HandleTrap(void);
264 extern BOOL DEBUG_ShouldContinue( DBG_ADDR *addr, DWORD code, enum exec_mode mode,
266 extern void DEBUG_SuspendExecution( void );
267 extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
268 extern BOOL DEBUG_IsFctReturn(void);
269 extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
271 /* debugger/db_disasm.c */
272 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
275 extern BOOL DEBUG_Parser(void);
276 extern void DEBUG_Exit( DWORD );
278 /* debugger/debug.l */
279 extern void DEBUG_FlushSymbols(void);
281 /* debugger/display.c */
282 extern int DEBUG_DoDisplay(void);
283 extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
284 extern int DEBUG_DoDisplay(void);
285 extern int DEBUG_DelDisplay(int displaynum);
286 extern int DEBUG_InfoDisplay(void);
288 /* debugger/editline.c */
289 extern char * readline(const char *);
290 extern void add_history(char *);
292 /* debugger/expr.c */
293 extern void DEBUG_FreeExprMem(void);
294 struct expr * DEBUG_IntVarExpr(const char* name);
295 struct expr * DEBUG_SymbolExpr(const char * name);
296 struct expr * DEBUG_ConstExpr(int val);
297 struct expr * DEBUG_StringExpr(const char * str);
298 struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
299 struct expr * DEBUG_USConstExpr(unsigned int val);
300 struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
301 struct expr * DEBUG_UnopExpr(int oper, struct expr *);
302 struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
303 struct expr * DEBUG_StructExpr(struct expr *, const char * element);
304 struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
305 struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
306 struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
307 extern DBG_VALUE DEBUG_EvalExpr(struct expr *);
308 extern int DEBUG_DelDisplay(int displaynum);
309 extern struct expr * DEBUG_CloneExpr(const struct expr * exp);
310 extern int DEBUG_FreeExpr(struct expr * exp);
311 extern int DEBUG_DisplayExpr(const struct expr * exp);
313 /* debugger/hash.c */
314 extern struct name_hash * DEBUG_AddSymbol( const char *name,
315 const DBG_VALUE *addr,
316 const char *sourcefile,
318 extern int DEBUG_GetSymbolValue( const char * name, const int lineno,
319 DBG_VALUE *addr, int );
320 extern BOOL DEBUG_SetSymbolValue( const char * name, const DBG_VALUE *addr );
321 extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
322 struct name_hash ** rtn,
324 struct list_id * source);
325 extern void DEBUG_ReadSymbolTable( const char * filename );
326 extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
327 unsigned long offset );
328 extern struct wine_locals *
329 DEBUG_AddLocal( struct name_hash * func, int regno,
334 extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
335 extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file,
337 extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
338 extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
339 extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
340 extern int DEBUG_cmp_sym(const void * p1, const void * p2);
341 extern BOOL DEBUG_GetLineNumberAddr( const struct name_hash *, const int lineno,
342 DBG_ADDR *addr, int bp_flag );
344 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
345 struct datatype * type);
346 extern BOOL DEBUG_Normalize(struct name_hash * nh );
348 /* debugger/info.c */
349 extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
350 extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
351 enum dbg_mode mode, int flag );
352 extern void DEBUG_Help(void);
353 extern void DEBUG_HelpInfo(void);
354 extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
358 extern void DEBUG_InfoClass(const char* clsName);
359 extern void DEBUG_WalkClasses(void);
360 extern void DEBUG_WalkModref(DWORD p);
361 extern void DEBUG_DumpModule(DWORD mod);
362 extern void DEBUG_WalkModules(void);
363 extern void DEBUG_WalkProcess(void);
364 extern void DEBUG_WalkThreads(void);
365 extern void DEBUG_DumpQueue(DWORD q);
366 extern void DEBUG_WalkQueues(void);
367 extern void DEBUG_InfoSegments(DWORD s, int v);
368 extern void DEBUG_InfoVirtual(void);
369 extern void DEBUG_InfoWindow(HWND hWnd);
370 extern void DEBUG_WalkWindows(HWND hWnd, int indent);
372 /* debugger/memory.c */
373 extern int DEBUG_ReadMemory( const DBG_VALUE* value );
374 extern void DEBUG_WriteMemory( const DBG_VALUE* val, int value );
375 extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
376 extern void DEBUG_InvalAddr( const DBG_ADDR* addr );
377 extern void DEBUG_InvalLinAddr( void* addr );
378 extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
379 extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
380 extern BOOL DEBUG_GrabAddress( DBG_VALUE* value, BOOL fromCode );
381 extern enum dbg_mode DEBUG_GetSelectorType( WORD sel );
383 extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
384 extern int DEBUG_IsSelectorSystem( WORD sel );
387 /* debugger/module.c */
388 extern int DEBUG_LoadEntryPoints( const char * prefix );
389 extern void DEBUG_LoadModule32( const char* name, HANDLE hFile, DWORD base );
390 extern DBG_MODULE* DEBUG_AddModule(const char* name, enum DbgModuleType type,
391 void* mod_addr, u_long size, HMODULE hmod);
392 extern DBG_MODULE* DEBUG_FindModuleByName(const char* name, enum DbgModuleType type);
393 extern DBG_MODULE* DEBUG_FindModuleByHandle(HANDLE handle, enum DbgModuleType type);
394 extern DBG_MODULE* DEBUG_FindModuleByAddr(void* addr, enum DbgModuleType type);
395 extern DBG_MODULE* DEBUG_GetProcessMainModule(DBG_PROCESS* process);
396 extern DBG_MODULE* DEBUG_RegisterPEModule(HMODULE, u_long load_addr, u_long size,
398 extern DBG_MODULE* DEBUG_RegisterELFModule(u_long load_addr, u_long size,
400 extern enum DbgInfoLoad DEBUG_RegisterPEDebugInfo(DBG_MODULE* wmod, HANDLE hFile,
401 void* _nth, unsigned long nth_ofs);
402 extern void DEBUG_ReportDIL(enum DbgInfoLoad dil, const char* pfx,
403 const char* filename, DWORD load_addr);
404 extern void DEBUG_InfoShare(void);
407 extern enum DbgInfoLoad DEBUG_RegisterMSCDebugInfo(DBG_MODULE* module, HANDLE hFile,
408 void* nth, unsigned long nth_ofs);
409 extern enum DbgInfoLoad DEBUG_RegisterStabsDebugInfo(DBG_MODULE* module,
410 HANDLE hFile, void* nth,
411 unsigned long nth_ofs);
412 extern void DEBUG_InitCVDataTypes(void);
414 /* debugger/registers.c */
415 extern void DEBUG_InfoRegisters(void);
416 extern BOOL DEBUG_ValidateRegisters(void);
418 /* debugger/source.c */
419 extern void DEBUG_ShowDir(void);
420 extern void DEBUG_AddPath(const char * path);
421 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
423 extern void DEBUG_NukePath(void);
424 extern void DEBUG_Disassemble(const DBG_VALUE *, const DBG_VALUE*, int offset);
425 extern BOOL DEBUG_DisassembleInstruction(DBG_ADDR *addr);
427 /* debugger/stack.c */
428 extern void DEBUG_InfoStack(void);
429 extern void DEBUG_BackTrace(BOOL noisy);
430 extern int DEBUG_InfoLocals(void);
431 extern int DEBUG_SetFrame(int newframe);
432 extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
436 /* debugger/stabs.c */
437 extern enum DbgInfoLoad DEBUG_ReadExecutableDbgInfo(const char* exe_name);
438 extern enum DbgInfoLoad DEBUG_ParseStabs(char * addr, unsigned int load_offset,
439 unsigned int staboff, int stablen,
440 unsigned int strtaboff, int strtablen);
442 /* debugger/types.c */
443 extern int DEBUG_nchar;
444 extern void DEBUG_InitTypes(void);
445 extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
446 const char * typename);
447 extern unsigned int DEBUG_TypeDerefPointer(const DBG_VALUE *value,
448 struct datatype ** newtype);
449 extern int DEBUG_AddStructElement(struct datatype * dt,
450 char * name, struct datatype * type,
451 int offset, int size);
452 extern int DEBUG_SetStructSize(struct datatype * dt, int size);
453 extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
454 extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
455 struct datatype * dt2);
456 extern void DEBUG_Print( const DBG_VALUE *addr, int count, char format, int level );
457 extern unsigned int DEBUG_FindStructElement(DBG_VALUE * addr,
458 const char * ele_name, int * tmpbuf);
459 extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
460 extern int DEBUG_GetObjectSize(struct datatype * dt);
461 extern unsigned int DEBUG_ArrayIndex(const DBG_VALUE * addr, DBG_VALUE * result,
463 extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
464 extern long long int DEBUG_GetExprValue(const DBG_VALUE * addr, char ** format);
465 extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
466 int nbits, struct datatype * dt2);
467 extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
468 extern enum debug_type DEBUG_GetType(struct datatype * dt);
469 extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
470 extern int DEBUG_PrintTypeCast(const struct datatype *);
471 extern int DEBUG_PrintType( const DBG_VALUE* addr );
473 /* debugger/winedbg.c */
474 #define DBG_CHN_MESG 1
475 #define DBG_CHN_ERR 2
476 #define DBG_CHN_WARN 4
477 #define DBG_CHN_FIXME 8
478 #define DBG_CHN_TRACE 16
479 extern void DEBUG_Output(int chn, const char* buffer, int len);
481 extern int DEBUG_Printf(int chn, const char* format, ...) __attribute__((format (printf,2,3)));
483 extern int DEBUG_Printf(int chn, const char* format, ...);
485 extern DBG_INTVAR* DEBUG_GetIntVar(const char*);
486 extern BOOL DEBUG_Attach(DWORD pid, BOOL cofe);
487 extern void DEBUG_Run(const char* args);
488 extern int curr_frame;
490 /* Choose your allocator! */
492 /* this one is libc's fast one */
493 extern void* DEBUG_XMalloc(size_t size);
494 extern void* DEBUG_XReAlloc(void *ptr, size_t size);
495 extern char* DEBUG_XStrDup(const char *str);
497 #define DBG_alloc(x) DEBUG_XMalloc(x)
498 #define DBG_realloc(x,y) DEBUG_XReAlloc(x,y)
499 #define DBG_free(x) free(x)
500 #define DBG_strdup(x) DEBUG_XStrDup(x)
502 /* this one is slow (takes 5 minutes to load the debugger on my machine),
503 but is pretty crash-proof (can step through malloc() without problems,
504 malloc() arena (and other heaps) can be totally wasted and it'll still
505 work, etc... if someone could make optimized routines so it wouldn't
506 take so long to load, it could be made default) */
508 #define DBG_alloc(x) HeapAlloc(dbg_heap,0,x)
509 #define DBG_realloc(x,y) HeapRealloc(dbg_heap,0,x,y)
510 #define DBG_free(x) HeapFree(dbg_heap,0,x)
511 #define DBG_strdup(x) HEAP_strdupA(dbg_heap,0,x)
512 #define DBG_need_heap
513 extern HANDLE dbg_heap;
516 #define DEBUG_STATUS_OFFSET 0x80003000
517 #define DEBUG_STATUS_INTERNAL_ERROR (DEBUG_STATUS_OFFSET+0)
518 #define DEBUG_STATUS_NO_SYMBOL (DEBUG_STATUS_OFFSET+1)
519 #define DEBUG_STATUS_DIV_BY_ZERO (DEBUG_STATUS_OFFSET+2)
520 #define DEBUG_STATUS_BAD_TYPE (DEBUG_STATUS_OFFSET+3)
522 extern DBG_INTVAR DEBUG_IntVars[];
524 #define DBG_IVARNAME(_var) DEBUG_IV_##_var
525 #define DBG_IVARSTRUCT(_var) DEBUG_IntVars[DBG_IVARNAME(_var)]
526 #define DBG_IVAR(_var) (*(DBG_IVARSTRUCT(_var).pval))
527 #define INTERNAL_VAR(_var,_val,_ref,_typ) DBG_IVARNAME(_var),
534 #endif /* __WINE_DEBUGGER_H */