测试之家淘宝店:主营软件测试定制服务
http://shop71136398.taobao.com/
软件评测试考试论坛:http://www.testdao.com/forum-113-1.html
2012软件评测师考试群:28388329
调试版本与发布版本
上一篇 / 下一篇 2007-09-10 22:28:34 / 个人分类:白盒测试
有时程序能在调试版本运行但不能运行于发布版本,反之也有可能。一般说来,一个发布版本意味着某些类型的优化,而一个调试版本则没有优化。下面我们来看看它们的区别:
e`'F-k"J-d A0
&~#Zv;Dh L01、特别针对调试版本的编译选项51Testing软件测试网$?PpyDu
7T6@:g;^V0(1)/MDd,/MLd或者/MTd
:}4L6Ui-@S0|4} MNV0
,Ds"QLs&L2E JuY8j0 调试版本的运行时刻库有调试符号,使用了调试堆,调试堆的目的是发现内存破坏和内存泄漏,并且向用户报告源代码的哪个地方出了问题。特性:
EJ&Rk8`!p |? o0
~/G!M Fj0.调试版本的运行时刻库对内存的分配作了跟踪,允许用户检查内存泄漏。
W5Y-MD'?0~ LS051Testing软件测试网:L%b3rxmTI!k
.在刚分配的内存里写上0xCD的字节模式,用0xCD来填充刚分配的内存,有助于发现数据未被初始化的错误。51Testing软件测试网"p \0Bk"U ax
51Testing软件测试网t@1L6d*p S
.在被释放的内存写上0xDD的字节模式,有助于发现已被释放的内存。
!Vl6iH1]r.zO051Testing软件测试网g`4o9Xoiqt
.在缓冲区的两边分配了四字节的保护数据,并用0xFD的字节模式作初始化,来检查写内存的上溢出和下溢出。51Testing软件测试网@ ]{#@5i1a:Y:WG
51Testing软件测试网_#fb o7tD
.在每个内存分配的地方对源代码文件名和行号作了记录,有助于用户在源代码中对内存分配进行定位。
%C$^~u\ z#}/c051Testing软件测试网$tD$cz8RG5Y%d
(2)/Od51Testing软件测试网!u@)^ R&t*B
q*?H4]B&U8v0 这个选项用来关闭优化开关。因为未被优化的代码直接对应于源代码,所以比优化后的代码更容易读懂。未被优化的代码编译和链接会更快,会有更短的调试周期。而由于优化,发布版本不见得会比调试版本运行得好,优化代码要求编译器做一些假设,去除冗余,但有时这个假设是错误的,并且去掉的冗余也有可能隐藏错误。如发布版本的帧指针(EBP寄存器)省略(FPO)隐藏了函数原型不匹配的错误;在同步异常模式(只能由throw语句抛出,编译器默认,由/GX编译选项设置)下,异常处理程序可能被优化掉,会阻止程序中的C++异常处理代码安全地捕获结构异常,在这种情况下,你必须使用异步异常模式(采取任何指令都会产生异常的机制,由/Eha编译选项设置)。
u(E5K4U,g051Testing软件测试网Q(N4\9i!@
(3)/D "_DEBUG"51Testing软件测试网!C-g(JuXY
51Testing软件测试网,\5]p1?E8j1a N
打开条件编译调试代码开关。只有这个符号被定义,调试代码才会被编译,MFC使用_DEBUG符号来确定到底链接的是哪个版本的MFC类库。在调试版本中,内联默认情况下是被关闭的。
7@$UGjHOB0
U)_N_:} UUk0(4)/ZI51Testing软件测试网$e2S!dCb'qr
51Testing软件测试网1OIpp FFr
创建编辑继续(Edit and Continue)的程序数据库。这个选项会打开/GF编译选项,/GF编译选项会消除重复字符串,并将字符串放到只读内存。编辑继续功能需要获取存储在PDB文件里的特殊信息来使得代码的修改对调试器有效。如果被修改文件对应的信息不在PDB文件里,编辑继续功能就不能进行,而且在调试过程中对代码的任何修改都会出现下面的提示信息"One or more files are out of date or do not exist."。
:jIi:i*hW0
Pqyb&yR0(5)/GZ
3Cb*^QfI J5P051Testing软件测试网N$R8]c-Q5GJ
在调试版本中用来发现那些在发布版本里才发现的错误。其作用如下:
(lq{u]s}&T0
tqZ{ I0x}3P0.用0xCC模式初始化自动(本地)变量。
-R#t-`FvK1`q0
(?f Y b Q)\:u!n0.在通过函数指针调用函数时,检查栈指针,确认是否有调用规则不匹配。51Testing软件测试网c#}8b(k J Q#g&g#z(h#T
U0C#m6^Z$aa9SW0.在函数最后检查栈指针是否被改变。51Testing软件测试网7^Zj1iLZ
51Testing软件测试网4U&^%TG$lz `9w]
(6)/Gm51Testing软件测试网!t Y F4A|MG
51Testing软件测试网1`6Bun|[.M{G
打开最小化重新链接开关,减少链接时间。51Testing软件测试网#O:p.t|#F j7mp
51Testing软件测试网B GT [ wf9?5SEV
2、特别针对发布版本的编译选项
2}0h5E{ v)Ux"Ko GPA051Testing软件测试网n%z%pqY*J%i3Z
(1)/MD,/ML或者/MT51Testing软件测试网 y(Uq b'@&F
!f*Bx8IJ/e s0 使用发布版本的运行时刻库。51Testing软件测试网 L,w(_*i'KfIB*t.Z
51Testing软件测试网D7n3d*zh2a;h
(2)/O1或者/O251Testing软件测试网UO(j"r^n3w5DK p*c
51Testing软件测试网}&V)S3Qb$sohf*Ci
打开优化开关,使得程序会最小或说速度会最快,优化器还可能发现代码中潜在的错误,而这些错误可能会被调试版本掩盖。51Testing软件测试网 c7@ H&Y[-B#wQ3FO
;T)Ld Z A/W6?@iP5{0(3)/D "NDEBUG"51Testing软件测试网v!Hz'v'GQ
51Testing软件测试网8v7H-I%[z#k$@
关闭条件编译调试代码开关。
M&Irg J6^_ ^f051Testing软件测试网}_&mc;{z,z7T A
(4)/GF
9v7?Rf9@?c0
]_)@,@,j0 消除重复字符串并将它们放到只读内存中以避免被错误地修改。51Testing软件测试网iki aYjR2E ^q[z7z
1[4m5t!`-BZ0(5)/Zi51Testing软件测试网xm+No.Wy*[
51Testing软件测试网1ke$VM(dl-aYv7T
创建包含调试符号的程序数据库。51Testing软件测试网J-X4vK|FT\9f
u WJA9LFly)A0 如果一个错误只发生在发布版本里,除非你是个汇编高手,否则你需要调试符号来提示你到底程序出现了什么问题,调试符号保存在程序的数据库文件(PDB)中。Visual C++的AppWizard默认情况下没有为发布版本创建调试符号。为创建调试符号,打开工程设置对话框,选择Win32 Release,在C/C++标签里选择Common类,在调试信息里,如果是发布版本选择Program Database,如果是调试版本选择Program Database for Edit and Continue(编辑继续选项与优化链接不相容,不适于发布版本)。在Link标签里选择Debug类,然后选择Debug Info和Microsoft format选项,最好不要选择Separate types选项,这样所有的调试信息才会被合并到单独的一个PDB文件中。对于发布版本,选择Link标签,在Project options对话框的最后加上"/OPT:REF",这个选项使得不被引用的函数和数据不会出现在可执行文件中,避免了文件的无谓增大。对于调试版本不要使用这个选项,它会关闭增量链接(incremental linking)。51Testing软件测试网}coB3\Gu7D
3B,QyN4W u.H2Ck5f0二、Visual C++编辑器的"设置"菜单
{st W(k,DQO0
%P-? CWB8G:biN0 当你打开或新建一个包含至少一个工程的Workspace后,Visual C++的Project菜单中的"Settings..."命令就变为有效,选择它或者按下热键Alt+F7后,便可调出工程设置对话框,这里面的选项将影响整个工程的建立和调试过程,因此很重要。
p z$EX'Y/B6n0
x;l/`%O G4u0 在这个对话框中,左上方的下拉列表框用于选择一种工程配置,包括有Win32 Debug、Win32 Release和All Configurations(指前两种配置一起),某些选项在不同的工程配置中有不同的缺省值。左边的树形视图给出了当前工程所有的文件及分类情况。下面我们就以Win32 Debug为例来看看与工程有关的的四个主要选项卡的各自功能与含义(一共有十个选项卡):
2W'}K'` D H$@Oc#X0
` F?|CD7q%n;W f{01、 General选项卡
Y/_&\(M%K*\6^051Testing软件测试网'M3h/i&kOO0{ gly N
这个选项卡比较简单,从上向下的第一个选项用于更改使用MFC类库的方式: DLL的方式或是静态连接。我们可以在两种方式之间进行切换。第二个选项用于指定在编译连接过程中生成的中间文件和输出文件的存放目录,对于调试版本来说,缺省的目录是工程下面的"Debug"子目录。第三个选项用于指定是否允许每种工程配置都有自己的文件依赖关系(主要指头文件),由于绝大多数工程的调试版本和发布版本都具有相同的文件依赖关系,所以通常不需要更改该选项。
-` bQ[!z051Testing软件测试网h.?e^r K+b?J
2、 Debug选项卡
}HYE,vy,n'h&c0
P fcqr0 Debug选项卡中是一些与调试有关的选项,由于选项比较多,它们被分成了几个类,我们可以从Category中选择不同的类别,选项卡就会切换显示出相应的选项。
'mN&C7[0A/w0
Oi,}ZDYO@0 在General类别中,可以指定要调试的可执行文件名。另外三个选项可以指定用于调试的工作目录,开始调试时给程序传送的命令行参数,以及进行远程调试时可执行文件的路径。
]*A5H#^fZf051Testing软件测试网 j:|HHn-b_&W
3、C/C++选项卡
t{a5h|0?1UaPm@H051Testing软件测试网i`^4GpgJ#V)I
C/C++选项卡控制着Visual C++的编译器,其中的选项比较多。下面有一个Project Options编辑框,里面列出的各种命令开关将会在开始编译时作为命令行参数传送给Visual C++的编译器。这些命令开关会跟随其它选项改变而改变。51Testing软件测试网+SYjhQ~
51Testing软件测试网\-?S0ef6a I1q
在General类别中,Warning level用于指定编译器显示警告的级别,如果选中了Warnings as errors,那么显示的每一个警告都将会引起一个错误,这样在编译完毕后就无法启动连接器来进行连接。Optimizations用于设置代码优化方式,优化的目的主要有提高运行速度和减小程序体积两种,但有时候这两种目的是相互矛盾的。另外,在极少数情况下,不进行优化,程序能正常运行,打开了优化措施之后,程序却会出现一些莫名其妙的问题。其实这多半是程序中有潜在的错误,关闭优化措施往往只是暂时解决问题。Debug info用于指定编译器产生的调试信息的类型,为了使用Visual C++的即编即调功能,必须在这里选择生成"Program Database for Edit and Continue"类型的调试信息。Preprocessor definitions是一些预先定义的宏名。
T X:oDI#U051Testing软件测试网^0|S"zHsl
C++ Language类别中的选项涉及到了C++语言的一些高级特性,包括有成员指针的表示方式、异常处理、运行时类型信息,一般情况下都不用改变它们。Code Generation类别中的选项涉及如何生成目标代码,一般情况下保持缺省值即可。在Customize类别中,从上到下六个选项的含义分别为:是否禁止使用Microsoft对C++的扩展;是否允许函数级别的连接;是否消除重复的字符串;是否允许进行最小化的重建;是否允许递增编译方式;是否允许编译器在开始运行时向Output窗口中输出自己的版本信息。
M7fjd`seG0
%Vk ^*`C2a@6ah)P0 在Listing Files类别中,我们可以指定编译器生成浏览信息和列表文件(Listing file),前者可由浏览信息维护工具BSCMAKE生成浏览信息文件,后者则包含了C/C++源文件经过编译后对应的汇编指令。Optimizations类别允许我们对优化措施进行更细微的控制,选择了Customize后,便可以选择进行哪几项优化,在Inline function expansion中我们可以指定对内联函数的扩展方式。Precompiled Headers类别中是关于预编译头文件的一些选项,一般情况下都不用更改。Preprocessor类别中是关于预处理的一些选择。
.a0p.O9m'A(c5o Sl&O0
/LkNu L!?"yiA04、Link 选项卡51Testing软件测试网8htG#Q,l*Q#R
fb2dj$J+p0 Link选项卡控制着Visual C++的连接器。在General类别中,可以指定输出的文件名,以及一些在连接过程中需要使用的额外的库文件或目标文件,下边五个选项的含义分别为:生成调试信息;忽略所有缺省的库文件;允许递增连接方式(这种方式可以加快连接的速度);生成MAP文件;允许进行性能分析。在Customize中选中Use program database允许使用程序数据库。在Debug类别中,我们可以指定调试信息的类别是Microsoft的格式,还是COFF格式,或者两种都有,选中Separate types后连接器会把调试信息分开放在PDB文件中,这样连接起来会更快一些,但调试时速度却会慢一些。Input类别中是一些与输入库文件有关的选项,我们可以在这里指定使用或不使用某些库文件或目标文件。Output类别中则是一些与最终输出的可执行文件有关的选项,一般情况下都不用改变。
,ckw8z)p{{\0
6y5X"}C8t+IWn0三、Visual C++调试工具
RX9\;n-aI1j0
l%z0uK3g@9S7f-H"`01、调试窗口
KA0f#NUE yO6~051Testing软件测试网PWN!sD"X^&Dx
(1)观察窗口(Watch)
1f*b[O2z}&D5S0
:O%\.BD/EN"~!^9J0 调试程序时,可使用观察窗口监视变量和表达式。
"l0`r\0ZahF0
N/L Jl8bk0P0(2)快速查看窗口(Quick watch)51Testing软件测试网Eb;e pJ/{
{Wwk!A2iI0 功能和观察窗口差不多。
{O_&mnX"?0
(q3w:m&R8f
e`'F-k"J-d A0
&~#Zv;Dh L01、特别针对调试版本的编译选项51Testing软件测试网$?PpyDu
7T6@:g;^V0(1)/MDd,/MLd或者/MTd
:}4L6Ui-@S0|4} MNV0
,Ds"QLs&L2E JuY8j0 调试版本的运行时刻库有调试符号,使用了调试堆,调试堆的目的是发现内存破坏和内存泄漏,并且向用户报告源代码的哪个地方出了问题。特性:
EJ&Rk8`!p |? o0
~/G!M Fj0.调试版本的运行时刻库对内存的分配作了跟踪,允许用户检查内存泄漏。
W5Y-MD'?0~ LS051Testing软件测试网:L%b3rxmTI!k
.在刚分配的内存里写上0xCD的字节模式,用0xCD来填充刚分配的内存,有助于发现数据未被初始化的错误。51Testing软件测试网"p \0Bk"U ax
51Testing软件测试网t@1L6d*p S
.在被释放的内存写上0xDD的字节模式,有助于发现已被释放的内存。
!Vl6iH1]r.zO051Testing软件测试网g`4o9Xoiqt
.在缓冲区的两边分配了四字节的保护数据,并用0xFD的字节模式作初始化,来检查写内存的上溢出和下溢出。51Testing软件测试网@ ]{#@5i1a:Y:WG
51Testing软件测试网_#fb o7tD
.在每个内存分配的地方对源代码文件名和行号作了记录,有助于用户在源代码中对内存分配进行定位。
%C$^~u\ z#}/c051Testing软件测试网$tD$cz8RG5Y%d
(2)/Od51Testing软件测试网!u@)^ R&t*B
q*?H4]B&U8v0 这个选项用来关闭优化开关。因为未被优化的代码直接对应于源代码,所以比优化后的代码更容易读懂。未被优化的代码编译和链接会更快,会有更短的调试周期。而由于优化,发布版本不见得会比调试版本运行得好,优化代码要求编译器做一些假设,去除冗余,但有时这个假设是错误的,并且去掉的冗余也有可能隐藏错误。如发布版本的帧指针(EBP寄存器)省略(FPO)隐藏了函数原型不匹配的错误;在同步异常模式(只能由throw语句抛出,编译器默认,由/GX编译选项设置)下,异常处理程序可能被优化掉,会阻止程序中的C++异常处理代码安全地捕获结构异常,在这种情况下,你必须使用异步异常模式(采取任何指令都会产生异常的机制,由/Eha编译选项设置)。
u(E5K4U,g051Testing软件测试网Q(N4\9i!@
(3)/D "_DEBUG"51Testing软件测试网!C-g(JuXY
51Testing软件测试网,\5]p1?E8j1a N
打开条件编译调试代码开关。只有这个符号被定义,调试代码才会被编译,MFC使用_DEBUG符号来确定到底链接的是哪个版本的MFC类库。在调试版本中,内联默认情况下是被关闭的。
7@$UGjHOB0
U)_N_:} UUk0(4)/ZI51Testing软件测试网$e2S!dCb'qr
51Testing软件测试网1OIpp FFr
创建编辑继续(Edit and Continue)的程序数据库。这个选项会打开/GF编译选项,/GF编译选项会消除重复字符串,并将字符串放到只读内存。编辑继续功能需要获取存储在PDB文件里的特殊信息来使得代码的修改对调试器有效。如果被修改文件对应的信息不在PDB文件里,编辑继续功能就不能进行,而且在调试过程中对代码的任何修改都会出现下面的提示信息"One or more files are out of date or do not exist."。
:jIi:i*hW0
Pqyb&yR0(5)/GZ
3Cb*^QfI J5P051Testing软件测试网N$R8]c-Q5GJ
在调试版本中用来发现那些在发布版本里才发现的错误。其作用如下:
(lq{u]s}&T0
tqZ{ I0x}3P0.用0xCC模式初始化自动(本地)变量。
-R#t-`FvK1`q0
(?f Y b Q)\:u!n0.在通过函数指针调用函数时,检查栈指针,确认是否有调用规则不匹配。51Testing软件测试网c#}8b(k J Q#g&g#z(h#T
U0C#m6^Z$aa9SW0.在函数最后检查栈指针是否被改变。51Testing软件测试网7^Zj1iLZ
51Testing软件测试网4U&^%TG$lz `9w]
(6)/Gm51Testing软件测试网!t Y F4A|MG
51Testing软件测试网1`6Bun|[.M{G
打开最小化重新链接开关,减少链接时间。51Testing软件测试网#O:p.t|#F j7mp
51Testing软件测试网B GT [ wf9?5SEV
2、特别针对发布版本的编译选项
2}0h5E{ v)Ux"Ko GPA051Testing软件测试网n%z%pqY*J%i3Z
(1)/MD,/ML或者/MT51Testing软件测试网 y(Uq b'@&F
!f*Bx8IJ/e s0 使用发布版本的运行时刻库。51Testing软件测试网 L,w(_*i'KfIB*t.Z
51Testing软件测试网D7n3d*zh2a;h
(2)/O1或者/O251Testing软件测试网UO(j"r^n3w5DK p*c
51Testing软件测试网}&V)S3Qb$sohf*Ci
打开优化开关,使得程序会最小或说速度会最快,优化器还可能发现代码中潜在的错误,而这些错误可能会被调试版本掩盖。51Testing软件测试网 c7@ H&Y[-B#wQ3FO
;T)Ld Z A/W6?@iP5{0(3)/D "NDEBUG"51Testing软件测试网v!Hz'v'GQ
51Testing软件测试网8v7H-I%[z#k$@
关闭条件编译调试代码开关。
M&Irg J6^_ ^f051Testing软件测试网}_&mc;{z,z7T A
(4)/GF
9v7?Rf9@?c0
]_)@,@,j0 消除重复字符串并将它们放到只读内存中以避免被错误地修改。51Testing软件测试网iki aYjR2E ^q[z7z
1[4m5t!`-BZ0(5)/Zi51Testing软件测试网xm+No.Wy*[
51Testing软件测试网1ke$VM(dl-aYv7T
创建包含调试符号的程序数据库。51Testing软件测试网J-X4vK|FT\9f
u WJA9LFly)A0 如果一个错误只发生在发布版本里,除非你是个汇编高手,否则你需要调试符号来提示你到底程序出现了什么问题,调试符号保存在程序的数据库文件(PDB)中。Visual C++的AppWizard默认情况下没有为发布版本创建调试符号。为创建调试符号,打开工程设置对话框,选择Win32 Release,在C/C++标签里选择Common类,在调试信息里,如果是发布版本选择Program Database,如果是调试版本选择Program Database for Edit and Continue(编辑继续选项与优化链接不相容,不适于发布版本)。在Link标签里选择Debug类,然后选择Debug Info和Microsoft format选项,最好不要选择Separate types选项,这样所有的调试信息才会被合并到单独的一个PDB文件中。对于发布版本,选择Link标签,在Project options对话框的最后加上"/OPT:REF",这个选项使得不被引用的函数和数据不会出现在可执行文件中,避免了文件的无谓增大。对于调试版本不要使用这个选项,它会关闭增量链接(incremental linking)。51Testing软件测试网}coB3\Gu7D
3B,QyN4W u.H2Ck5f0二、Visual C++编辑器的"设置"菜单
{st W(k,DQO0
%P-? CWB8G:biN0 当你打开或新建一个包含至少一个工程的Workspace后,Visual C++的Project菜单中的"Settings..."命令就变为有效,选择它或者按下热键Alt+F7后,便可调出工程设置对话框,这里面的选项将影响整个工程的建立和调试过程,因此很重要。
p z$EX'Y/B6n0
x;l/`%O G4u0 在这个对话框中,左上方的下拉列表框用于选择一种工程配置,包括有Win32 Debug、Win32 Release和All Configurations(指前两种配置一起),某些选项在不同的工程配置中有不同的缺省值。左边的树形视图给出了当前工程所有的文件及分类情况。下面我们就以Win32 Debug为例来看看与工程有关的的四个主要选项卡的各自功能与含义(一共有十个选项卡):
2W'}K'` D H$@Oc#X0
` F?|CD7q%n;W f{01、 General选项卡
Y/_&\(M%K*\6^051Testing软件测试网'M3h/i&kOO0{ gly N
这个选项卡比较简单,从上向下的第一个选项用于更改使用MFC类库的方式: DLL的方式或是静态连接。我们可以在两种方式之间进行切换。第二个选项用于指定在编译连接过程中生成的中间文件和输出文件的存放目录,对于调试版本来说,缺省的目录是工程下面的"Debug"子目录。第三个选项用于指定是否允许每种工程配置都有自己的文件依赖关系(主要指头文件),由于绝大多数工程的调试版本和发布版本都具有相同的文件依赖关系,所以通常不需要更改该选项。
-` bQ[!z051Testing软件测试网h.?e^r K+b?J
2、 Debug选项卡
}HYE,vy,n'h&c0
P fcqr0 Debug选项卡中是一些与调试有关的选项,由于选项比较多,它们被分成了几个类,我们可以从Category中选择不同的类别,选项卡就会切换显示出相应的选项。
'mN&C7[0A/w0
Oi,}ZDYO@0 在General类别中,可以指定要调试的可执行文件名。另外三个选项可以指定用于调试的工作目录,开始调试时给程序传送的命令行参数,以及进行远程调试时可执行文件的路径。
]*A5H#^fZf051Testing软件测试网 j:|HHn-b_&W
3、C/C++选项卡
t{a5h|0?1UaPm@H051Testing软件测试网i`^4GpgJ#V)I
C/C++选项卡控制着Visual C++的编译器,其中的选项比较多。下面有一个Project Options编辑框,里面列出的各种命令开关将会在开始编译时作为命令行参数传送给Visual C++的编译器。这些命令开关会跟随其它选项改变而改变。51Testing软件测试网+SYjhQ~
51Testing软件测试网\-?S0ef6a I1q
在General类别中,Warning level用于指定编译器显示警告的级别,如果选中了Warnings as errors,那么显示的每一个警告都将会引起一个错误,这样在编译完毕后就无法启动连接器来进行连接。Optimizations用于设置代码优化方式,优化的目的主要有提高运行速度和减小程序体积两种,但有时候这两种目的是相互矛盾的。另外,在极少数情况下,不进行优化,程序能正常运行,打开了优化措施之后,程序却会出现一些莫名其妙的问题。其实这多半是程序中有潜在的错误,关闭优化措施往往只是暂时解决问题。Debug info用于指定编译器产生的调试信息的类型,为了使用Visual C++的即编即调功能,必须在这里选择生成"Program Database for Edit and Continue"类型的调试信息。Preprocessor definitions是一些预先定义的宏名。
T X:oDI#U051Testing软件测试网^0|S"zHsl
C++ Language类别中的选项涉及到了C++语言的一些高级特性,包括有成员指针的表示方式、异常处理、运行时类型信息,一般情况下都不用改变它们。Code Generation类别中的选项涉及如何生成目标代码,一般情况下保持缺省值即可。在Customize类别中,从上到下六个选项的含义分别为:是否禁止使用Microsoft对C++的扩展;是否允许函数级别的连接;是否消除重复的字符串;是否允许进行最小化的重建;是否允许递增编译方式;是否允许编译器在开始运行时向Output窗口中输出自己的版本信息。
M7fjd`seG0
%Vk ^*`C2a@6ah)P0 在Listing Files类别中,我们可以指定编译器生成浏览信息和列表文件(Listing file),前者可由浏览信息维护工具BSCMAKE生成浏览信息文件,后者则包含了C/C++源文件经过编译后对应的汇编指令。Optimizations类别允许我们对优化措施进行更细微的控制,选择了Customize后,便可以选择进行哪几项优化,在Inline function expansion中我们可以指定对内联函数的扩展方式。Precompiled Headers类别中是关于预编译头文件的一些选项,一般情况下都不用更改。Preprocessor类别中是关于预处理的一些选择。
.a0p.O9m'A(c5o Sl&O0
/LkNu L!?"yiA04、Link 选项卡51Testing软件测试网8htG#Q,l*Q#R
fb2dj$J+p0 Link选项卡控制着Visual C++的连接器。在General类别中,可以指定输出的文件名,以及一些在连接过程中需要使用的额外的库文件或目标文件,下边五个选项的含义分别为:生成调试信息;忽略所有缺省的库文件;允许递增连接方式(这种方式可以加快连接的速度);生成MAP文件;允许进行性能分析。在Customize中选中Use program database允许使用程序数据库。在Debug类别中,我们可以指定调试信息的类别是Microsoft的格式,还是COFF格式,或者两种都有,选中Separate types后连接器会把调试信息分开放在PDB文件中,这样连接起来会更快一些,但调试时速度却会慢一些。Input类别中是一些与输入库文件有关的选项,我们可以在这里指定使用或不使用某些库文件或目标文件。Output类别中则是一些与最终输出的可执行文件有关的选项,一般情况下都不用改变。
,ckw8z)p{{\0
6y5X"}C8t+IWn0三、Visual C++调试工具
RX9\;n-aI1j0
l%z0uK3g@9S7f-H"`01、调试窗口
KA0f#NUE yO6~051Testing软件测试网PWN!sD"X^&Dx
(1)观察窗口(Watch)
1f*b[O2z}&D5S0
:O%\.BD/EN"~!^9J0 调试程序时,可使用观察窗口监视变量和表达式。
"l0`r\0ZahF0
N/L Jl8bk0P0(2)快速查看窗口(Quick watch)51Testing软件测试网Eb;e pJ/{
{Wwk!A2iI0 功能和观察窗口差不多。
{O_&mnX"?0
(q3w:m&R8f