as per Max request, here's a patch which adds $regs as an internal variable using p $regs will print the registers (as info regs would do) the interesting part is that this can be used in a display command display $regs A+
Name: wdbg_regs ChangeLog: added as a variable for displaying all registers License: X11 GenDate: 2002/08/01 19:22:34 UTC ModifiedFiles: debugger/dbg.y debugger/debugger.h debugger/info.c debugger/intvar.h debugger/registers.c debugger/types.c debugger/winedbg.c AddedFiles: =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/dbg.y,v retrieving revision 1.61 diff -u -u -r1.61 dbg.y --- debugger/dbg.y 30 Jul 2002 00:06:34 -0000 1.61 +++ debugger/dbg.y 1 Aug 2002 19:20:54 -0000 @@ -230,7 +230,7 @@ | tINFO tSHARE tEOL { DEBUG_InfoShare(); } | tINFO tMODULE expr_value tEOL { DEBUG_DumpModule( $3 ); DEBUG_FreeExprMem(); } | tINFO tQUEUE expr_value tEOL { DEBUG_DumpQueue( $3 ); DEBUG_FreeExprMem(); } - | tINFO tREGS tEOL { DEBUG_InfoRegisters(); } + | tINFO tREGS tEOL { DEBUG_InfoRegisters(&DEBUG_context); } | tINFO tSEGMENTS expr_value tEOL { DEBUG_InfoSegments( $3, 1 ); DEBUG_FreeExprMem(); } | tINFO tSEGMENTS tEOL { DEBUG_InfoSegments( 0, -1 ); } | tINFO tSTACK tEOL { DEBUG_InfoStack(); } Index: debugger/debugger.h =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/debugger.h,v retrieving revision 1.40 diff -u -u -r1.40 debugger.h --- debugger/debugger.h 30 Jul 2002 00:06:34 -0000 1.40 +++ debugger/debugger.h 1 Aug 2002 19:20:14 -0000 @@ -56,6 +57,8 @@ DT_BASIC_STRING, /* this is for historical reasons... should take care of it RSN */ DT_BASIC_CONST_INT, + /* not so basic, but handy */ + DT_BASIC_CONTEXT, /* to be kept as last... sentinel entry... do not use */ DT_BASIC_LAST}; @@ -456,7 +459,7 @@ extern void DEBUG_InitCVDataTypes(void); /* debugger/registers.c */ -extern void DEBUG_InfoRegisters(void); +extern void DEBUG_InfoRegisters(const CONTEXT* ctx); extern BOOL DEBUG_ValidateRegisters(void); /* debugger/source.c */ Index: debugger/info.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/info.c,v retrieving revision 1.26 diff -u -u -r1.26 info.c --- debugger/info.c 2 Jun 2002 21:36:08 -0000 1.26 +++ debugger/info.c 30 Jul 2002 20:45:14 -0000 @@ -86,56 +86,63 @@ case 'b': DEBUG_Printf(DBG_CHN_MESG, "Format specifier '%c' is meaningless in 'print' command\n", format); case 0: - if (default_format != NULL) - { - if (strstr(default_format, "%S") != NULL) - { - char* ptr; - int state = 0; + if (default_format == NULL) break; - /* FIXME: simplistic implementation for default_format being - * foo%Sbar => will print foo, then string then bar - */ - for (ptr = default_format; *ptr; ptr++) + if (strstr(default_format, "%S") != NULL) + { + char* ptr; + int state = 0; + + /* FIXME: simplistic implementation for default_format being + * foo%Sbar => will print foo, then string then bar + */ + for (ptr = default_format; *ptr; ptr++) + { + if (*ptr == '%') + { + state++; + } + else if (state == 1) { - if (*ptr == '%') + if (*ptr == 'S') { - state++; - } - else if (state == 1) - { - if (*ptr == 'S') - { - DBG_ADDR addr; + DBG_ADDR addr; - addr.seg = 0; - addr.off = (long)res; - DEBUG_nchar += DEBUG_PrintStringA(DBG_CHN_MESG, &addr, -1); - } - else - { - /* shouldn't happen */ - DEBUG_Printf(DBG_CHN_MESG, "%%%c", *ptr); - DEBUG_nchar += 2; - } - state = 0; - } + addr.seg = 0; + addr.off = (long)res; + DEBUG_nchar += DEBUG_PrintStringA(DBG_CHN_MESG, &addr, -1); + } else - { - DEBUG_OutputA(DBG_CHN_MESG, ptr, 1); - DEBUG_nchar++; - } + { + /* shouldn't happen */ + DEBUG_Printf(DBG_CHN_MESG, "%%%c", *ptr); + DEBUG_nchar += 2; + } + state = 0; + } + else + { + DEBUG_OutputA(DBG_CHN_MESG, ptr, 1); + DEBUG_nchar++; } - } - else if (strcmp(default_format, "%B") == 0) - { - DEBUG_nchar += DEBUG_Printf(DBG_CHN_MESG, "%s", res ? "true" : "false"); } + } + else if (strcmp(default_format, "%B") == 0) + { + DEBUG_nchar += DEBUG_Printf(DBG_CHN_MESG, "%s", res ? "true" : "false"); + } + else if (strcmp(default_format, "%R") == 0) + { + if (value->cookie == DV_HOST) + DEBUG_InfoRegisters((CONTEXT*)value->addr.off); else - { - DEBUG_nchar += DEBUG_Printf(DBG_CHN_MESG, default_format, res); - } - } + DEBUG_Printf(DBG_CHN_MESG, "NIY: info on register struct in debuggee address space\n"); + DEBUG_nchar = 0; + } + else + { + DEBUG_nchar += DEBUG_Printf(DBG_CHN_MESG, default_format, res); + } break; } } Index: debugger/intvar.h =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/intvar.h,v retrieving revision 1.9 diff -u -u -r1.9 intvar.h --- debugger/intvar.h 30 Jul 2002 00:06:34 -0000 1.9 +++ debugger/intvar.h 1 Aug 2002 19:14:13 -0000 @@ -64,10 +64,12 @@ INTERNAL_VAR(di, 0, &DEBUG_context.Edi, DT_BASIC_USHORTINT) INTERNAL_VAR(ebp, 0, &DEBUG_context.Ebp, DT_BASIC_CONST_INT) INTERNAL_VAR(bp, 0, &DEBUG_context.Ebp, DT_BASIC_USHORTINT) INTERNAL_VAR(es, 0, &DEBUG_context.SegEs, DT_BASIC_CONST_INT) INTERNAL_VAR(ds, 0, &DEBUG_context.SegDs, DT_BASIC_CONST_INT) INTERNAL_VAR(cs, 0, &DEBUG_context.SegCs, DT_BASIC_CONST_INT) INTERNAL_VAR(ss, 0, &DEBUG_context.SegSs, DT_BASIC_CONST_INT) INTERNAL_VAR(fs, 0, &DEBUG_context.SegFs, DT_BASIC_CONST_INT) INTERNAL_VAR(gs, 0, &DEBUG_context.SegGs, DT_BASIC_CONST_INT) + +INTERNAL_VAR(regs, 0, (DWORD*)&DEBUG_context, DT_BASIC_CONTEXT) #endif Index: debugger/registers.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/registers.c,v retrieving revision 1.18 diff -u -u -r1.18 registers.c --- debugger/registers.c 31 May 2002 23:06:47 -0000 1.18 +++ debugger/registers.c 1 Aug 2002 19:20:21 -0000 @@ -27,7 +27,7 @@ * * Return Flag String. */ -char *DEBUG_Flags( DWORD flag, char *buf ) +static char *DEBUG_Flags( DWORD flag, char *buf ) { #ifdef __i386__ char *pt; @@ -86,42 +86,42 @@ * * Display registers information. */ -void DEBUG_InfoRegisters(void) +void DEBUG_InfoRegisters(const CONTEXT* ctx) { DEBUG_Printf(DBG_CHN_MESG,"Register dump:\n"); #ifdef __i386__ /* First get the segment registers out of the way */ DEBUG_Printf( DBG_CHN_MESG," CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x", - (WORD)DEBUG_context.SegCs, (WORD)DEBUG_context.SegSs, - (WORD)DEBUG_context.SegDs, (WORD)DEBUG_context.SegEs, - (WORD)DEBUG_context.SegFs, (WORD)DEBUG_context.SegGs ); + (WORD)ctx->SegCs, (WORD)ctx->SegSs, + (WORD)ctx->SegDs, (WORD)ctx->SegEs, + (WORD)ctx->SegFs, (WORD)ctx->SegGs ); if (DEBUG_CurrThread->dbg_mode != MODE_32) { char flag[33]; DEBUG_Printf( DBG_CHN_MESG,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x(%s)\n", - LOWORD(DEBUG_context.Eip), LOWORD(DEBUG_context.Esp), - LOWORD(DEBUG_context.Ebp), LOWORD(DEBUG_context.EFlags), - DEBUG_Flags(LOWORD(DEBUG_context.EFlags), flag)); + LOWORD(ctx->Eip), LOWORD(ctx->Esp), + LOWORD(ctx->Ebp), LOWORD(ctx->EFlags), + DEBUG_Flags(LOWORD(ctx->EFlags), flag)); DEBUG_Printf( DBG_CHN_MESG," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n", - LOWORD(DEBUG_context.Eax), LOWORD(DEBUG_context.Ebx), - LOWORD(DEBUG_context.Ecx), LOWORD(DEBUG_context.Edx), - LOWORD(DEBUG_context.Esi), LOWORD(DEBUG_context.Edi) ); + LOWORD(ctx->Eax), LOWORD(ctx->Ebx), + LOWORD(ctx->Ecx), LOWORD(ctx->Edx), + LOWORD(ctx->Esi), LOWORD(ctx->Edi) ); } else /* 32-bit mode */ { char flag[33]; DEBUG_Printf( DBG_CHN_MESG, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx(%s)\n", - DEBUG_context.Eip, DEBUG_context.Esp, - DEBUG_context.Ebp, DEBUG_context.EFlags, - DEBUG_Flags(DEBUG_context.EFlags, flag)); + ctx->Eip, ctx->Esp, + ctx->Ebp, ctx->EFlags, + DEBUG_Flags(ctx->EFlags, flag)); DEBUG_Printf( DBG_CHN_MESG, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", - DEBUG_context.Eax, DEBUG_context.Ebx, - DEBUG_context.Ecx, DEBUG_context.Edx ); + ctx->Eax, ctx->Ebx, + ctx->Ecx, ctx->Edx ); DEBUG_Printf( DBG_CHN_MESG, " ESI:%08lx EDI:%08lx\n", - DEBUG_context.Esi, DEBUG_context.Edi ); + ctx->Esi, ctx->Edi ); } #endif } Index: debugger/types.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/types.c,v retrieving revision 1.31 diff -u -u -r1.31 types.c --- debugger/types.c 13 Jun 2002 21:37:41 -0000 1.31 +++ debugger/types.c 30 Jul 2002 20:41:55 -0000 @@ -340,6 +340,7 @@ */ DEBUG_InitCVDataTypes(); + DEBUG_InitBasic(DT_BASIC_CONTEXT,NULL,4,0,"%R"); } long long int Index: debugger/winedbg.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/debugger/winedbg.c,v retrieving revision 1.63 diff -u -u -r1.63 winedbg.c --- debugger/winedbg.c 30 Jul 2002 00:06:34 -0000 1.63 +++ debugger/winedbg.c 1 Aug 2002 19:15:11 -0000 @@ -389,7 +389,7 @@ DEBUG_BackTrace(DEBUG_CurrTid, FALSE); } else { /* This is a real crash, dump some info */ - DEBUG_InfoRegisters(); + DEBUG_InfoRegisters(&DEBUG_context); DEBUG_InfoStack(); #ifdef __i386__ if (DEBUG_CurrThread->dbg_mode == MODE_16) {