- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c调试
VC++程序调试
作者:???来源:csdn???发布者:admin 时间:2009-07-07 10:45:35???点击:2653
1????????? 前言
????? 当程序的运行结果与程序员预想的不一样,如死机,计算值不正确,出现内存访问冲突等,就需要进行调试
2????????? 进行调试前的准备工作
????? 因为程序调试是一项十分耗时的工作,很难估计出将要花费多长时间,因此在调试前,一定要做好充分准备,尽量避免做无用功:
1.??? ?构造好的测试步骤,让程序出错有规律性或出错的概率越大越好
2.??? 被调试程序及相关库是最符合要求的版本
3.??? 工程临时文件如.ncb被删除
4.??? 整个工程被重新编译
5.??? 应用程序的链接路经与调试路径保持一致
6.??? 单体测试全部通过
3????????? 出错位置和原因的确定
3.1????? 几种典型错误的原因
1 内存莫名其妙的失效
原因:内存指针被多处引用,被多处释放
2 多线程条件下死机
原因:线程中由于用了SendMessage而造成死锁,可人为加入消息循环
3 多线程条件下内存访问冲突
原因:内存被多个线程同时使用,可加入线程同步机制(用消息队列,信号灯等)
4 内存访问冲突
原因:内存越界(如字符串拷贝,内存拷贝)
5 窗口消息的次序问题
原因:如窗口未初始化就开始用
?
3.2????? 定位错误的位置
1 对代码的理解越深,对代码出错位置的确定越精确,必要时应画出相关代码的类图和时序图
2 从IDE调用堆栈判断出错位置和原因
3 从Win32 API或MFC类库函数的返回错误码判断出错原因,返回错误码的含义可以从MSDN或源代码中找到,还可以通过VC工具Error lookup找到
4 在代码中加入带编号的TRACE语句或MessageBox(release版),逐步缩小调试范围
5 对于死机现象或偶发现象,可通过逐步注释掉代码的方法确定死机的位置和原因
6 如果死机现象或偶发现象是新出现的,可以通过比较目前版本和上一版本的差异来确定位置和原因
?
4????????? 在debug方式下调试
?
4.1????? 调试的几种技巧
4.1.1??? ?使用ASSERT
ASSERT(ASSERT_VALID)宏仅在程序的“Debug”版本中捕捉程序错误。该宏在“Release”版本中不生成任何代码。
?
4.1.2??? 使用TRACE
以下的例子只能在debug中显示,
a)?TRACE
CString csTest = “test”;
TRACE(“CString is %s\n”,csTest);
?
b)?ATLTRACE
?
c)?AfxDump
AfxDump要求被dump的对象从CObject类继承,并且实现了Dump的方法。
?
CTime time = CTime::GetCurrentTime();
#ifdef _DEBUG
afxDump time “\n”;
#endif
?
?
4.1.3??? 如何在循环语句中设置断点
比如在下面的代码中,当nRet == 0 时就认为程序出错。但是如何定位此时i的值为几呢。
1)??? 将光标定位在要调试的语句前面
?
?
2)??? CTRL+B, 在Break at处选择 行号
3)??? 选择Condition
在[Enter the expression…] 输入 nRet == 0;点击OK。运行程序,在弹出报错对话框后点击retry,程序执行将停在断点处。 这是可以看到循环变量的数值比如i此时等于9。表明I == 9的时候出的错误。
在CTRL+B,在[Enter the number of times…]输入7,程序将在循环变量i = 8 时停下来。就可以进入出错的函数进行调试了。
见:
VCDebugSample\src\DebugMain\DebugMainDlg.cpp-----
void CDebugMainDlg::OnButtonSetBkpt()
?
4.1.4??? 数据断点(Data Breakpoint)
void CDebugMainDlg::OnButtonDataBkpt()
{
??????????? // TODO: Add your control notification handler code here
??????????? char szName1[10];
??????????? char szName2[4];
??????????? strcpy(szName1,shenzhen);?????????????????????? //A
??????????? CString str1;
?????
文档评论(0)