扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:ghost 来源:CSDN 2007年9月24日
关键字:
在本页阅读全文(共2页)
生成调试信息
构造(build)过程
一个典型的可执行文件的构造过程包含两步:编译和链接。首先,编译器分析源文件,生成机器指令(保存在.obj对象文件中);然后链接器将所有可用的对象文件合并到最终的可执行文件。在对象文件之外,链接器也会用到库文件(库文件也是其他一些对象文件的汇集)。整个构造过程如下图:
如果我们想要为可执行文件生成调试信息,也得经历两步:首先,编译器为每一个源文件创建调试信息;然后,链接器合并由编译器创建得调试信息,如下图:
缺省状态下,编译器和链接器不会产生调试信息。因此我们必须通过编译和链接选项来要求编译器和链接器生成调试信息,我们也可以指定生成哪些类型得调试信息,使用什么调试信息格式,将调试信息保存在什么地方。
接下来,我讨论具体得编译器和链接器选项。
Visual C++ 6.0
编译器 Compiler
有下列选项:
/Zd 生成COFF格式的调试信息,保存在对象文件中
/Z7 生成CodeView格式的调试信息,保存在对象文件中
/Zi 生成程序数据库格式的调试信息,保存在.PDB文件中
/ZI 与 /Zi 基本一致, 唯一不同的是调试信息中包含编辑和继续执行信息
缺省时,/Zi 和 /ZI 选项生成的PDB文件名为VC60.PDB,也可以使用/Fd指定文件名。
选项
格式
存储文件
内容
/Zd
COFF
.OBJ 公共函数和变量
源文件和代码行信息
FPO信息
/Z7
CodeView
.OBJ 公共函数和变量
私有函数和变量
源文件和代码行信息
类型信息
FPO信息
/Zi
Program Database
.PDB 公共函数和变量
私有函数和变量
源文件和代码行信息
类型信息
FPO信息
/ZI
Program Database
.PDB 公共函数和变量
私有函数和变量
源文件和代码行信息
类型信息
FPO信息
编辑和继续执行信息
链接器Linker
下列选项可用:
/debug 告诉链接器生成调试信息,如果该选项不使用,则其他所有选项都无效
/debugtype 指定调试信息格式,可能的用法包括:
/debugtype:coff COFF格式。注意:该选项下,调试信息中不包含源文件和代码行信息
/debugtype:cv CodeView或程序数据库格式。究竟是哪一种格式,由/pdb决定
/debugtype:both 同时使用COFF格式和CodeView/程序数据库格式
/pdb 决定是CodeView还是程序数据库格式。/pdb:none 表示CodeView格式,/pdb:filename(如/pdb:myexe.pdb)表示使用程序数据库格式,文件名为myexe.pdb。在/debugtype:coff 选项下,/pdb 选项无效。
/pdbtype 该选项只在一个或多个对象文件或库文件的调试信息也保存在一个单独的PDB文件中。/pdbtype:sept 选项可以使得调试信息各自保存在各自的PDB文件中,这样可以加快链接速度,不利的是调试信息分散,调试时需要多个PDB文件。相对的,/pdbtype:con 选项使得所有调试信息都保存在与可执行文件对应的最终的PDB文件中。
为便于理解各个选项的配对使用,请见下表:
/debugtype
/pdb
格式
存储
coff
/pdb:none (无效)
COFF
在可执行文件中
coff
/pdb:filename (无效)
COFF
在可执行文件中
cv
/pdb:none
CodeView
在可执行文件中
cv
/pdb:filename
Program Database
.PDB 文件
both
/pdb:none
COFF and CodeView
在可执行文件中
both
/pdb:filename
COFF and Program Database
COFF 信息在可执行文件中, 程序数据库信息在 .PDB 文件中
Visual C++.NET (2002 and 2003)
编译器 Compiler
下列选项可用:
/Z7 生成CodeView格式的调试信息,保存在对象文件中
/Zd, /Zi 和 /ZI都表示生成程序数据库格式的调试信息,保存在.PDB文件中. 不同之处是调试信息的内容(见下表)。
缺省时,/Zd,/Zi 和 /ZI 选项生成的PDB文件名为VC70.PDB或VC71.PDB,也可以使用/Fd指定文件名。
注意: VC++.NET 编译器不支COFF。
选项
格式
存储
内容
/Z7
CodeView
.OBJ 公共函数和变量
私有函数和变量
源文件和代码行信息
类型信息
FPO信息
/Zd
Program Database
.PDB 公共函数和变量
源文件和代码行信息
FPO信息
/Zi
Program Database
.PDB 公共函数和变量
私有函数和变量
源文件和代码行信息
类型信息
FPO信息
/ZI
Program Database
.PDB 公共函数和变量
私有函数和变量
源文件和代码行信息
类型信息
FPO信息
编辑和继续执行信息
链接器Linker
下列选项可用:
/debug告诉链接器生成调试信息,如果该选项不使用,则其他所有选项都无效。调试信息的格式总是程序数据库格式,保存在PDB文件中。缺省的,链接器使用可执行文件名生成PDB文件名。PDB文件名可包含所有调试信息的变量内容。
/pdb 指定PDB文件名.
/pdbstripped 允许链接器生成附加的PDB文件,该文件的内容限定于:
公共函数和变量
FPO信息
注意: COFF 和 CodeView 格式不被 VC++.NET链接器支持。
静态库的调试信息
由于没有连接过程,静态库的调试信息的生成比可执行文件要简单的多。不考虑编译器版本(VC6 或 VS.NET),我们可以使用(/Zd, /Z7, /Zi, /ZI)中一个选项通知编译器为静态库生成调试信息。
关键问题是将调试信息保存在什么地方。当使用/Z7或/Zd选项时,调试信息保存在.LIB文件中;当使用/Zi或/ZI选项时,调试信息保存在.PDB文件中(当然可以使用/Fd指定文件名)。
调试信息对可执行文件的大小的影响
调试信息对可执行文件的大小的影响,决定于存储调试信息的地方,也间接的决定于所使用的格式。
COFF和CodeView格式下,调试信息保存在可执行文件中,因此可执行文件的大小将显著增长(通常要增长一倍以上,甚至更大)。
程序数据库格式下,调试信息单独保存,对可执行文件的大小几乎没有影响。在这种情况下,可执行文件需要保存一个头信息方便调试器对调试信息进行定位,因此需要增长大约几百个字节。
要避免可执行文件的膨胀,我们需要在使用/debug 同时,将/opt:ref 选项改为opt:noref。这样做,有一个另外的结果就是关闭了链接器的大小优化。如果要恢复大小优化,需要改回/opt:ref。
.DBG 文件
使用一个小工具——Rebase——可以将CodeView格式的内容从可执行文件中导出,存入到DBG文件中。Rebase包含在Visual Studio中。除了用于导出DBG文件外,它还有其他的一些用途。如果用于导出DBG文件,其命令行格式为:
rebase –b BaseAddr –x SymbolDir [-p] ExeName
选项
描述
-b BaseAddr
指定可执行文件的基地址,如果你不想更改基地址,就指定当前可执行文件所使用的地址
-x SymbolDir
制定存放.DBG文件的目录, 使用“.”表示当前目录
-p
如果该选项被使用,DBG文件只包含公共函数和变量和FPO信息
例如:下面的命令行从DLL中导出调试信息到当前目录下的DBG文件中: rebase –b 0x60000000 –x . MyDll.dll
调试器和调试信息的格式
通用的调试器支持的格式如下:
调试器
COFF
CodeView
Program Database (2.0)
Program Database (7.0)
Visual Studio.NET
-
+
+
+
Visual C++ 6.0
+
+
+
-
WinDbg 6.3
+
部分支持
+
+
WinDbg 6.3 部分支持CodeView格式,它只能读取下列信息:
公共函数和变量
FPO信息
源文件和代码行信息
它可以单步进入源代码,看到调用堆栈,但无法观察变量的值(因此类型信息不被支持).
操作系统符号文件(symbols)
Windows操作系统所公开的调试系统格式如下:
操作系统
格式
Windows NT 4.0
CodeView (.DBG files)
Windows 2000
CodeView (.DBG files) and Program Database (2.0)
Windows XP
(including SP1 and SP1a)
Program Database (2.0)
Windows XP SP2
Program Database (7.0)
Windows 2003 Server
Program Database (2.0)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1798204
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者