2 }2 J T. t$ j1 e: DVaribles 6 B; w) ?- B: B$ I% hDebug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。 8 p2 F a4 y+ M) i* [" ?( P# K% |6 U9 z
寄存器5 E6 m e5 o1 d' ~8 N' A( X1 q% S
Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。4 R) y. o" ^% H+ V
- N5 x+ }# V% F' l7 x进程控制 ! w5 @( O9 [5 r" G( e. K: bVC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下: # U' d! m! h7 O# b. z
快捷键 说明 8 u Y: A' N, p; O) W' B% D
F5 继续运行 ( C9 P! |3 I) Q8 H" f
F10 单步,如果涉及到子函数,不进入子函数内部 t6 C, O- Z0 r, Y KF11 单步,如果涉及到子函数,进入子函数内部 , t4 o& E* C) d4 p: pCTRL+F10 运行到当前光标处。 7 z9 U' c8 E& p# ?2 [, f* X0 b
' z) x/ C' b2 p+ ZCall Stack1 m |: M. S% t( \
调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击Debug工具条上的Call stack就显示Call Stack对话框。在CallStack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。 & U' E/ C% L( V. S0 t- X$ ?# {: c0 C# C' f: F7 z$ t m1 E3 c
其他调试手段 8 K7 a% L) I6 _6 q系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下: & D8 t. E; |: B% m; S6 s7 d0 \
' [) M4 }2 x0 J+ w
宏名/函数名 说明 2 Q' N6 t2 ?1 H; HTRACE 使用方法和printf完全一致,他在output框中输出调试信息 8 y8 ` h! ]/ C' e5 F, pASSERT 它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。对于系统中出现这个宏 导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如,对于一个还没有创建的窗口调用SetWindowText等。 # h' I; R7 N( n! V- ]/ |5 T( f
VERIFY 和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。 ( R& O* C! H8 z( d
+ A. A/ ~6 C% ~9 b# e9 k( x) V
关注- ~! y/ ]0 b# r
一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括: 9 c( @0 _; R. J3 |3 y) N % L: N( p9 z y; y+ e0 ~. C对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。 z0 P3 j' ~/ J9 q
一些函数返回错误,需要用其他函数获得错误的具体信息。例如accept返回INVALID_SOCKET表示accept失败,为了查明 具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。 " L! J) u* |3 @7 c/ K# t) ?有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误 + S& ?0 O3 T$ i* s% _' d& n9 z
程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。如果程序出了异常, 却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。 & P( {3 v# F2 y4 ~1 L( N$ U1 _) c另外:VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。因为只有这样,VC才能选择合适的编译、连接 选项。对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是Microsoft Visual Studio为了加快编译 速度而设置的预编译头文件。在这个#include "stdafx.h"行前面的所有代码将被忽略,所以其他头文件应该在这一行后面被包含。+ S1 C* C2 U; m& J0 c6 Q2 h! {
对于.c文件,由于不能包含stdafx.h,因此可以通过Project settings把它的预编译头设置为“不使用”,方法是: 5 g, m3 C9 g! b' ^# ~; u
弹出Project settings对话框 , q" _9 T' A& Y1 }) Z
选择C/C++ - v% i( B7 ?% K$ s/ @
Category选择Precompilation Header 9 T* R: E. Y, R. l9 b$ f# J- G
选择不使用预编译头</FONT>