Fix for MS debug info problems with winedbg (with patch!)
Dave Hawkes
daveh-wine at cadlink.com
Thu Dec 6 14:43:06 CST 2001
Fix for some types of C++ debug info that can cause winedbg to crash.
Dave Hawkes
-------------- next part --------------
Index: debugger/msc.c
===================================================================
RCS file: /home/wine/wine/debugger/msc.c,v
retrieving revision 1.43
diff -u -r1.43 msc.c
--- debugger/msc.c 2001/08/21 17:07:17 1.43
+++ debugger/msc.c 2001/12/06 18:03:16
@@ -540,153 +540,153 @@
{
struct
{
- short int len;
- short int id;
+ unsigned short int len;
+ short int id;
} generic;
struct
{
- short int len;
- short int id;
- short int attribute;
- short int datatype;
- unsigned char variant[1];
+ unsigned short int len;
+ short int id;
+ short int attribute;
+ short int datatype;
+ unsigned char variant[1];
} pointer;
struct
{
- short int len;
- short int id;
- unsigned int datatype;
- unsigned int attribute;
- unsigned char variant[1];
+ unsigned short int len;
+ short int id;
+ unsigned int datatype;
+ unsigned int attribute;
+ unsigned char variant[1];
} pointer32;
struct
{
- short int len;
- short int id;
- unsigned char nbits;
- unsigned char bitoff;
- unsigned short type;
+ unsigned short int len;
+ short int id;
+ unsigned char nbits;
+ unsigned char bitoff;
+ unsigned short type;
} bitfield;
struct
{
- short int len;
- short int id;
- unsigned int type;
- unsigned char nbits;
- unsigned char bitoff;
+ unsigned short int len;
+ short int id;
+ unsigned int type;
+ unsigned char nbits;
+ unsigned char bitoff;
} bitfield32;
struct
{
- short int len;
- short int id;
- short int elemtype;
- short int idxtype;
- unsigned short int arrlen; /* numeric leaf */
+ unsigned short int len;
+ short int id;
+ short int elemtype;
+ short int idxtype;
+ unsigned short int arrlen; /* numeric leaf */
#if 0
- unsigned char name[1];
+ unsigned char name[1];
#endif
} array;
struct
{
- short int len;
- short int id;
- unsigned int elemtype;
- unsigned int idxtype;
- unsigned short int arrlen; /* numeric leaf */
+ unsigned short int len;
+ short int id;
+ unsigned int elemtype;
+ unsigned int idxtype;
+ unsigned short int arrlen; /* numeric leaf */
#if 0
- unsigned char name[1];
+ unsigned char name[1];
#endif
} array32;
struct
{
- short int len;
- short int id;
- short int n_element;
- short int fieldlist;
- short int property;
- short int derived;
- short int vshape;
- unsigned short int structlen; /* numeric leaf */
+ unsigned short int len;
+ short int id;
+ short int n_element;
+ short int fieldlist;
+ short int property;
+ short int derived;
+ short int vshape;
+ unsigned short int structlen; /* numeric leaf */
#if 0
- unsigned char name[1];
+ unsigned char name[1];
#endif
} structure;
struct
{
- short int len;
- short int id;
- short int n_element;
- short int property;
- unsigned int fieldlist;
- unsigned int derived;
- unsigned int vshape;
- unsigned short int structlen; /* numeric leaf */
+ unsigned short int len;
+ short int id;
+ short int n_element;
+ short int property;
+ unsigned int fieldlist;
+ unsigned int derived;
+ unsigned int vshape;
+ unsigned short int structlen; /* numeric leaf */
#if 0
- unsigned char name[1];
+ unsigned char name[1];
#endif
} structure32;
struct
{
- short int len;
- short int id;
- short int count;
- short int fieldlist;
- short int property;
- unsigned short int un_len; /* numeric leaf */
+ unsigned short int len;
+ short int id;
+ short int count;
+ short int fieldlist;
+ short int property;
+ unsigned short int un_len; /* numeric leaf */
#if 0
- unsigned char name[1];
+ unsigned char name[1];
#endif
} t_union;
struct
{
- short int len;
- short int id;
- short int count;
- short int property;
- unsigned int fieldlist;
- unsigned short int un_len; /* numeric leaf */
+ unsigned short int len;
+ short int id;
+ short int count;
+ short int property;
+ unsigned int fieldlist;
+ unsigned short int un_len; /* numeric leaf */
#if 0
- unsigned char name[1];
+ unsigned char name[1];
#endif
} t_union32;
struct
{
- short int len;
- short int id;
- short int count;
- short int type;
- short int field;
- short int property;
- unsigned char name[1];
+ unsigned short int len;
+ short int id;
+ short int count;
+ short int type;
+ short int field;
+ short int property;
+ unsigned char name[1];
} enumeration;
struct
{
- short int len;
- short int id;
- short int count;
- short int property;
- unsigned int type;
- unsigned int field;
- unsigned char name[1];
+ unsigned short int len;
+ short int id;
+ short int count;
+ short int property;
+ unsigned int type;
+ unsigned int field;
+ unsigned char name[1];
} enumeration32;
struct
{
- short int len;
- short int id;
- unsigned char list[1];
+ unsigned short int len;
+ short int id;
+ unsigned char list[1];
} fieldlist;
};
@@ -1569,7 +1569,8 @@
struct datatype *list = DEBUG_GetCVType( fieldlist );
if ( list )
- DEBUG_CopyFieldlist( dt, list );
+ if(DEBUG_CopyFieldlist( dt, list ) == FALSE)
+ return FALSE;
return DEBUG_AddCVType( typeno, dt );
}
@@ -1583,7 +1584,8 @@
if ( list )
{
DEBUG_SetStructSize( dt, structlen );
- DEBUG_CopyFieldlist( dt, list );
+ if(DEBUG_CopyFieldlist( dt, list ) == FALSE)
+ return FALSE;
}
return DEBUG_AddCVType( typeno, dt );
Index: debugger/types.c
===================================================================
RCS file: /home/wine/wine/debugger/types.c,v
retrieving revision 1.24
diff -u -r1.24 types.c
--- debugger/types.c 2001/04/23 18:10:32 1.24
+++ debugger/types.c 2001/12/06 18:03:16
@@ -569,8 +569,14 @@
int
DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2)
{
-
- assert( dt->type == dt2->type && ((dt->type == DT_STRUCT) || (dt->type == DT_ENUM)));
+ if (!(dt->type == dt2->type && ((dt->type == DT_STRUCT) || (dt->type == DT_ENUM)))) {
+ DEBUG_Printf(DBG_CHN_MESG, "Error: Copyfield list mismatch (%d<>%d): ", dt->type, dt2->type);
+ DEBUG_PrintTypeCast(dt);
+ DEBUG_Printf(DBG_CHN_MESG, " ");
+ DEBUG_PrintTypeCast(dt2);
+ DEBUG_Printf(DBG_CHN_MESG, "\n");
+ return FALSE;
+ }
if( dt->type == DT_STRUCT )
{
@@ -1023,6 +1029,12 @@
DEBUG_PrintTypeCast(const struct datatype * dt)
{
const char* name = "none";
+
+ if(dt == NULL)
+ {
+ DEBUG_Printf(DBG_CHN_MESG, "--invalid--");
+ return FALSE;
+ }
if( dt->name != NULL )
{
More information about the wine-patches
mailing list