程序调试技术.ppt
《程序调试技术.ppt》由会员分享,可在线阅读,更多相关《程序调试技术.ppt(23页珍藏版)》请在咨信网上搜索。
1、C/C+程序调试技术东方网力技术培训.内容提要l中断和异常中断和异常l调试断点调试断点l常见调试器功能常见调试器功能l源代码级别的主动调源代码级别的主动调试手段试手段lC+C+异常和异常和win32win32的的SEHSEHl常见程序问题调试常见程序问题调试l性能分析和优化性能分析和优化lC/C+C/C+语言的一些陷阱语言的一些陷阱l一些常见平台差异一些常见平台差异l实例分析实例分析l阅读程序的技巧阅读程序的技巧l几点建议几点建议.中断和异常中断和异常所谓中断是指所谓中断是指CPUCPU对系统发生的某个事件做出的一种反应,对系统发生的某个事件做出的一种反应,CPUCPU暂停正在执行的程序,暂停
2、正在执行的程序,保留现场后转入去执行相应的中断处理程序,执行完中断处理程序后再返回中断现场继保留现场后转入去执行相应的中断处理程序,执行完中断处理程序后再返回中断现场继续执行被打断的程序。续执行被打断的程序。中断可分为三类:中断可分为三类:1 1、第一类是由、第一类是由CPUCPU外部引起的,称作中断,如外部引起的,称作中断,如I/OI/O中断、时钟中断、控制台中断中断、时钟中断、控制台中断(重启动中断重启动中断,关机中断关机中断,),)等。等。2 2、第二类是、第二类是CPUCPU的内部事件,称作异常,如的内部事件,称作异常,如CPUCPU故障、程序故障故障、程序故障(非法操作码、非法操作码
3、、地址越界、浮点数溢出、除地址越界、浮点数溢出、除0 0错误等错误等)。3 3、第三类是由程序为了使用某些系统服务而主动引发,称作、第三类是由程序为了使用某些系统服务而主动引发,称作 陷入陷入(也叫软也叫软中断中断),如现在,如现在x86 CPU int 3x86 CPU int 3指令,指令,dosdos下著名的下著名的int 13int 13、int 21int 21等。程序调试断点等。程序调试断点就是通过就是通过int 3int 3指令实现的。指令实现的。4 4、x86 CPUx86 CPU的单步中断特性的单步中断特性(TRAP FLAG(TRAP FLAG被设置后,执行每条指令后都会发
4、生此被设置后,执行每条指令后都会发生此中断中断)。程序的指令级别的单步执行应该就是用单步中断实现的。程序的指令级别的单步执行应该就是用单步中断实现的。中断向量表中断向量表IDTIDT,即中断处理程序的入口地址表。,即中断处理程序的入口地址表。第三类软中断事件第三类软中断事件(异常异常)处理过程,以处理过程,以win32win32平台处理平台处理int 3int 3指令为例:指令为例:1 1、保留现场,进程、保留现场,进程/线程被挂起,进入操作系统的处理程序线程被挂起,进入操作系统的处理程序(执行系统执行系统int 3int 3的中断的中断处理程序,下面称为系统处理程序,下面称为系统)。2 2、
5、发生中断的进程如果处于被调试状态,则系统把、发生中断的进程如果处于被调试状态,则系统把int 3int 3事件通知给调试进程,尝事件通知给调试进程,尝试由调试进程处理试由调试进程处理int 3int 3事件。事件。3 3、尝试让进程自己处理、尝试让进程自己处理int 3int 3事件事件(参考参考C+C+的异常以及的异常以及WindowsWindowsS Structured tructured E Exception xception H Handlingandling知识知识)。4 4、如果、如果2 2、3 3情况都没处理情况都没处理int 3int 3事件,则系统弹出异常对话框,通知用户
6、进程发生事件,则系统弹出异常对话框,通知用户进程发生了异常了异常(此时用户可以使用调试器再来处理此时用户可以使用调试器再来处理int 3int 3事件事件 转入转入2)2)。第一类中断一般直接由系统处理,然后可能再分发给需要处理的用户进程。第一类中断一般直接由系统处理,然后可能再分发给需要处理的用户进程。第二类中断一般处理顺序为第二类中断一般处理顺序为 1-3-2-4.i 1-3-2-4.i.调试断点调试断点一般是通过调试断点一般是通过int 3int 3指令实现的。指令实现的。调试器设置断点原理调试器设置断点原理(以以VCVC调试器为例调试器为例):):调试器首先找到被调试进程需要设置断点的
7、指令地址调试器首先找到被调试进程需要设置断点的指令地址(调试版本根据调试版本根据源代码设置的断点也会被转化为实际的指令地址源代码设置的断点也会被转化为实际的指令地址),然后把该地址的,然后把该地址的1byte1byte数据记录到一张对应表里,接着把这数据记录到一张对应表里,接着把这1byte 1byte 改写为改写为0 xCC(0 xCC(即即int 3int 3指令码指令码)。这样当程序被调试运行的时候,在断点位置的指令其实就是这样当程序被调试运行的时候,在断点位置的指令其实就是int 3int 3指令,参指令,参照上一节的照上一节的int 3int 3中断事件处理过程,就可以明白调试器捕获
8、断点的工作机中断事件处理过程,就可以明白调试器捕获断点的工作机理。取消断点时则把对应表里记录的理。取消断点时则把对应表里记录的1byte1byte回写到被调试进程。回写到被调试进程。常用跟踪相关动作都是通过断点方式实现的常用跟踪相关动作都是通过断点方式实现的对于对于step tostep to、step over step over、step instep in、step outstep out等调试器都是通过在要运行的等调试器都是通过在要运行的下一个地址处先设置一个临时断点,然后调试运行程序来实现的。其它下一个地址处先设置一个临时断点,然后调试运行程序来实现的。其它断点实现类似。断点实现类似
9、。程序主动调试断点,程序主动调试断点,ASSERTASSERT宏,宏,ASSERT(false)ASSERT(false)即等效为一条即等效为一条int 3int 3指令。指令。理解和使用条件断点、单次断点、固定次数断点等。理解和使用条件断点、单次断点、固定次数断点等。怎么在动态库怎么在动态库(静态静态loadload和动态和动态load)load)里设置断点,里设置断点,VC VC的的Additional DLLsAdditional DLLs选项。选项。怎样在模板代码、内联函数、静态库代码里设置断点。怎样在模板代码、内联函数、静态库代码里设置断点。(调试器问题,怎调试器问题,怎样在不能设置
10、断点的代码位置设置断点样在不能设置断点的代码位置设置断点)。带调试信息模块和不带调试信息模块共存情况的调试方法,如带调试信息模块和不带调试信息模块共存情况的调试方法,如VBVB、浏览、浏览器、器、Media PlayerMedia Player使用我们需要调试的使用我们需要调试的.ocx.ocx、.dll.dll文件等。文件等。.常见调试器功能-具体参考具体参考VCVC,gdbgdb等调试器的用户手则等调试器的用户手则查看和修改变量,监视变量查看和修改内存,监视内存查看和修改寄存器,监视寄存器全局变量写监视Call Stack(调用堆栈)的查看更改指令指针寄存器EIP,实现调试时强行跳转(VC
11、 的 Set Next Statement命令同此)查看源码对应的汇编指令/机器码.源代码级别的主动调试手段编译时刻防御性编程编译时刻防御性编程-C+-C+契约契约(contractcontract)1 1、静态、静态assert(assert(编译时刻断言编译时刻断言)-STATIC_ASSERT()-STATIC_ASSERT(),must_have_base()must_have_base()2 2、一些有用的静态判断:、一些有用的静态判断:bool IS_INT_TYPE(T)bool IS_INT_TYPE(T)、IS_SIGNED_TYPE(T)IS_SIGNED_TYPE(T)、
12、GET_INT_MAX_VALUE(T)GET_INT_MAX_VALUE(T),见,见 npdebug.h“npdebug.h“调试时刻防御性编程调试时刻防御性编程宏宏ASSERT()ASSERT()、VERIFY()VERIFY()、TRACE()TRACE()等。等。MFCMFC的的AfxIsValidAddress()AfxIsValidAddress()、AfxIsValidString()AfxIsValidString()等。等。1 1、程序应该大量使用、程序应该大量使用ASSERT()ASSERT()宏,保证宏,保证ASSERT()ASSERT()覆盖覆盖没有正常处理的所有程序
13、逻辑分支。没有正常处理的所有程序逻辑分支。2 2、所有没有完成的函数和逻辑分支应该写上、所有没有完成的函数和逻辑分支应该写上ASSERT(false)ASSERT(false)以防止以后遗忘。以防止以后遗忘。运行运行/发布时刻防御性编程发布时刻防御性编程即程序的各种边界、容错、健壮性处理等。即程序的各种边界、容错、健壮性处理等。.C+异常和win32的SEH什么情况下建议使用异常什么情况下建议使用异常a a、当使用第三方提供的库,调用该库接口的、当使用第三方提供的库,调用该库接口的代码需要放在异常块里面代码需要放在异常块里面(对于第三方库内部对于第三方库内部有独立线程或独立进程时,目前我还没想
14、到好有独立线程或独立进程时,目前我还没想到好的办法增强程序健壮性的办法增强程序健壮性)。b b、构造函数可能失败的情况必须使用异常。、构造函数可能失败的情况必须使用异常。c c、在使用异常可以大大简化程序逻辑的地方、在使用异常可以大大简化程序逻辑的地方也可以使用异常。也可以使用异常。d d、内存分配可能失败的地方。、内存分配可能失败的地方。异常不可能全面代替错误处理。异常不可能全面代替错误处理。不可使用异常来做一般的逻辑控制。不可使用异常来做一般的逻辑控制。宏宏NP_BEGIN_CATCH_ALLNP_BEGIN_CATCH_ALL()()和和NP_END_CATCH_ALLNP_END_CA
15、TCH_ALL()().常见程序问题调试内存泄漏内存溢出/越界多线程死锁发布版本的调试分析只在发布版本才会出现的问题多平台调试.内存泄漏尽量减少对尽量减少对newnew和和deletedelete,mallocmalloc和和freefree的使用,尽的使用,尽量使用量使用C+C+的自动对象,如的自动对象,如std:string,std:vector,std:string,std:vector,class CAutoPtr,class CAutoObjclass CAutoPtr,class CAutoObj等。等。检查低级错误,通查程序里面的检查低级错误,通查程序里面的newnew、dele
16、tedelete、mallocmalloc、freefree等内存操作,等内存操作,deletedelete和和deletedelete是否混用是否混用如果对象有引用计数,查看计数是否有问题。可以如果对象有引用计数,查看计数是否有问题。可以使用调试器分析是谁在申请内存而没释放,使用调试器分析是谁在申请内存而没释放,VCVC里面里面可以直接在可以直接在C/C+C/C+运行库源代码里面设断点,其它平运行库源代码里面设断点,其它平台通过重载全局的台通过重载全局的newnew、deletedelete或者使用或者使用hookhook技术钩技术钩住住mallocmalloc、freefree后,再在重载
17、后,再在重载/钩子函数里设断点。钩子函数里设断点。用用VCVC自带的内存检测机制自带的内存检测机制(调试运行程序,正常退出调试运行程序,正常退出后检查内存信息后检查内存信息)。使用。使用Visual Leak DetectorVisual Leak Detector。其它方法,如打印、程序折半法等。其它方法,如打印、程序折半法等。.内存溢出/越界得到写越界/出错的内存地址(分为全局heap内存和函数局部stack内存),并监控该内存的内容,接着单步执行程序,找到引起该内存变化的语句,此语句就是导致内存越界的直接原因,然后再深入分析,找出真正bug。.多线程死锁理解程序发生死锁的机理。理解程序发
18、生死锁的机理。建议程序里面的线程同步对象全部使用建议程序里面的线程同步对象全部使用 npsync.h npsync.h、ILocker.hILocker.h、NPRWLock.hNPRWLock.h等代码库里面的函数,等代码库里面的函数,struct tagOSMutex:lockedThreadIDstruct tagOSMutex:lockedThreadID,即专为,即专为解决死锁而设计。解决死锁而设计。程序发生死锁后利用调试器的线程切换和堆栈查程序发生死锁后利用调试器的线程切换和堆栈查看能力配合看能力配合lockedThreadIDlockedThreadID信息,一般来说可以信息,一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 调试 技术
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。