📄 mscvpdb.h
字号:
/*
* MS debug information definitions.
*
* Copyright (C) 1996 Eric Youngdale
* Copyright (C) 1999-2000 Ulrich Weigand
* Copyright (C) 2004 Eric Pouech
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* MS has stored all its debug information in a set of structures
* which has been rather consistent across the years (ie you can grasp
* some continuity, and not so many drastic changes).
*
* A bit of history on the various formats
* MSVC 1.0 PDB v1 (new format for debug info)
* MSVC 2.0 Inclusion in link of debug info (PDB v2)
* MSVC 5.0 Types are 24 bits (instead of 16 for <= 4.x)
* MSVC x.0 PDB (change in internal streams layout)
*
* .DBG Contains COFF, FPO and Codeview info
* .PDB New format for debug info (information is
* derived from Codeview information)
* VCx0.PDB x major MSVC number, stores types, while
* <project>.PDB stores symbols.
*
* Debug information can either be found in the debug section of a PE
* module (in something close to a .DBG file), or the debug section
* can actually refer to an external file, which can be in turn,
* either a .DBG or .PDB file.
*
* Regarding PDB files:
* -------------------
* They are implemented as a set of internal files (as a small file
* system). The file is split into blocks, an internal file is made
* of a set of blocks. Internal files are accessed through
* numbers. For example,
* 1/ is the ROOT (basic information on the file)
* 2/ is the Symbol information (global symbols, local variables...)
* 3/ is the Type internal file (each the symbols can have type
* information associated with it).
*
* Over the years, three formats existed for the PDB:
* - ?? was rather linked to 16 bit code (our support shall be rather
* bad)
* - JG: it's the signature embedded in the file header. This format
* has been used in MSVC 2.0 => 5.0.
* - DS: it's the signature embedded in the file header. It's the
* current format supported my MS.
*
* Types internal stream
* ---------------------
* Types (from the Type internal file) have existed in three flavors
* (note that those flavors came as historical evolution, but there
* isn't a one to one link between types evolution and PDB formats'
* evolutions:
* - the first flavor (suffixed by V1 in this file), where the types
* and subtypes are 16 bit entities; and where strings are in Pascal
* format (first char is their length and are not 0 terminated)
* - the second flavor (suffixed by V2) differs from first flavor with
* types and subtypes as 32 bit entities. This forced some
* reordering of fields in some types
* - the third flavor (suffixed by V3) differs from second flavor with
* strings stored as C strings (ie are 0 terminated, instead of
* length prefixed)
* The different flavors can coexist in the same file (is this really
* true ??)
*
* For the evolution of types, the need of the second flavor was the
* number of types to be defined (limited to 0xFFFF, including the C
* basic types); the need of the third flavor is the increase of
* symbol size (to be greated than 256), which was likely needed for
* complex C++ types (nested + templates).
*
* It's somehow difficult to represent the layout of those types on
* disk because:
* - some integral values are stored as numeric leaf, which size is
* variable depending on its value
*
* Symbols internal stream
* -----------------------
* Here also we find three flavors (that we've suffixed with _V1, _V2
* and _V3) even if their evolution is closer to the evolution of
* types, there are not completly linked together.
*/
#include "pshpack1.h"
/* ======================================== *
* Type information
* ======================================== */
struct p_string
{
unsigned char namelen;
char name[1];
};
union codeview_type
{
struct
{
unsigned short int len;
short int id;
} generic;
struct
{
unsigned short int len;
short int id;
short int attribute;
short int type;
} modifier_v1;
struct
{
unsigned short int len;
short int id;
int type;
short int attribute;
} modifier_v2;
struct
{
unsigned short int len;
short int id;
short int attribute;
short int datatype;
struct p_string p_name;
} pointer_v1;
struct
{
unsigned short int len;
short int id;
unsigned int datatype;
unsigned int attribute;
struct p_string p_name;
} pointer_v2;
struct
{
unsigned short int len;
short int id;
unsigned char nbits;
unsigned char bitoff;
unsigned short type;
} bitfield_v1;
struct
{
unsigned short int len;
short int id;
unsigned int type;
unsigned char nbits;
unsigned char bitoff;
} bitfield_v2;
struct
{
unsigned short int len;
short int id;
short int elemtype;
short int idxtype;
unsigned short int arrlen; /* numeric leaf */
#if 0
struct p_string p_name;
#endif
} array_v1;
struct
{
unsigned short int len;
short int id;
unsigned int elemtype;
unsigned int idxtype;
unsigned short int arrlen; /* numeric leaf */
#if 0
struct p_string p_name;
#endif
} array_v2;
struct
{
unsigned short int len;
short int id;
unsigned int elemtype;
unsigned int idxtype;
unsigned short int arrlen; /* numeric leaf */
#if 0
char name[1];
#endif
} array_v3;
struct
{
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
struct p_string p_name;
#endif
} struct_v1;
struct
{
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
struct p_string p_name;
#endif
} struct_v2;
struct
{
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
char name[1];
#endif
} struct_v3;
struct
{
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
struct p_string p_name;
#endif
} union_v1;
struct
{
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
struct p_string p_name;
#endif
} union_v2;
struct
{
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
char name[1];
#endif
} union_v3;
struct
{
unsigned short int len;
short int id;
short int count;
short int type;
short int field;
short int property;
struct p_string p_name;
} enumeration_v1;
struct
{
unsigned short int len;
short int id;
short int count;
short int property;
unsigned int type;
unsigned int field;
struct p_string p_name;
} enumeration_v2;
struct
{
unsigned short int len;
short int id;
short int count;
short int property;
unsigned int type;
unsigned int field;
char name[1];
} enumeration_v3;
struct
{
unsigned short int len;
short int id;
unsigned char list[1];
} fieldlist;
struct
{
unsigned short int len;
short int id;
unsigned short int rvtype;
unsigned char call;
unsigned char reserved;
unsigned short int params;
unsigned short int arglist;
} procedure_v1;
struct
{
unsigned short int len;
short int id;
unsigned int rvtype;
unsigned char call;
unsigned char reserved;
unsigned short int params;
unsigned int arglist;
} procedure_v2;
struct
{
unsigned short int len;
short int id;
unsigned short int rvtype;
unsigned short int class_type;
unsigned short int this_type;
unsigned char call;
unsigned char reserved;
unsigned short int params;
unsigned short int arglist;
unsigned int this_adjust;
} mfunction_v1;
struct
{
unsigned short int len;
short int id;
unsigned unknown1; /* could be this_type ??? */
unsigned int class_type;
unsigned int rvtype;
unsigned char call;
unsigned char reserved;
unsigned short params;
unsigned int arglist;
unsigned int this_adjust;
} mfunction_v2;
};
union codeview_fieldtype
{
struct
{
short int id;
} generic;
struct
{
short int id;
short int type;
short int attribute;
unsigned short int offset; /* numeric leaf */
} bclass_v1;
struct
{
short int id;
short int attribute;
unsigned int type;
unsigned short int offset; /* numeric leaf */
} bclass_v2;
struct
{
short int id;
short int btype;
short int vbtype;
short int attribute;
unsigned short int vbpoff; /* numeric leaf */
#if 0
unsigned short int vboff; /* numeric leaf */
#endif
} vbclass_v1;
struct
{
short int id;
short int attribute;
unsigned int btype;
unsigned int vbtype;
unsigned short int vbpoff; /* numeric leaf */
#if 0
unsigned short int vboff; /* numeric leaf */
#endif
} vbclass_v2;
struct
{
short int id;
short int attribute;
unsigned short int value; /* numeric leaf */
#if 0
struct p_string p_name;
#endif
} enumerate_v1;
struct
{
short int id;
short int attribute;
unsigned short int value; /* numeric leaf */
#if 0
char name[1];
#endif
} enumerate_v3;
struct
{
short int id;
short int type;
struct p_string p_name;
} friendfcn_v1;
struct
{
short int id;
short int _pad0;
unsigned int type;
struct p_string p_name;
} friendfcn_v2;
struct
{
short int id;
short int type;
short int attribute;
unsigned short int offset; /* numeric leaf */
#if 0
struct p_string p_name;
#endif
} member_v1;
struct
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -