listing of symbols in winedbg
Eric Pouech
eric.pouech at wanadoo.fr
Sat Jan 11 14:10:47 CST 2003
this patch has already been sent, but not yet commited
so, this shall bring it closer to the head of Alexandre's "ready for CVS
inclusion" list
A+
--
Eric Pouech
-------------- next part --------------
Name: wd_syminfo
ChangeLog: added 'info symbol' command to look after defined symbols
License: X11
GenDate: 2003/01/02 14:32:35 UTC
ModifiedFiles: programs/winedbg/dbg.y programs/winedbg/debug.l programs/winedbg/debugger.h programs/winedbg/hash.c
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/dbg.y,v
retrieving revision 1.3
diff -u -u -r1.3 dbg.y
--- programs/winedbg/dbg.y 12 Dec 2002 23:34:01 -0000 1.3
+++ programs/winedbg/dbg.y 1 Jan 2003 16:03:38 -0000
@@ -52,7 +52,7 @@
%token tCONT tPASS tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN
%token tENABLE tDISABLE tBREAK tWATCH tDELETE tSET tMODE tPRINT tEXAM tABORT tVM86
-%token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL tEXCEPTION
+%token tCLASS tMAPS tMODULE tSTACK tSEGMENTS tSYMBOL tREGS tWND tQUEUE tLOCAL tEXCEPTION
%token tPROCESS tTHREAD tMODREF tEOL tEOF
%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY tDISASSEMBLE
%token tSTEPI tNEXTI tFINISH tSHOW tDIR tWHATIS tSOURCE
@@ -231,9 +231,10 @@
| 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(&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(); }
+ | tINFO tSYMBOL tSTRING { DEBUG_InfoSymbols($3); }
| tINFO tMAPS tEOL { DEBUG_InfoVirtual(); }
| tINFO tWND expr_value tEOL{ DEBUG_InfoWindow( (HWND)$3 ); DEBUG_FreeExprMem(); }
| tINFO tLOCAL tEOL { DEBUG_InfoLocals(); }
Index: programs/winedbg/debug.l
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/debug.l,v
retrieving revision 1.1
diff -u -u -r1.1 debug.l
--- programs/winedbg/debug.l 13 Sep 2002 17:54:28 -0000 1.1
+++ programs/winedbg/debug.l 1 Jan 2003 16:00:27 -0000
@@ -152,6 +152,7 @@
<INFO_CMD>registers|regs|reg|re { return tREGS; }
<INFO_CMD>segments|segment|segm|seg|se { return tSEGMENTS; }
<INFO_CMD>stack|stac|sta|st { return tSTACK; }
+<INFO_CMD>symbol|sym { BEGIN(ASTRING_EXPECTED); return tSYMBOL; }
<INFO_CMD>maps|map { return tMAPS; }
<INFO_CMD,WALK_CMD>window|windo|wind|win|wnd { return tWND; }
<HELP_CMD>info|inf|in { return tINFO; }
Index: programs/winedbg/debugger.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/debugger.h,v
retrieving revision 1.2
diff -u -u -r1.2 debugger.h
--- programs/winedbg/debugger.h 16 Sep 2002 19:26:48 -0000 1.2
+++ programs/winedbg/debugger.h 1 Jan 2003 16:03:25 -0000
@@ -388,6 +388,7 @@
extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
struct datatype * type);
extern BOOL DEBUG_Normalize(struct name_hash * nh );
+void DEBUG_InfoSymbols(const char* str);
/* debugger/info.c */
extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
Index: programs/winedbg/hash.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/hash.c,v
retrieving revision 1.3
diff -u -u -r1.3 hash.c
--- programs/winedbg/hash.c 6 Nov 2002 19:55:04 -0000 1.3
+++ programs/winedbg/hash.c 1 Jan 2003 16:03:18 -0000
@@ -1333,4 +1343,66 @@
sym->type = type;
return TRUE;
+}
+
+static int cmp_sym_by_name(const void * p1, const void * p2)
+{
+ struct name_hash ** name1 = (struct name_hash **) p1;
+ struct name_hash ** name2 = (struct name_hash **) p2;
+
+ return strcmp( (*name1)->name, (*name2)->name );
+}
+
+#include <regex.h>
+
+void DEBUG_InfoSymbols(const char* str)
+{
+ int i;
+ struct name_hash* nh;
+ struct name_hash** array = NULL;
+ unsigned num_used_array = 0;
+ unsigned num_alloc_array = 0;
+ const char* name;
+ enum dbg_mode mode;
+ regex_t preg;
+
+ regcomp(&preg, str, REG_NOSUB);
+
+ /* grab all symbols */
+ for (i = 0; i < NR_NAME_HASH; i++)
+ {
+ for (nh = name_hash_table[i]; nh; nh = nh->next)
+ {
+ if (regexec(&preg, nh->name, 0, NULL, 0) == 0)
+ {
+ if (num_used_array == num_alloc_array)
+ {
+ array = HeapReAlloc(GetProcessHeap(), 0, array, sizeof(*array) * (num_alloc_array += 32));
+ if (!array) return;
+ }
+ array[num_used_array++] = nh;
+ }
+ }
+ }
+ regfree(&preg);
+
+ /* now sort them by alphabetical order */
+ qsort(array, num_used_array, sizeof(*array), cmp_sym_by_name);
+
+ /* and display them */
+ for (i = 0; i < num_used_array; i++)
+ {
+ mode = DEBUG_GetSelectorType(array[i]->value.addr.seg);
+ name = DEBUG_FindNearestSymbol( &array[i]->value.addr, TRUE,
+ NULL, 0, NULL );
+
+ if (mode != MODE_32)
+ DEBUG_Printf( DBG_CHN_MESG, "%04lx:%04lx :",
+ array[i]->value.addr.seg & 0xFFFF,
+ array[i]->value.addr.off );
+ else
+ DEBUG_Printf( DBG_CHN_MESG, "%08lx :", array[i]->value.addr.off );
+ if (name) DEBUG_Printf( DBG_CHN_MESG, " %s\n", name );
+ }
+ HeapFree(GetProcessHeap(), 0, array);
}
More information about the wine-patches
mailing list