ImageVerifierCode 换一换
格式:PPT , 页数:50 ,大小:1.60MB ,
资源ID:7712740      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7712740.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(程序调试技术杂谈.ppt)为本站会员(saw518)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

程序调试技术杂谈.ppt

1、程序调试技术杂谈,武汉天喻软件有限责任公司 国家企业信息化应用支撑软件工程技术研究中心,C+培训系列,内容,程序的错误分类 程序的生成 生成的配置管理 程序的调试 和调试相关的配置设置 几种类型文件的调试 程序设计中的建议 备注: 不讲解Web和远程调试,程序错误类型,生成错误 由编译系统来检查:将警告的级别提高到最高级;启动代码分析工具 怎样看各种连接错误 逻辑错误 程序流程中地错误,需要调试人员对程序的执行逻辑有清楚的认识 结合调试工具定位错误的位置和原因,程序的生成配置,解决方案和项目配置,解决方案配置 项目之间的依赖关系; 启动项目 可以执行多个项目调试 进行配置管理 项目配置 确定各

2、个项目的内部生成属性 系统默认情况下生成“调试”配置和“发布”配置。自动配置“调试”配置以便调试应用程序,配置“发布”配置以便用于应用程序的最终发布 配置管理器的使用,配置管理器使用,程序调试,调试设置 程序中的应用 启动调试的方法 第三方程序 应用程序 DLL 调试执行及相关控制,调试器设置,启动调试设置界面,理解各个选项的含义 “工具”-“选项” 对话框-“调试”文件夹-选择所需选项的类别,C+ 调试配置的项目设置,C+ 调试配置的项目设置,C+ 调试配置的项目设置,C+ 调试配置的项目设置,在 Visual C+ 中启用调试功能,在 Visual C+ 中启用调试,如果在编译程序时定义了

3、 _DEBUG 符号,则将启用某些调试功能(如断言)。可以用下列两种方法之一定义 _DEBUG 在源代码中指定 #define _DEBUG, 指定 /D_DEBUG 编译器选项。(如果是在 Visual Studio 中使用向导创建项目,则 /D_DEBUG 将在“调试”配置中自动定义。) 在定义了 _DEBUG 后,编译器将编译包围在 #ifdef _DEBUG 和 #endif 内的代码段,程序数据库 (PDB) 文件,作用 保存着调试和项目状态信息 指定符号路径 “工具”菜单“选项”对话框“调试”节点“符号”类别:“符号文件 (.pdb) 位置” 手动加载符号 从“模块”窗口中手动加载

4、 DBG 文件,启动调试的方法,启动调试的方法,不属于 解决方案的可执行文件,在 Visual Studio 外部启动可执行文件并使用 Visual Studio 调试器附加到该文件 需要手动执行一些步骤,不能调试启动过程中发生的问题,不能调试不等待用户输入而迅速完成的程序 为此类程序创建 EXE 项目,属于解决方案的调试,EXE DLL 控制台,调试的启动,调试的启动,调试命令,启动,逐语句,逐过程 调试多进程 停止调试或停止执行 调试中断 达到断点; 发生异常; 手工中断 更改调试多个程序时的中断行为 工具”-“选项”- “调试”-“常规”- “一个进程中断时则中断所有进程”,单步执行,逐

5、语句 逐过程 跳出 单步执行特定函数 运行到指定位置 设置断点 运行到光标位置 运行到指定函数 查找函数设断点 在“调用堆栈”窗口中,右击该函数名,并从快捷菜单中选择“运行到光标处”。,调试断点,断点,简单断点 “调试”-”切换断点” 源代码行的最左边空白鼠标左键单击 指定源代码行的右键菜单 地址断点 “反汇编”窗口中采用上面的方法设置 函数断点 删除、启用、禁用断点 删除、启用、禁用所有断点,断点,编辑断点位置 指定断点筛选器 指定命中次数 指定断点条件 指定跟踪点/断点操作,调试器中的数据查看,使用数据提示功能 可视化工具 变量窗口 快速监视对话框 寄存器窗口 内存窗口 调用堆栈窗口 反汇

6、编窗口 模块窗口,调试器中的表达式,Visual Studio 调试器包括表达式计算器,当您在“快速监视”对话框、“监视”窗口或“即时”窗口中输入表达式时,这些计算器可以对其进行计算。这些表达式计算器还可以在“断点”窗口和调试器中的许多其他位置使用,异常处理(调试),调试器识别下列类别的异常: C+ 异常 公共语言运行时异常 托管调试助手 本机运行时检查 Win32 异常,异常处理(调试),在引发异常时中断的方法 异常中断的管理,本机代码程序,调试优化的代码 使用_debugbreak函数 使用断言 内存泄漏的检测和隔离,断言,通过在代码中大量使用断言,可以在开发期间捕捉许多错误。为所做的每个

7、假定编写一个断言是很好的规则。例如,如果假定某个参数不为 NULL,请使用一条断言语句检查该假定,CRT断言,_ASSERT,_ASSERTE 使用断言一般不需要使用printf 检查堆是否损坏_ASSERTE(_CrtCheckMemory(); 检查指针有效性 _ASSERTE(_CrtIsValidPointer( address, size, TRUE ); _ASSERTE(_CrtIsValidPointer( myData ); 检查内存块 _ASSERTE(_CrtIsMemoryBlock (myData, size, ,MFC断言,内存泄漏的检测和隔离,CRT启用内存泄漏检

8、测,#define _CRTDBG_MAP_ALLOC #include #include ,将 malloc 和 free 函数映射到其“Debug”版本 _malloc_dbg 和 _free_dbg,程序结束时调用 _CrtDumpMemoryLeaks();,或 程序开始时调用 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );,MFC内存泄漏检测,#define new DEBUG_NEW AfxEnableMemoryTracking afxMemDF,MFC调试,AfxDebugBreak TRACE

9、宏 Err,hr 0x80000004,hr,程序设计中的建议,编写必要的注释 尽可能正确使用ASSERT() 对输入不信任,对输出保证其正确性 代码命名的规范,程序设计中的建议,编写必要的注释,程序设计中的建议,BOOL CGlobalSetting_EE:WriteProfileStringEx(LPCTSTR pszElement, LPCTSTR pszKeyAttr, LPCTSTR pszKeyAttrValue, LPCTSTR pszWriteAttrName, LPCTSTR pszWriteAttrValue) if(NULL = m_pXMLConfig) return

10、FALSE;ASSERT(AfxIsValidString(pszElement);ASSERT(AfxIsValidString(pszKeyAttr);ASSERT(AfxIsValidString(pszKeyAttrValue);if(!pszElement | !pszKeyAttr | !pszKeyAttrValue)return FALSE; / . ,对输入不信任,对输出保证其正确性 尽可能正确使用ASSERT(),程序设计中的建议,尽量用const和inline而不用#define,#define max(a,b) (a) (b) ? (a) : (b),int a = 5

11、, b = 0; max(+a, b); / a 的值增加了2次 max(+a, b+10); / a 的值只增加了1次,inline int max(int a, int b) return a b ? a : b; ,templateinline const T ,程序设计中的建议,尽量用new和delete而不用malloc和free,malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数,程序设计中的建议,对应的new和delete要采用相同的形式 指针初始化为NULL,delete之后设置为NULL,string *stringptr1 = n

12、ew string; string *stringptr2 = new string100; . delete stringptr1;/ 删除一个对象 Stringptr1 = NULL; delete stringptr2;/ 删除对象数组 Stringptr2 = NULL;,程序设计中的建议,在operator=中检查给自己赋值的情况,c. ,程序设计中的建议,尽可能使用const,char *p = “hello“; / 非const指针, / 非const数据 const char *p = “hello“; / 非const指针, / const数据 char * const p = “hello“; / const指针, / 非const数据 const char * const p = “hello“; / const指针, / const数据,程序设计中的建议,重视编译器警告,除非你明白每一条警告的确切含义,否则不要马马虎虎,置之不理。 警告往往是错误。,智能指针简述,_com_ptr_t Templateclass auto_ptr Chandle CAutoPtr, CAutoPtrArray CComPtr, CComQIPtr,容器的简单介绍,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报