《调试技术1.ppt》由会员分享,可在线阅读,更多相关《调试技术1.ppt(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VC程序调试调试工具查看工具高级调试技术VC程序调试调试工具查看工具高级调试技术调试工具工程的调试属性1、工程的调试属性(1)Debug版本:包含调试信息,不进行代码优化,程序调试时用,文件大,放在debug目录下(2)Release版本:开发完成后,程序发行时,需编译成Release版本,不包含调试信息,对代码进行优化,文件小,放在release目录下2、如何设置:菜单project/settings/注意:工程生成时缺省设置是debug调试工具断点设置断点使程序停下来,断点类型:1、位置断点,最常用3种方法:(1)工具条;(2)点击右键,选择insert/remove breakpoint
2、菜单;(3)Edit 菜单/breakpoints/前2个方法最常用2、逻辑断点:设置条件方法:Edit 菜单/breakpoints/3、windows消息有关的断点方法:Edit 菜单/breakpoints/程序运行控制1、运行到断点处:菜单Build/start debug/go 或者工具条2、运行到光标处:run to cursor菜单Build/start debug/run to cursor 或工具条3、单步走:菜单Build/start debug或者工具条上有:Step outStep intoStep over注意:如果以上的工具条上没有,则右键点击菜单右边空白处,选择d
3、ebug即可VC程序调试调试工具查看工具高级调试技术使用查看工具程序停下来后,可以利用工具查看变量、堆栈、内存等1、弹出式信息:方法:鼠标停在变量,或者选中的表达式上即可弹出2、变量窗口:菜单view/debug windows/variables,或右击菜单右边空格处选择有auto、locals、this三个选项卡(3类型)使用查看工具3、观察窗口(watch):查看添加的变量和表达式,可以改变变量的值菜单view/debug windows/watch,或右击菜单右边空格处选择4、内存窗口:输入地址,查看内存菜单view/debug windows/memory,或右击菜单右边空格处选择5
4、、寄存器窗口:查看寄存器菜单view/debug windows/registers,或右击菜单右边空格处选择使用查看工具6、快速查看对话框(quick watch):查看添加的变量和表达式,可以改变变量的值,可以把查看的变量或表达式加入到watch窗口方法:在变量或选中的表达式点击右键选择quick watch7、函数调用堆栈:call stack菜单view/debug windows/call stack,或右击菜单右边空格处选择call stackVC程序调试调试工具查看工具高级调试技术高级调试技术1、TRACE宏例子:TRACE(Integer=%d,String=%sn,i,sz)
5、;支持可变参数(类似printf()函数),一次最多512 个字符,输出的内容会出现在最下方的output窗口2、ASSERT宏例子:ASSERT(pcage!=NULL),参数是逻辑表达式,若为真不起作用,为假,弹出对话框警告,作abort、igore、retry选择其一。在debug版本起作用,release版本不起作用高级调试技术3、ASSERT_VALID宏,声明对象内部合法性例子:ASSERT_VALID(pMyObject);参数是对象指针,调用ASSERT_VALID宏会调用对象Cobject:AssertValid()成员函数,所以创建Cobject继承下来的对象时,可重载As
6、sertValid(),做自己特定的合法性检查高级调试技术4、对象dump函数Dump是Cobject成员函数,按照指定格式输出对象成员变量,帮助诊断对象使用方法:(1)在要dump的类中定义dump函数,并在头文件中声明,例如:#ifdef _DEBUGvoid CMyDlg:Dump(CDumpContext&dc)const CObject:Dump(dc);/输出基类dump内容/再输出CMyDlg类要dump内容 dc input=m_Input n;dc show=m_Show n;#endif高级调试技术(2)在需要dump的地方调用:#ifdef _DEBUGCDumpCont
7、ext dc;Dump(dc);#endif结果显示在底下的output窗口注意代码都要用#ifdef _DEBUG/#endif,_DEBUG在菜单在菜单project/settings/c/c+/preprocessor definitions中能找到中能找到高级调试技术5、内存泄漏检查:使用CMemoryState对象:#ifdef _DEBUG/开始处开始处CMemoryState oldMem,newMem,diffMem;oldMem.Checkpoint();#endifint*p=new int3;/delete p;#ifdef _DEBUG/结束处结束处newMem.Che
8、ckpoint();if(diffMem.Difference(oldMem,newMem)TRACE(“内存泄漏”);#endif高级调试技术6、宏控制输出#ifdef _DEBUG/开始处开始处printf(“”);#endif高级调试技术7、程序运行时动态控制输出设全局变量:Int g_debug=0;If(1=g_debug)/开始处开始处printf(“”);G_debug可在程序启动时输入,也可以在运行中改变启动时输入:(1)在菜单在菜单project/settings/debug/program argument中加入一个数字,中加入一个数字,(2)如果是如果是console程序在程序在main函数中添加:函数中添加:G_debug=atoi(argv1);/argv0是程序的路径名如果是MFC程序,CWinApp有个成员变量m_lpCmdLine保存了输入参数BOOL CMyApp:InitInstance()g_debug=atoi(m_lpCmdLine);比较注意:15:仅仅适用于基于MFC的应用程序在debug版本有输出,release版本无输出上面这些宏的使用可以参考MSDN16:静态的,程序编译好了,就确定了7是动态的