收藏 分享(赏)

程序调试技术杂谈.ppt

上传人:saw518 文档编号:7712740 上传时间:2019-05-24 格式:PPT 页数:50 大小:1.60MB
下载 相关 举报
程序调试技术杂谈.ppt_第1页
第1页 / 共50页
程序调试技术杂谈.ppt_第2页
第2页 / 共50页
程序调试技术杂谈.ppt_第3页
第3页 / 共50页
程序调试技术杂谈.ppt_第4页
第4页 / 共50页
程序调试技术杂谈.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

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营业执照举报