1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档