User (developer ?) friendly execution trace

Eric Pouech eric.pouech at wanadoo.fr
Thu May 30 13:05:10 CDT 2002


> Much better would be an internal implementation....
> Some comments about ?
this has already been discussed. there should be a patch floating around
(but never committed to Wine because ugly, code bloat, intrusive...) to 
turn all debug channels on or off using a simple key stroke

I've quickly hacked a solution based on winedbg by extending some
existing
commands:

set + warn win		=> turn on warn on 'win' channel
set + win		=> turn on warn/fixme/err/trace on 'win' channel

(same with - to turn off)

(form of command should still be improved..., but core of functionality
is
there)

HTH

A+
-------------- next part --------------
Name:          dbg_chn
ChangeLog:     added ability to turn on/off debug channels
License:       X11
GenDate:       2002/05/30 18:01:13 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.55
diff -u -u -r1.55 dbg.y
--- debugger/dbg.y	25 May 2002 21:18:34 -0000	1.55
+++ debugger/dbg.y	30 May 2002 17:57:11 -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, $3, $4);}
+    | tSET '-' tIDENTIFIER tIDENTIFIER tEOL {DEBUG_DbgChannel(FALSE, $3, $4);}
     ;
 
 pathname:
Index: debugger/debugger.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/debugger/debugger.h,v
retrieving revision 1.32
diff -u -u -r1.32 debugger.h
--- debugger/debugger.h	25 May 2002 21:18:34 -0000	1.32
+++ debugger/debugger.h	30 May 2002 17:53:16 -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.24
diff -u -u -r1.24 info.c
--- debugger/info.c	25 May 2002 21:18:34 -0000	1.24
+++ debugger/info.c	30 May 2002 18:01:08 -0000
@@ -536,6 +536,63 @@
    DEBUG_Printf(DBG_CHN_MESG, "No longer walking module references list\n");
 }
 
+struct dll_option_layout
+{
+    void*               next;
+    void*               prev;
+    char* const*        channels;
+    int                 nb_channels;
+};
+
+void DEBUG_DbgChannel(BOOL add, const char* chnl, const char* name)
+{
+    DBG_VALUE                   dv;
+    DBG_ADDR                    ad;
+    struct dll_option_layout    dol;
+    int                         i;
+    char*                       str;
+    unsigned char               buffer[32];
+    unsigned char               mask;
+    int                         done = 0;
+
+    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; }
+
+    if (!DEBUG_GetSymbolValue("first_dll", -1, &dv, FALSE))
+    {
+        DEBUG_Printf(DBG_CHN_MESG, "Can't get first_option symbol");
+        return;
+    }
+    while (DEBUG_ToLinear(&dv.addr) && DEBUG_READ_MEM((void*)DEBUG_ToLinear(&dv.addr), &dol, sizeof(dol)))
+    {
+        for (i = 0; i < dol.nb_channels; i++)
+        {
+            ad.seg = 0;
+            ad.off = (unsigned long)(dol.channels + i);
+            if (DEBUG_READ_MEM((void*)DEBUG_ToLinear(&ad), &str, sizeof(str)))
+            {
+                ad.off = (unsigned long)str;
+                if (DEBUG_READ_MEM((void*)DEBUG_ToLinear(&ad), buffer, sizeof(buffer)))
+                {
+                    if (!strcmp(buffer + 1, name))
+                    {   
+                        if (add) buffer[0] |= mask; else buffer[0] &= ~mask;
+                        if (DEBUG_WRITE_MEM((void*)DEBUG_ToLinear(&ad), buffer, 1))
+                            done++;
+                    }
+                }
+            }
+        }
+        dv.addr.off = (unsigned long)dol.next;
+    }
+    if (!done) DEBUG_Printf(DBG_CHN_MESG, "Unable to find debug channel %s\n", name);
+    else DEBUG_Printf(DBG_CHN_MESG, "Changed %d channel instances\n", done);
+}
+
 void DEBUG_InfoSegments(DWORD start, int length)
 {
     char 	flags[3];


More information about the wine-devel mailing list