符号文件是调试器工作的重要依据,对很多调试功能都起着重要作用,例如栈回溯、源代码级跟踪、变量观察等等。符号文件大多是二进制的,而且不同编译器使用的文件格式有所不同。
SymView工具用来显示符号文件中包含的符号表和符号数据。目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件。
SymView提供了以下多种方式来查看或者搜索符号文件的内容:
符号表 PDB或DBG文件中可以包含6种符号表,分别为符号表、源文件表、节贡献表、段表、注入源代码表和帧数据表。
编译素材(Compiland) 用于产生可执行文件的各种素材文件,包括OBJ、DLL、RES等。
数据流 比如描述FPO的FPO数据流。
符号类标(Tag) 根据所描述对象,符号被分为函数、常量、用户定义类型(UDT)、类型、常量等30多个类型。
搜索 可以按照符号逻辑关系或者符号名称等搜索符号。
下图是SymView的一个截图,左侧提供了上面介绍的5种观察视图。右侧上方的网格窗口用于显示左侧选中表格或者符号类的所有数据行或者符号。右侧下方用于显示上方选中行的子符号或者相关信息(属性)。 例如,目前使用的符号类表视图,选中的是UDT类型,右侧上方显示的是目前符号文件(NT内核的公共符号文件)中的所有UDT类型的符号。右侧下方显示的是上方选中的_DBGKD_BREAKPOINTEX类型的所有属性。
如下图:
最下方的窗口用户显示SymView程序自身的调试信息,可能包含它工作过程中遇到的异常或者错误情况。
安装方法
目前,SymView只由一个文件组成,即SymView.exe。只要通过下面的链接下载压缩包后,将其中的文件解压缩到你喜欢的位置就可以了。
值得说明的是,SymView是基于微软的DIASDK开发的,在工作时,它需要系统中已经有DIASDK的COM组件存在。如果你的系统中安装了Visual Studio 2005或者更高的版本的,那么这个组件应该已经安装好了。否则的话,你需要下载msdia80.dll并在命令行窗口执行如下命令进行注册:
regsvr32 msdia80.dll
应该在msdia80.dll所在目录中执行以上命令,或者指定完整的路径。
内部实现
SymView是基于微软的DIASDK开发的。DIASDK是Debug Interface Access SDK的简称。以Visual Studio 2005为例,DIASDK默认被安装在如下目录中:
c:\Program Files\Microsoft Visual Studio 8\DIA SDK
使用DIA组件的方法与使用其它COM组件一样,先要初始化COM支持库,然后创建接口的实例,即:
hr = CoInitialize(NULL); // Obtain Access To The Provider hr = CoCreateInstance(__uuidof(DiaSource),//CLSID_DiaSource, NULL,
CLSCTX_INPROC_SERVER, __uuidof(IDiaDataSource), (void **) &m_pDiaDataSource); if(hr != S_OK) { Msg(L"CoCreateInstance failed - HRESULT = %x\n",hr); return hr; }
描述符号的主要接口是IDiaSymbol,它有上百个属性,对应于不同的符号信息。MSDN中描述了DIA接口,尽管不够详尽,但是涵盖了几乎所有接口。
如何编译源代码
如果你希望自己重新编译SymView程序,那么可以通过下面的链接下载源程序包。下载后解压到一个名为SymView的目录中。
尽管包中的项目文件是VC6格式的,但是转化成更高版本的VC编译器然后编译应该不是大问题。
值得注意的是,因为SymView是基于Dia SDK构建的,所以在编译时需要DIASDK的头文件和LIB文件,目前项目文件中是假定DIA SDK是位于当前项目的上一级目录的,即:
DIASDK
--include
--lib
SymView
--*.cpp
--symview.dsw
--...
所以一种简单的方法就是将DIASDK复制一份到与SymView平行的目录,不然的话需要调整项目设置,使其可以找到DIASDK的文件。
附件下载
包含SymView.exe的压缩包(216KB)
包含msdia80.dll的压缩包(639KB)msdia80.zip
SymView程序的完整源代码(358KB)symv_src.zip
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!