WineDbg: types management
Eric Pouech
eric.pouech at wanadoo.fr
Sat Feb 15 14:30:32 CST 2003
this patch shall enhance the info symbol command by also printing the
actual type of a symbol
it also contains a complete rewrite of types dumping function so that:
- all members of a structure get actually displayed
- it becomes pointer neutral, so that one can compare output between
different runs of the debugger
A+
--
Eric Pouech
-------------- next part --------------
Name: wd_types
ChangeLog:
- added GetName() to retrieve type name
- reimplemented DumpTypes so that it really dumps the types content
- now printing type information in 'info sym'
License: X11
GenDate: 2003/02/15 20:21:16 UTC
ModifiedFiles: programs/winedbg/types.c programs/winedbg/debugger.h
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/types.c,v
retrieving revision 1.1
diff -u -u -r1.1 types.c
--- programs/winedbg/types.c 13 Sep 2002 17:54:28 -0000 1.1
+++ programs/winedbg/types.c 15 Feb 2003 11:11:34 -0000
@@ -617,7 +617,7 @@
}
}
m = (struct member *) DBG_alloc(sizeof(struct member));
- if( m == FALSE )
+ if( m == NULL )
{
return FALSE;
}
@@ -946,79 +946,87 @@
return;
}
-int
-DEBUG_DumpTypes(void)
+static void DEBUG_DumpAType(struct datatype* dt, BOOL deep)
{
- struct datatype * dt = NULL;
- struct member * m;
- int hash;
- int nm;
- char * name;
- char * member_name;
+ char* name = (dt->name) ? dt->name : "--none--";
+
+/* EPP DEBUG_Printf(DBG_CHN_MESG, "0x%08lx ", (unsigned long)dt); */
+ switch (dt->type)
+ {
+ case DT_BASIC:
+ DEBUG_Printf(DBG_CHN_MESG, "BASIC(%s)", name);
+ break;
+ case DT_POINTER:
+ DEBUG_Printf(DBG_CHN_MESG, "POINTER(%s)<", name);
+ DEBUG_DumpAType(dt->un.pointer.pointsto, FALSE);
+ DEBUG_Printf(DBG_CHN_MESG, ">");
+ break;
+ case DT_STRUCT:
+ DEBUG_Printf(DBG_CHN_MESG, "STRUCT(%s) %d {",
+ name, dt->un.structure.size);
+ if (dt->un.structure.members != NULL)
+ {
+ struct member * m;
+ for (m = dt->un.structure.members; m; m = m->next)
+ {
+ DEBUG_Printf(DBG_CHN_MESG, " %s(%d",
+ m->name, m->offset / 8);
+ if (m->offset % 8 != 0)
+ DEBUG_Printf(DBG_CHN_MESG, ".%d", m->offset / 8);
+ DEBUG_Printf(DBG_CHN_MESG, "/%d", m->size / 8);
+ if (m->size % 8 != 0)
+ DEBUG_Printf(DBG_CHN_MESG, ".%d", m->size % 8);
+ DEBUG_Printf(DBG_CHN_MESG, ")");
+ }
+ }
+ DEBUG_Printf(DBG_CHN_MESG, " }");
+ break;
+ case DT_ARRAY:
+ DEBUG_Printf(DBG_CHN_MESG, "ARRAY(%s)[", name);
+ DEBUG_DumpAType(dt->un.array.basictype, FALSE);
+ DEBUG_Printf(DBG_CHN_MESG, "]");
+ break;
+ case DT_ENUM:
+ DEBUG_Printf(DBG_CHN_MESG, "ENUM(%s)", name);
+ break;
+ case DT_BITFIELD:
+ DEBUG_Printf(DBG_CHN_MESG, "BITFIELD(%s)", name);
+ break;
+ case DT_FUNC:
+ DEBUG_Printf(DBG_CHN_MESG, "FUNC(%s)(", name);
+ DEBUG_DumpAType(dt->un.funct.rettype, FALSE);
+ DEBUG_Printf(DBG_CHN_MESG, ")");
+ break;
+ default:
+ DEBUG_Printf(DBG_CHN_ERR, "Unknown type???");
+ break;
+ }
+ if (deep) DEBUG_Printf(DBG_CHN_MESG, "\n");
+}
+
+int DEBUG_DumpTypes(void)
+{
+ struct datatype * dt = NULL;
+ int hash;
- for(hash = 0; hash < NR_TYPE_HASH + 1; hash++)
+ for (hash = 0; hash < NR_TYPE_HASH + 1; hash++)
{
- for( dt = type_hash_table[hash]; dt; dt = dt->next )
+ for (dt = type_hash_table[hash]; dt; dt = dt->next)
{
- name = "none";
- if( dt->name != NULL )
- {
- name = dt->name;
- }
- switch(dt->type)
- {
- case DT_BASIC:
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - BASIC(%s)\n",
- (unsigned long)dt, name);
- break;
- case DT_POINTER:
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - POINTER(%s)(%08lx)\n",
- (unsigned long)dt, name, (unsigned long)dt->un.pointer.pointsto);
- break;
- case DT_STRUCT:
- member_name = "none";
- nm = 0;
- if( dt->un.structure.members != NULL
- && dt->un.structure.members->name != NULL )
- {
- member_name = dt->un.structure.members->name;
- for( m = dt->un.structure.members; m; m = m->next)
- {
- nm++;
- }
- }
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - STRUCT(%s) %d %d %s\n",
- (unsigned long)dt, name, dt->un.structure.size, nm, member_name);
- break;
- case DT_ARRAY:
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - ARRAY(%s)(%08lx)\n",
- (unsigned long)dt, name, (unsigned long)dt->un.array.basictype);
- break;
- case DT_ENUM:
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - ENUM(%s)\n",
- (unsigned long)dt, name);
- break;
- case DT_BITFIELD:
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - BITFIELD(%s)\n",
- (unsigned long)dt, name);
- break;
- case DT_FUNC:
- DEBUG_Printf(DBG_CHN_MESG, "0x%08lx - FUNC(%s)(%08lx)\n",
- (unsigned long)dt, name, (unsigned long)dt->un.funct.rettype);
- break;
- default:
- DEBUG_Printf(DBG_CHN_ERR, "Unknown type???\n");
- break;
- }
+ DEBUG_DumpAType(dt, TRUE);
}
}
- return TRUE;
+ return TRUE;
}
-
enum debug_type DEBUG_GetType(struct datatype * dt)
{
return dt->type;
+}
+
+const char* DEBUG_GetName(struct datatype * dt)
+{
+ return dt->name;
}
struct datatype *
Index: programs/winedbg/debugger.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winedbg/debugger.h,v
retrieving revision 1.5
diff -u -u -r1.5 debugger.h
--- programs/winedbg/debugger.h 11 Feb 2003 22:05:06 -0000 1.5
+++ programs/winedbg/debugger.h 15 Feb 2003 13:30:43 -0000
@@ -511,11 +509,13 @@
extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
int nbits, struct datatype * dt2);
extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
+extern const char* DEBUG_GetName(struct datatype * dt);
extern enum debug_type DEBUG_GetType(struct datatype * dt);
extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
extern int DEBUG_PrintTypeCast(const struct datatype *);
extern int DEBUG_PrintType( const DBG_VALUE* addr );
extern struct datatype * DEBUG_GetBasicType(enum debug_type_basic);
+extern int DEBUG_DumpTypes(void);
/* debugger/winedbg.c */
#define DBG_CHN_MESG 1
More information about the wine-patches
mailing list