new winedbg commands
Eric Pouech
eric.pouech at wanadoo.fr
Sat Jun 1 14:26:14 CDT 2002
this patch extends the existing set command to turn on/off debug
channels.
Forms of use are:
set warn+win turns on warn stream on win channel
set -gdi turns off all streams on gdi channel
it also reimplements the 'info maps' command. but it requires a working
version of VirtualQueryEx (which isn't in the cvs tree yet) [so it won't
work on vanilla wine].
I have a hack for VirtualQueryEx for Linux, but Alexandre will never
accept it (but if someone needs it, I can provide it)
A+
-------------- next part --------------
Name: dbg_chn
ChangeLog: added ability to turn on/off debug channels
reimplemented the info maps command
License: X11
GenDate: 2002/06/01 19:06:37 UTC
ModifiedFiles: debugger/dbg.y debugger/debugger.h debugger/info.c
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/debugger/dbg.y,v
retrieving revision 1.56
diff -u -u -r1.56 dbg.y
--- debugger/dbg.y 1 Jun 2002 02:55:49 -0000 1.56
+++ debugger/dbg.y 1 Jun 2002 03:24:54 -0000
@@ -173,7 +173,12 @@
| noprocess_state
;
-set_command: tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory(&$2,$4); DEBUG_FreeExprMem(); }
+set_command:
+ tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory(&$2,$4); DEBUG_FreeExprMem(); }
+ | tSET '+' tIDENTIFIER tEOL {DEBUG_DbgChannel(TRUE, NULL, $3);}
+ | tSET '-' tIDENTIFIER tEOL {DEBUG_DbgChannel(FALSE, NULL, $3);}
+ | tSET tIDENTIFIER '+' tIDENTIFIER tEOL {DEBUG_DbgChannel(TRUE, $2, $4);}
+ | tSET tIDENTIFIER '-' tIDENTIFIER tEOL {DEBUG_DbgChannel(FALSE, $2, $4);}
;
pathname:
Index: debugger/debugger.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/debugger/debugger.h,v
retrieving revision 1.33
diff -u -u -r1.33 debugger.h
--- debugger/debugger.h 31 May 2002 23:06:46 -0000 1.33
+++ debugger/debugger.h 1 Jun 2002 03:24:54 -0000
@@ -404,6 +404,7 @@
extern void DEBUG_InfoVirtual(void);
extern void DEBUG_InfoWindow(HWND hWnd);
extern void DEBUG_WalkWindows(HWND hWnd, int indent);
+extern void DEBUG_DbgChannel(BOOL add, const char* chnl, const char* name);
/* debugger/memory.c */
extern int DEBUG_ReadMemory( const DBG_VALUE* value );
Index: debugger/info.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/debugger/info.c,v
retrieving revision 1.25
diff -u -u -r1.25 info.c
--- debugger/info.c 31 May 2002 23:06:47 -0000 1.25
+++ debugger/info.c 1 Jun 2002 08:55:38 -0000
@@ -575,5 +575,109 @@
void DEBUG_InfoVirtual(void)
{
- DEBUG_Printf(DBG_CHN_MESG, "No longer providing virtual mapping information\n");
+ MEMORY_BASIC_INFORMATION mbi;
+ char* addr = 0;
+ char* state;
+ char* type;
+ char prot[3+1];
+
+ if (DEBUG_CurrProcess == NULL)
+ return;
+
+ DEBUG_Printf(DBG_CHN_MESG, "Address Size State Type RWX\n");
+
+ while (VirtualQueryEx(DEBUG_CurrProcess->handle, addr, &mbi, sizeof(mbi)) >= sizeof(mbi))
+ {
+ switch (mbi.State)
+ {
+ case MEM_COMMIT: state = "commit "; break;
+ case MEM_FREE: state = "free "; break;
+ case MEM_RESERVE: state = "reserve"; break;
+ default: state = "??? "; break;
+ }
+ if (mbi.State != MEM_FREE)
+ {
+ switch (mbi.Type)
+ {
+ case MEM_IMAGE: type = "image "; break;
+ case MEM_MAPPED: type = "mapped "; break;
+ case MEM_PRIVATE: type = "private"; break;
+ case 0: type = " "; break;
+ default: type = "??? "; break;
+ }
+ memset(prot, ' ' , sizeof(prot)-1);
+ prot[sizeof(prot)-1] = '\0';
+ if (mbi.AllocationProtect & (PAGE_READONLY|PAGE_READWRITE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE))
+ prot[0] = 'R';
+ if (mbi.AllocationProtect & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE))
+ prot[1] = 'W';
+ if (mbi.AllocationProtect & (PAGE_WRITECOPY|PAGE_EXECUTE_WRITECOPY))
+ prot[1] = 'C';
+ if (mbi.AllocationProtect & (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE))
+ prot[2] = 'X';
+ }
+ else
+ {
+ type = "";
+ prot[0] = '\0';
+ }
+ DEBUG_Printf(DBG_CHN_MESG, "%08lx %08lx %s %s %s\n",
+ (DWORD)addr, mbi.RegionSize, state, type, prot);
+ if (addr + mbi.RegionSize < addr) /* wrap around ? */
+ break;
+ addr += mbi.RegionSize;
+ }
}
+
+struct dll_option_layout
+{
+ void* next;
+ void* prev;
+ char* const* channels;
+ int nb_channels;
+};
+
+void DEBUG_DbgChannel(BOOL turn_on, const char* chnl, const char* name)
+{
+ DBG_VALUE val;
+ struct dll_option_layout dol;
+ int i;
+ char* str;
+ unsigned char buffer[32];
+ unsigned char mask;
+ int done = 0;
+ BOOL bAll;
+ void* addr;
+
+ if (!DEBUG_GetSymbolValue("first_dll", -1, &val, FALSE))
+ {
+ DEBUG_Printf(DBG_CHN_MESG, "Can't get first_option symbol");
+ return;
+ }
+ addr = (void*)DEBUG_ToLinear(&val.addr);
+ if (!chnl) mask = 15;
+ else if (!strcmp(chnl, "fixme")) mask = 1;
+ else if (!strcmp(chnl, "err")) mask = 2;
+ else if (!strcmp(chnl, "warn")) mask = 4;
+ else if (!strcmp(chnl, "trace")) mask = 8;
+ else { DEBUG_Printf(DBG_CHN_MESG, "Unknown channel %s\n", chnl); return; }
+
+ bAll = !strcmp("all", name);
+ while (addr && DEBUG_READ_MEM(addr, &dol, sizeof(dol)))
+ {
+ for (i = 0; i < dol.nb_channels; i++)
+ {
+ if (DEBUG_READ_MEM((void*)(dol.channels + i), &str, sizeof(str)) &&
+ DEBUG_READ_MEM(str, buffer, sizeof(buffer)) &&
+ (!strcmp(buffer + 1, name) || bAll))
+ {
+ if (turn_on) buffer[0] |= mask; else buffer[0] &= ~mask;
+ if (DEBUG_WRITE_MEM(str, buffer, 1)) done++;
+ }
+ }
+ addr = dol.next;
+ }
+ if (!done) DEBUG_Printf(DBG_CHN_MESG, "Unable to find debug channel %s\n", name);
+ else DEBUG_Printf(DBG_CHN_TRACE, "Changed %d channel instances\n", done);
+}
+
More information about the wine-patches
mailing list