📄 book_text12.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://www1.ustc.edu.cn/personal/csli/insidec++/book_text12.htm -->
<HTML><HEAD><TITLE>Visual C++</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2995" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><LINK
href="book_text12.files/style.css" type=text/css rel=stylesheet></HEAD>
<BODY bgColor=#f7fbff leftMargin=0 topMargin=0>
<TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="3%" background=book_text12.files/page_side.gif
height="100%"> </TD>
<TD vAlign=top align=middle width="97%">
<P
style="mso-line-height-alt: 1.3pt; tab-stops: right dotted 402.1pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"></O:P></SPAN></P>
<TABLE height=23 width="99%" border=0>
<TBODY>
<TR>
<TD width="2%" height=29></TD>
<TD width="95%" height=29><PRE><A name=_Toc419881649><SPAN style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman; mso-bookmark: _Toc419740467">四、<SPAN lang=EN-US>VC程序调试</SPAN></SPAN></A></PRE></TD>
<TD width="3%" height=29></TD></TR>
<TR>
<TD width="2%" height=15></TD>
<TD width="95%" height=15>
<H2 style="mso-line-height-alt: 1.3pt"><A name=_Toc419881655><SPAN
lang=EN-US
style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: Arial; mso-bookmark: _Toc419740473">2
高级调试技术</SPAN></A><SPAN lang=EN-US
style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: Arial"><O:P>
</O:P></SPAN></H2>
<P class=MsoNormal
style="TEXT-INDENT: 27pt; mso-line-height-alt: 1.3pt"><SPAN
style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'">前面我们讲了调试工具的使用,利用它可以就进行常规的调试,即使程序在某处停下来,再观察程序的当前壮态。而且这些工具在且它调试器中也有。但我们知道我们知道在<SPAN
lang=EN-US>VC程序的开发过程中,光有这些工具是不够的。为了更快更好地开发程序,我们还需要利用更高级的调试工具。我们知道,在利用VC开发过程中,利用MFC将会极大地方便应用程序的开发,所以开发人员往往是利用MFC来开发应用程序,正是这个原因Microsoft公司在MFC中提供了一些特性来帮助你进行程序的调试。<O:P>
</O:P></SPAN></SPAN></P>
<P class=MsoNormal
style="TEXT-INDENT: 27pt; mso-line-height-alt: 1.3pt"><SPAN
style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'">我们知道在<SPAN
lang=EN-US>MFC中,绝大多数类都是从一个叫做Cobject的类继承过来的,虽然这是一个虚基类,但它定义了许多成员函数,其中许多成员函数是用来支持程序的调试的,如Dump
,Assertvalid
等成员函数。另外他们都支持如TRACE,ASSERT等宏,并支持内存漏洞的检查等等。我们知道,为了支持调试,类库肯定在在性能上有所损失,为此Microsoft
公司提供了两个不同的版本的类库:Win32 Debug版本和Win32
Release版本。在前面我们已经提到,每当我们建立一个工程时,我们也有对应的两个版本。在你的DEBUG
版本的工程中,编译器连接DEBUG 版本的MFC类库;在你的RELEASE 版本的工程中编译器连接RELEASE版本的MFC
类库以获得尽可能快的速度。下面我们来介绍这些工具的利用。<O:P> </O:P></SPAN></SPAN></P>
<P class=MsoNormal
style="TEXT-INDENT: 27pt; mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'"> <O:P>
</O:P></SPAN></P>
<H3 style="mso-line-height-alt: 1.3pt"><A name=_Toc419881656><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman; mso-bookmark: _Toc419740474">2.1
TRACE 宏的利用</SPAN></A><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P>
</O:P></SPAN></H3>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: Times New Roman; mso-spacerun: yes">
</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'">TRACE
宏有点象我们以前在C语言中用的Printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态。但有一点不同的是:TRACE
宏只有在调试状态下才有所输出,而以前用的Printf 函数在任何情况下都有输出。和Printf
函数一样,TRACE函数可以接受多个参数如:<O:P> </O:P></SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: 22.5pt; mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; mso-bidi-font-size: 10.0pt"> <O:P>
</O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">int
x = 1;<O:P> </O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">int
y = 16;<O:P> </O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">float
z = 32.0;<O:P> </O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">TRACE(
"This is a TRACE statement\n" );<O:P> </O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">TRACE(
"The value of x is %d\n", x );<O:P> </O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">TRACE(
"x = %d and y = %d\n", x, y );<O:P> </O:P></SPAN></P>
<P class=MsoNormal style="mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10.5pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 black">TRACE(
"x = %d and y = %x and z = %f\n", x, y, z );<O:P> </O:P></SPAN></P>
<P class=MsoNormal
style="TEXT-INDENT: 24pt; mso-line-height-alt: 1.3pt"><SPAN
style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'">要注意的是<SPAN
lang=EN-US>TRACE宏只对Debug 版本的工程产生作用,在Release 版本的工程中,TRACE宏将被忽略。<O:P>
</O:P></SPAN></SPAN></P>
<P class=MsoNormal
style="TEXT-INDENT: 24pt; mso-line-height-alt: 1.3pt"><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'"> <O:P>
</O:P></SPAN></P>
<H3 style="mso-line-height-alt: 1.3pt"><A name=_Toc419881657><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-hansi-font-family: Times New Roman; mso-bookmark: _Toc419740475">2.2
ASSERT宏的利用</SPAN></A><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'"><O:P>
</O:P></SPAN></H3>
<P class=MsoNormal
style="TEXT-INDENT: 24pt; mso-line-height-alt: 1.3pt"><SPAN
style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: 'Times New Roman'">在开发过程中我们可以假设只要程序运行正确,某一条件肯定成立。如不成立
,那么我们可以断言程序肯定出错。在这种情况下我们可以利用<SPAN
lang=EN-US>ASSERT来设定断言。ASSERT宏的参数是一个逻辑表达式,在程序运行过程中,若该逻辑表达式为真,则不会发生任何动作,若此表达式为假,系统将弹出一个对话框警告你,并停止程序的执行。同时要求你作出选择:Abort,Ignore,Retry。若你选择Abort,系统将停止程序的执行;若你选择Ignore
系统将忽略该错误,并继续执行程序;若你选择Retry
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -