首页 VC调试技巧

VC调试技巧

举报
开通vip

VC调试技巧VC调试篇 难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。  我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下: VC调试篇 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,...

VC调试技巧
VC调试篇 难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。  我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf ,受益匪浅,总结以前的和新的收获如下: VC调试篇 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。 为了增加调试信息,可以按照下述步骤进行: ​ 打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) ​ 选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 框,可供选择的调试信息 方式包括:   命令行 Project settings 说明 无 None 没有调试信息 /Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息 /Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等 /Zi Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息。 /ZI Program Database for Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效 ​ 选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ​ 如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。 调试方法: 1、使用 Assert(原则:尽量简单) assert只在debug下生效,release下不会被编译。 2、防御性的编程 3、使用Trace 4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因 5、把错误信息记录到文件中   位置断点(Location Breakpoint)   大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码: void CForDebugDlg::OnOK() {        for (int i = 0; i < 1000; i++)    //A        {               int k = i * 10 - 2; //B               SendTo(k);          //C               int tmp = DoSome(i); //D               int j = i / tmp;    //E        } }              执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问题。步骤如下。   1 Ctrl+B打开断点设置框,如下图: Figure 1设置高级位置断点   2 然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。   3 按F5重新运行程序,程序中断。Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的。因此,我们按步骤2所讲,更改此断点的skip次数,将1000改为513。   4 再次重新运行程序,程序执行了513次循环,然后自动停在断点处。这时,我们就可以仔细查看DoSome是如何返回0的。这样,你就避免了手指的痛苦,节省了时间。   再看位置断点其他修饰条件。如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以输入一些条件,当这些条件满足时,断点才启动。譬如,刚才的程序,我们需要i为100时程序停下来,我们就可以输入在编辑框中输入“i==100”。   另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。这对检测一个变量何时被修改很方便,特别对一些大程序。   用好位置断点的修饰条件,可以大大方便解决某些问题。 数据断点(Data Breakpoint)   软件调试过程中,有时会发现一些数据会莫名其妙的被修改掉(如一些数组的越界写导致覆盖了另外的变量),找出何处代码导致这块内存被更改是一件棘手的事情(如果没有调试器的帮助)。恰当运用数据断点可以快速帮你定位何时何处这个数据被修改。譬如下面一段程序: #include "stdafx.h" #include  int main(int argc, char* argv[]) {        char szName1[10];        char szName2[4];        strcpy(szName1,"shenzhen");                     printf("%s\n", szName1);          //A         strcpy(szName2, "vckbase");              //B        printf("%s\n", szName1);        printf("%s\n", szName2);         return 0; }         这段程序的输出是              szName1: shenzhen        szName1: ase        szName2: vckbase      szName1何时被修改呢?因为没有明显的修改szName1代码。我们可以首先在A行设置普通断点,F5运行程序,程序停在A行。然后我们再设置一个数据断点。如下图: Figure 2 数据断点   F5继续运行,程序停在B行,说明B处代码修改了szName1。B处明明没有修改szName1呀?但调试器指明是这一行,一般不会错,所以还是静下心来看看程序,哦,你发现了:szName2只有4个字节,而strcpy了7个字节,所以覆写了szName1。   数据断点不只是对变量改变有效,还可以设置变量是否等于某个值。譬如,你可以将Figure 2中红圈处改为条件”szName2[0]==''''y''''“,那么当szName2第一个字符为y时断点就会启动。   可以看出,数据断点相对位置断点一个很大的区别是不用明确指明在哪一行代码设置断点。 其他调试手段:系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下: 宏名/函数名 说明 TRACE 使用方法和printf完全一致,他在output框中输出调试信息 ASSERT 它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。对于系统中出现这个宏 导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如,对于一个还没有创建的窗口调用SetWindowText等。 VERIFY 和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。   值 Watch VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。 观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。 VC提供一种被成为Watch的机制来观看变量和表达式的值。在断点状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。 单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察 变量或者表达式的值。注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致 软件的逻辑被破坏。 Memory 由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 ,或者要显示一片内存的内容,可以使用memory功能。在 Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。 Varibles Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。 寄存器 Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。   调试技巧: 1、VC++中F5进行调试运行 a)、在output Debug窗口中可以看到用TRACE打印的信息 b)、 Call Stack窗口中能看到程序的调用堆栈 2、当Debug版本运行时发生崩溃,选择retry进行调试,通过看Call Stack分析出错的位置及原因 3、使用映射文件调试 a)、创建映射文件:Project settings中link项,选中Generate mapfile,输出程序代码地址:/MAPINFO: LINES,得到引出序号:/MAPINFO: EXPORTS。 b)、程序发布时,应该把所有模块的映射文件都存档。 c)、查看映射文件:见” 通过崩溃地址找出源代码的出错行”文件。 4、可以调试的Release版本   Project settings中C++项的Debug Info选择为Program Database,Link项的Debug中选择Debug Info和Microsoft format。 5、查看API的错误码,在watch窗口输入@err可以查看或者@err,hr,其中”,hr”表示错误码的说明。 6、Set Next Statement:该功能可以直接跳转到指定的代码行执行,一般用来测试异常处理的代码。 7、调试内存变量的变化:当内存发生变化时停下来。??? 进程控制 VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。各个快捷键功能如下:   快捷键 说明 F5 调试/继续运行 F10 单步,如果涉及到子函数,不进入子函数内部 F11 单步,如果涉及到子函数,进入子函数内部 CTRL+F10 运行到当前光标处。 F7 重建 F9 设置断点/清除断点 Ctrl+Shift+F9 清除所有断点 Shift+F5 结束调试 Call Stack 调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击Debug工具条上的Call stack就显示Call Stack对话框。在CallStack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。 关注 一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括: ​ 对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。 ​ 一些函数返回错误,需要用其他函数获得错误的具体信息。例如accept返回INVALID_SOCKET表示accept失败,为了查明 具体的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性的解决问题。 ​ 有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误 ​ 程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 给用户让他们决定怎么处理。如果程序出了异常, 却不对返回值和其他机制返回的错误信息进行判断,只能是加大了找错误的难度。 另外:VC中要编制程序不应该一开始就写cpp/h文件,而应该首先创建一个合适的工程。因为只有这样,VC才能选择合适的编译、连接 选项。对于加入到工程中的cpp文件,应该检查是否在第一行显式的包含stdafx.h头文件,这是Microsoft Visual Studio为了加快编译 速度而设置的预编译头文件。在这个#include "stdafx.h"行前面的所有代码将被忽略,所以其他头文件应该在这一行后面被包含。 对于.c文件,由于不能包含stdafx.h,因此可以通过Project settings把它的预编译头设置为“不使用”,方法是: ​ 弹出Project settings对话框 ​ 选择C/C++ ​ Category选择Precompilation Header ​ 选择不使用预编译头。 便于调试的代码风格: 不用全局变量 所有变量都要初始化,成员变量在构造函数中初始化 尽量使用const 详尽的注释   总结   调试最重要的还是你要思考,要猜测你的程序可能出错的地方,然后运用你的调试器来证实你的猜测。   0 0 0 (请您对文章做出评价) « 上一篇:对“仅通过崩溃地址找出源代码的出错行”一文的补充与改进,转自vckbase,记录一下 » 下一篇:[转]调试Release版本应用程序,不知道转自哪里 posted on 2008-05-06 16:26 孔曰成仁,孟曰取义 阅读(660) 评论(0)  编辑 收藏 网摘 注册用户登录后才能发表评论,请登录或注册。 网站导航: 博客园首页  IT新闻  个人主页  闪存  程序员招聘  社区  博问  网摘 IT新闻: · 尊重标准 微软申请加入W3C SVG工作组 · 亚马逊电子图书销量首次超过传统印刷书籍 · 黑莓牵手神州数码 正式进军中国个人市场 · 仅3800元 谷歌Nexus One国内购买攻略 · 2009年新增恶意软件2500万 高于19年累计总和 China-pub 计算机图书网上专卖店!6.5万品种2-8折! China-Pub 计算机绝版图书按需印刷服务 链接:切换模板 在知识库中查看: [转]VC调试篇-不知道转自何处 Powered by: 博客园 CHM电子书木马制作 【chm木马的制作】            仅供个人学习参考,切勿用于非法用途,否则后果自负! 1.首先需要下载和安装一个QuickCHM软件,并且准备一个chm电子书以及一个木马。 QuickCHM.exe的下载地址:(内含注册码) http://down.qiannao.com/space/show/webwin/QuickCHM-0020V2.6.rar/.page 2.打开CHM电子书,在电子书第一个页面的右侧右击鼠标,选择“属性”菜单,目的是查询默认文件。 3.在弹出的属性对话框中,你可以发现其默认页面,本例是一张图片:/face.jpg 4.点击确定以关闭属性对话框。然后需要编写一个小小的网页代码,如下图所示, 需要改动的地方已在其中注明。将其保存为.html类型的文件,本例保存为:aaa.html 5.接下来对CHM电子书进行反编译,运行QuickCHM软件,选择“文件”→“反编译”菜单项。 6.在弹出的【反编译】对话框中选择“输入”和“输出”文件夹,“输入”框选择电子书路径,“输出”框 选择反编译后的文件存储路径(一定要选择已存在的文件夹路径),然后点击“确定”即可自动反编译。 7.反编译完成后会弹出反编译文件夹,找到其中后缀名为.hhp的文件,也就是和电子书名称相同的那个文件 本例中是“电子书.hhp”。 8.用记事本打开.hhp文件,如下图: 9.在其中添加我们前面编写的网页文件名和木马名,如下图所示,注意和上图比较。 10.将前面编写的网页文件(aaa.html)和木马文件(木马.exe)复制到反编译后的文件夹中。 11.此时需要重新编译。再次运行QuickCHM软件,选择“文件”→“打开”菜单项,弹出【打开】对话框, 选择刚刚修改过的“电子书.hhp”文件,点击“打开”,回到QuickCHM软件主窗口。 12.选择“文件”→“编译”,稍等片刻编译完成,弹出对话框中会显示“完成!你希望运行吗?”的字样 选择“否”按钮,此时,已完成了一个chm电子书木马的制作,生成的电子书木马在“反编译文件夹”内。 * 电子书的名字可以更改,双击打开该电子书木马就会在后台悄悄的运行。 * 关于免杀等等,本文不作讨论。 【CHM电子书木马的查杀】 主要有两种查杀CHM木马的方法。 1.用上面的方法反编译CHM电子书,查看其中的内容,当发现.exe文件时,就要谨慎使用, 因为它很可能就是木马。此方法操作起来比较慢。 2.另一个方法当然是用杀毒软件查杀了( -_-! 汗,还以为什么方法呢。)
本文档为【VC调试技巧】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_325890
暂无简介~
格式:doc
大小:784KB
软件:Word
页数:17
分类:互联网
上传时间:2011-01-25
浏览量:26