跟踪
利用调试运行启动调试环境
利用调试版错误启动调试环境
附加到已有的进程。
多项目-设置为启动项目。
断点
F9: 启用/关闭断点
Ctrl+F9: 停止断点
Ctrl+Shift+F9: 删除全部断点
F10: 逐过程
Ctrl+F10: 运行到光标处
F11: 逐语句
F5: 启动调试
Ctrl+F5: 开始执行(不调试)
Shift+F5: 停止调试
Ctrl+Shift+F5: 重启调试
条件断点
Step over, step Into , Step Out ,Run to Cursor。
Step over 的功能是运行当前箭头指向的代码(只运行一条代码)。
Step Into的功能是如果当前箭头所指的代码是一个函数的调用,则用Step Into 进入该函数进行单步执行。
Step Out的功能是如当前箭头所指向的代码是在某一函数内,用它使程序运行至函数返回处。
Run to Cursor的功能是使程序运行至光标所指的代码处。
查看变量
局部变量:显示变量的值
监视窗口:实时显示变量的值。
模块窗口,是否正确加载的dll等
线程窗口,可以通过冻结一个线程,进行调试。
调用堆栈:确定最后出错的位置。
内存窗口:根据地址,显示16进制数据,地位在前高位在后, 可以设置字节整数。
查看void*的数据:
char pString = "this is string";
void * pMem = (void*)pString;
在监视中:
pString,10 // 设置长度
pMem,s // string 类型显示,如果是unicode 加 su
@err,hr // 最后一个错误码值, 看HRESULT型的错误信息
使用消息框
::MessageBox(AfxGetApp()->GetMainWnd()->m_hWnd,
_T("提示信息"), _T("提示信息"), MB_OK|MB_ICONWARNING);
调试输出
TCRACE();
OutputDebugString();
使用断言 ASSERT(不满足中断)
在开发过程中我们可以假设只要程序运行正确,某一条件肯定成立。如不成立 ,那么我们可以断言程序肯定出错。在这种情况下我们可以利用ASSERT来设定断言。ASSERT宏的参数是一个逻辑表达式,在程序运行过程中,若该逻辑表达式为真,则不会发生任何动作,若此表达式为假,系统将弹出一个对话框警告你,并停止程序的执行。同时要求你作出选择:Abort,Ignore,Retry。若你选择Abort,系统将停止程序的执行;若你选择Ignore 系统将忽略该错误,并继续执行程序;若你选择Retry ,系统将重新计算该表达式,并激活调试器。同TRACE宏一样,ASSERT宏只DEBUG版本中起作用,在RELEASE版本中ASSERT宏将被忽略。
对象倾倒
对象的DUMP函数的利用
Dump 函数用来按指定的格式输出一个对象的成员变量,来帮助你诊断一个对象的内部情况。与AssertValid成员函数一样,Dump也是Cobject 类的成员函数。Dump函数的参数是一个CdumpContext对象,你可以象利用流一样往向这个对象中输入数据。当你创建一个Cobject继承而来的 新类时,你可以按如下步骤重载你自己的Dump函数:
(1) 调用基类的Dump函数,以输出基类的内容;
(2) 向Cdumpcontest对象输出该类的数据.
例如,典型的Dump函数定义如下:
#ifdef _DEBUG
void CPerson::Dump( CDumpContext& dc ) const
{
// call base class function first
CObject::Dump( dc );
// now do the stuff for our specific class
dc << "last name: " << m_lastName << "\n"
<< "first name: " << m_firstName << "\n";
}
#endif
你可能已经注意到整个函数的定义都包含在#ifdef _DEBUG 和#endif中,这使得Dump成员函数只在DEBUG版本中发生作用,而对RELEASE版本不发生作用。
检测内存泄露
编辑并继续调试
调试Windows NT服务
更改数值
编译调试,不用重新开始