




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在VC中使用Debug1. 选定Debug编译选项Build - Set Active Configuration - Win32 Debug或者在Build工具栏上的ListBox中选择Debug。Debug定义了_DEBUG宏,而Release定义了NDEBUG宏。 2. 先按F12编译Browse信息这样编译后可以查到变量定义。 3. 执行Debug按F5(注意,如果按CtrlF5 是Run,起不到Debug的作用)。在Debug时一定要把Debug工具栏拉出来,方便调试。 4. Breakpoints(F9)用Alt+F9可以对所有的断点进行编辑。对指令地址(EIP)指定断点当EIP的值为指定值时中断。如下图:是对SetWindowLong的地址进行设置的(注意:一定要在前面加0x)。对内存地址设置断点当指定内存地址发生变化时中断(在运行时设置才管用)。5. Show Next Statement(Alt+Num *)显示当前指令所处的代码位置 6. Step Over(F10)单步追踪,遇到Call语句不进入7. Step Into(F11)单步追踪,遇到Call语句进入8. Step Out(Shift+F11)跳出当前函数调用9. Run to Cursor(Ctrl+F10)运行到光标所处位置10. Memory Leaks内存泄漏。要想检查到memory leaks,必须包含头文件(实际上是#pragma comment(lib, mfc42ud.lib)在起作用)。注意:内存泄漏是一个十分严重的问题,尤其对于需要长时间运行的程序(进程长时间保留在内存中)更是如此。有一个重要的事实是,当进程正常退出时,操作系统负责清空该进程的所有内存。11. QuickWatch(Shift+F9)可以更改变量运行时的值。12. Watch窗口输入err,hr可以动态查看GetLastError信息。可以输入寄存器。(long *)ESP可以查看堆栈内容。13. Variables窗口当前函数的局部变量14. Registers窗口EIP、ESP、ECX15. Memory窗口对变量可以拖放。Options-Debug中可以设置16. Call Stack窗口17. Disassembly窗口Set next statement 跳过某些语句(有时用于Hack)Goto SourceCtrl+G在%system%目录下创建de.bat文件,内容如下:dumpbin /exports %1a.txta.txt对dll输出函数进行查看Apply Code Changes(Alt+F10)当处于Debugging状态时,如果更改了代码,可以执行此命令,可以使得重新编译后再运行到当前状态。18. Debug-Modules窗口19. Profile(Build菜单下)要先设置Project - Settings - Link - Enable profiling20. ASSERT,VERIFY21. TRACE在Debug状态下输出,同时要求Enable tracing开启。22. AfxMessageBox23. cout,printf对控制台程序进行输出测试24. OutputDebugString在Debug和Release状态下都可以输出。25. DebugBreak,_asmint 3强制中断26. 如何对Release版本进行Debug进行如下设置,然后就可以进行Debug了。Settings - C/C+ - Category(General) - Debug infoProgram DatabaseSettings - Link - Category(General) - Generate debug infotrue27. 输出汇编文件Project Settings中如下设置:则会产生相应的汇编文件 (*.asm / *.cod)28. 在Win32程序中输出字符串到控制台if (AllocConsole()HANDLE hConsole;hConsole = GetStdHandle(STD_OUTPUT_HANDLE);if (hConsole)DWORD dwWritten;char sOut=This is a test string.n;WriteConsole(hConsole, sOut, strlen(sOut), &dwWritten, NULL);/FreeConsole();按f5(注意,如果按ctrlf5 是run,起不到debug的作用)。 在debug时一定要把debug工具栏拉出来,方便调试。 breakpoints(f9) 用alt+f9可以对所有的断点进行编辑。 对指令地址(eip)指定断点 当eip的值为指定值时中断。如下图:是对setwindowlong的地址进行设置的(注意:一定要在前面加0x)。 对内存地址设置断点 当指定内存地址发生变化时中断(在运行时设置才管用)。 show next statement(alt+num *) 显示当前指令所处的代码位置 step over(f10) 单步追踪,遇到call语句不进入 step into(f11) 单步追踪,遇到call语句进入 step out(shift+f11) 跳出当前函数调用 run to cursor(ctrl+f10) 运行到光标所处位置 memory leaks 内存泄漏。要想检查到memory leaks,必须包含头文件(实际上是#pragma comment(lib, mfc42ud.lib)在起作用)。在运行程序源代码时用Go命令(而不是Execute)才能处于调试状态, Go命令会使程序运行变得缓慢下来,但可以更好地控制运行程序,我们可以在任何时刻中断程序、单步执行、查看变量、检查调用栈。VC的调试功能:首先,再次强调要用Go命令运行一个将要调试的程序;如果要中止调试状态下的运行程序可以点击Stop Debugging命令,还可以通过Break选项以可恢复方式中断调试程序的运行流程(用Restart选项可以重新开始运行程序);Step Into选项表示每次只执行一行语句(单步执行),但如果当前代码是调用一个函数,那么Step Into表示进入该函数,全部函数语句执行完后返回,而Step Over则是跳出这个函数;Step To Cursor选项表示程序将执行到光标所在的可执行语句行上;在调试多线程程序时,可以在线程函数或主应用程序线程中设置断点,还可以用Break选项结 束线程后用Threads选项查看运行线程列表,也可以选择悬挂和恢复每个线程;在设置断点后,在VC 查看菜单的调试窗口中可以查看变量、内存、调用堆栈、寄存器以及反汇编语句。在程序中设置断点的方法是,点击要设置的代码行并点击设置代码的工具栏按钮,会出现在代码行最左边的一个小黑点即是断点标志,这时再选Go程序会在执行到端点处停下来,如果要继续执行可以再选Go。 通过选择VC工具菜单下的源浏览器可以生成一个.BSC文件,使用浏览器可以从中发现多种信 息:程序中任何一个变量、函数、类或宏在何处定义及引用;可以列出所有声明的函数类、变量、宏;可以发现调用一个指定函数的所有函数;可以找到一个指定类的派生来源或者它派生出哪些类。 在使用微软程序开发库MSDN时,我们会发现其中的VC示例经常采用看似多余的ASSERT语句,其作用就 是使程序具有维护性。对于Debug版本的VC程序,在遇到布尔值为FALSE的ASSERT语句处停止,并显示Assertion Failed对话;如果设置为发布版,所有ASSERT语句都会被预处理程序删除。一个地道的VC编程员,应该有意在自己的代码中通过维护特征去检测 任何设定,诸如输入参数、循环范围和变量值的设定。 在安装好VC系统之后,在VC之外的程序组中有一个程序Tracer是一个跟踪工具,在激活它后使用 Go运行VC代码,在输出窗口就能够看到程序运行过程中的内部过程,包括DLL调用等,你如果看不到任何输出,可以转到菜单查看(View)点击输 出(Output)。 其实,MFC自身就提供有错误查找和TRACE语句,而TRACE语句的语法与printf非常类似,所以我们可以在程序中直接加入这条跟踪命令,如下所示: / Example for TRACEint i = 1;char sz = one;TRACE( Integer = %d, String = %sn, i, sz );/ Output: Integer = 1, String = one 在Developer Studio中还提供了一个ERRLOOK工具,程序员只要输入错误号就能得到系统出错信息或模块错误内容。 MFC从Cobject派生的每个类都包含一个Dump函数,该函数可把当前状态转储(Dumping)到输出窗口,这在某些调试过程中会有用,以下代码是Dump函数的用法: / Example for CObject:Dumpvoid CAge:Dump( CDumpContext &dc ) constCObject:Dump( dc );dc Age = 2 a CObject at $190A1 a CObject at $18EAObject dump complete.0 bytes in 0 Free Blocks8 bytes in 2 Object Blocks0 bytes in 0 Non-Object BlocksLargest number used: 8 bytesTotal allocations: 8 bytes 在MFC类和VC中本身就有异常情况这个概念,并在此基础上形成它们处理系统错误和意外的主要机制。比如当系统内存分配殆尽时,你的运行程序就会收到内存异常的消息。这样就给了程序员消除异常的机会。 MFC中的异常情况主要有:CArchiveException表示档案文件载入或保存时出错, CDBException属于数据库错误,CFileException为文件错误,CMemoryException为调用new时发生分配错误, CNotSupportedException表示指定操作不被支持,COleException表示在调用OLE操作时出错, COleDispatchException表示在OLE自动操作时出错,CResourceException表示资源找不到或无法创建, CUserException用于通知用户错误。 MFC还包含一系列以Afx为词头的调试函数:AfxAbort可以在发生致命错误时异常终止程序, AfxCheckMemory可以检查堆和剩余缓冲池的受损部分;AfxDoForAllClasses重声明所有CObject的派生类; AfxDoForAllObject重声明堆上所有CObject派生的对象;AfxEnableMemoryTracking启用或禁止内存追踪; AfxIsMemoryBlock用于确认指针所指内存有效;AfxIsValidAddress用于确认地址是驻留在程序的内存区域内; AfxIsValidString用于确认地址所指字符串有效;AfxSetAllocHook用于内存分配前进行检测;AfxTraceEnabled 启动或禁止输出跟踪,AfxTraceFlags则进一步定制跟踪特征。 在我们随手编制的VC程序中,普遍存在着会发生内存泄漏的隐患,有些问题程序的痼疾症状是在处理数据量激增 时陷入瘫痪,更糟的要发现内存泄漏并不容易。首先,我们要明确VC中内存泄漏的含义:简单说就是一个程序申请得到了一段内存却没有及时释放。比如用new 在堆中分配了一个对象或对象组却并没有调用delete操作。灵活的指针技术使内存泄漏的原因变得复杂化,比如改变了保存在一变量中的指针的值后未能删除 指针所指向的内存区;当内存泄漏是来自一个带有指针类型成员变量的类时会更加困难,因为当调用分配指针时并没有复制构造函数/析构函数或运算符。 为了防止发生内存泄漏这样棘手的故障,在VC编程时应当注意遵循几个规范:其一,如果一个类包含有指针 并且分配了指针值,那么就需要构造相应的析构函数以删除该指针;其二,如果一个函数分配了一块内存并把该内存块返回给调用它的函数使用,那么它返回的必须是一个指针而非一个引用,因为引用不能被程序删除;其三,即使一个函数分配了一段内存并在同一函数的稍后部分删除了该内存段,也要尽可能将内存块分配到堆 栈中;最后,就是决不要试图改变一个指针值,除非已经删除指针所指的对象或通过数组指向了该指针所指向的内存,而且也不要对new返回的指针进行加1运 算。 每当编写VC程序时,我们都会处于一个琳琅满目的集成开发环境(IDE)中,现实的真相是我们很多人在这里编程多年,对开发环境了解并不全面和细微。记得王朔的小说中有句话说穿了多年的外套在不穿时才发现它原来还有一个兜!。我们在安装VC时,得到的 IDE即Developer Studio, VC其实是Developer Studio下激活的一个组件而已,比如微软的VJ+也是基于Developer Studio。很少有技术书籍会一一介绍Developer Studio界面元素,也许聪明的程序员轻易就能识别其含义,全部猜对界面图符的含义并非易事。可是它们对我们了解开发信息很重要,也与调试程序有关联。 在Developer Studio下会生成多个文件去保存项目的所有信息:一个是以.DSW为扩展名的项目工作区文件,它包含项目中所有文件的名称、文件所在目录、编译器和连接器的选项以及项目工作的其它信息;以.DSP为扩展名的也是项目记录文件,.OPT是工作区选项文件,它包含Developer Studio的所有个人设置 - 包括颜色、字体、工具栏、哪个文件被打开以及MDI窗口如何被定位和最新调试中的断点等。在打开项目工作区文件时其它文件随即会自动打开。在 Developer Studio下可以按类查看代码,其中的ClassView显示了应用程序中所有的类,每个类下显示了成员函数和数据成员,在成员函数旁有粉红图标,数据成员旁是蓝绿色图标,保护类成员的图标旁有一枚钥匙,私有类成员则有一个挂锁图标。 当然,在开发环境下最主要的工作是输入编辑程序源代码,源代码会显示语法着色。在缺省情况下,代码 为黑色,夹以绿色的注释和蓝色的关键字(指VC所保留的public、private、new和int等等)。-这些地球人都知道,但是为了调试需要,我们还可以指定颜色去显示字符串、数字和运算符。定义方法是通过Tools菜单下的Options对话框中的Format选项卡设置。 在Developer Studio提供的诸多菜单项中,我们往往对少数菜单避而不用,因为不了解它们的作用唯恐好奇心会造成乱子;还有多个菜单项都可以达到目的,至于它们之间的微小差别则不甚了了。比如在编译和调试时常用到Build菜单组,它具有和应用程序编译、运行调试相关的多项操作:其中的Compile菜单会编译当前 的聚焦文件;Build菜单会编译和链接所有在项目中修改的文件;Build All会编译链接项目中所有文件,包括最近编译后没有修改过的文件;Batch Build用于包含有Debug和Release配置的项目;Clean会删除所有的中间和输出文件,因而项目目录下仅包含源文件;Debugger Remote Connection用于远程调试,即在一台机
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光缆护套工主管竞选考核试卷及答案
- 井筒掘砌工理念考核试卷及答案
- 宠物驯导师设备维护与保养考核试卷及答案
- 有线电视技术试题及答案
- 应聘会计面试题及答案
- 银行中层面试试题及答案
- 银行业务风险知识测试题及答案
- 银行行政考试试题及答案
- 银行信息技术试题及答案
- 公路专业试题及答案
- 冯友兰-人生的境界课件
- 传热学全套PPT完整教学课件
- 部编版六年级道德与法治上册第5课《国家机构有哪些》优秀课件
- 高中心理健康教育北师大版高二全册第6课《温故知新》省级名师优质课教案比赛获奖教案示范课教案公开课教案
- 瑞美检验医生工作站操作手册
- 欧美电影文化(上海工程技术大学)【智慧树知到】网课章节答案
- 双人心肺复苏
- 全过程工程咨询服务大纲
- T-GDPA 3-2021 奥利司他胶囊质量标准
- GB/T 42061-2022医疗器械质量管理体系用于法规的要求
- 枸橼酸血液透析
评论
0/150
提交评论