- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序调试技巧.ppt.ppt
程序调试技巧 研发部2008年培训 培训内容 调试方法 断点技巧 线程调试 服务调试 DLL调试 辅助工具 调试方法 集成调试,单步跟踪运行,查看各个变量数据,堆栈等 最便宜的调试工具:ODS,Trace,MessageBox 输出日志 利用辅助工具 修改变量 对运行结果不一致的,可以修改数据变量的值,来验证猜测的问题和检验结果 一般集成调试工具都支持修改变量的值 例如怀疑一个函数的返回值不正确导致其他的地方出错,你可以强行修改函数的返回值来验证你的想法 缩小范围 定位有问题的代码块或者函数 采用替代函数检验是否某些函数、过程有问题 注释代码块,然后逐步一行行取消注释来判断问题出在何处 代码断点 断点是最基本的集成调试手段 普通的断点方式,在源代码中某一行下断点即可 代码断点关键是要知道在什么地方下即可 也可以在源代码中下中断断点:int 3断点 源代码中的int 3中断是效率最高的中断方式,特别适合循环中条件中断或不断调用中的条件中断 条件断点 断点可以设定一些条件,满足某些条件才真正中断程序运行,帮助加快调试的步伐 条件可以为运行中,通过断点处多少次才中断(经常用于循环中);也可以为一个表达式,例如某个变量满足一个条件才中断(经常针对特定的数据) 条件断点会导致程序运行效率低下,但在Delphi中可以利用汇编的int 3中断加快速度,例如如果一个100万次的循环,运行到第90万次的时候程序出错,那么我们如果用其他的方式来中断的话,等待90万次运行是耗时很久的,而如果用int 3来中断,则非常快,和正常运行没有区别! 数据/地址断点 数据断点和地址断点在某些情况下非常有用,但很少人用 数据断点非常适合某个变量数据被误修改、对象被错误释放,或者指定地址被错误访问的情况 数据/地址断点就是针对某个变量下断点,变量的值被读取或写入的时候,就会在读取或者修改该变量的对应的源代码行中断 数据断点可以为读取断点或者写入断点 对于AV错误(内存访问错误),非常有效和有用 例子:对解码数据转换的时候,发现转换函数在某种情况下出错,利用地址断点很容易就发现了一个指针初始化不正确的错误 组合断点 若干个断点一起的时候起作用,例如有A,B两个断点,A和B可以分别设定中断动作,例如可以设定A中断的时候,B断点暂时失效,这样可以在一些互斥的断点间提高调试效率 比较少用 汇编代码 大部分的集成开发环境,都支持查看CPU代码 利用CPU代码窗口,可以查看到原始的CPU的执行指令,可以发现一些蛛丝马迹 CPU代码和源代码不是一一对应,一条高级代码可能对应一条或多条汇编指令 CPU代码查看时需要注意编译器的优化指令 CPU代码查看和调试,属于非常底层调试,调试时注意查看各个寄存器和堆栈数据 无源代码也可以调试! 破解经常需要汇编调试 线程调试 线程调试比较麻烦,要考虑清楚线程之间的关系,理清思路去调试 查看当前运行代码所在的线程句柄,配合调用堆栈,检查代码真正运行的线程和代码所在对象的关系 检查线程对象创建和调用是否是同一个线程?是否注意了线程同步?线程死锁?是否考虑到了在多CPU下的情况? 检查线程对象中创建了的其他的窗口或对象是否其运行线程和创建线程是否一致?窗口的创建线程和消息处理必须是同一个线程! 例:调用报表COM接口的时候,发现自己编写的测试程序可以正常调用,但是在后台服务当中运行不正常,调试发现测试程序是在主线程,而以服务运行的时候,创建COM是一个线程,而执行COM中的方法是在另外的线程,导致出错,结果把报表COM线程模式更改为支持多线程解决问题 服务的调试 服务程序以后台运行,服务运行方式和普通应用程序不一样,一般后台运行的服务没有桌面交互,无须用户干预 服务程序可以Attach,注意运行前必须Build或者Link一次,否则Attach后的断点可能不正常 如果要调试程序初始化的时候的错误中断,那么可以在服务程序运行的最开始调用Sleep(6000),以便你有足够的时间Attach上去; 为方便调试,建议把服务做成两栖程序,既可以作为桌面程序运行, 又可以作为服务运行(强烈推荐),Delphi要实现两栖程序非常简单,但带来的好处却非常大! DLL调试 DLL无法直接运行,必须利用宿主程序来调用 宿主程序必须调用DLL,或者创建COM对象的时候,集成调试器才能中断或允许中断 宿主程序也可以Attach上去 Delphi中如果DLL无法调试,可以把DLL所在的工程和宿主程序所在的工程放到一个工程组(Project Group)中 请注意使用绝对路径,某些版本Delphi和Windows 不兼容,可能无法使用相对目录 内存泄露 VC在调试程序退出的时候会提示内存泄露,注意查看输出的提示信息 Delphi程序可以利用MemoryLog.pas单元或
您可能关注的文档
最近下载
- 2025款比亚迪宋PLUS EV豪华尊贵旗舰型_用户手册驾驶指南车主车辆说明书电子版.pdf VIP
- 第1课《初三,我来了》课件北师大版心理健康教育九年级全一册.ppt
- 2023全域用户经营白皮书:STAR模型,从用户运营到生意增长.doc VIP
- NBT 35042-2014 水力发电厂通信设计规范.pdf
- 《小学英语单元整体作业设计的实践研究》开题报告.docx VIP
- “三个聚焦”内容个人自查报告.docx VIP
- 2024年充电宝市场现状分析:充电宝全球市场销售额达到224亿元.docx
- 各种烟气焓温、密度、比热计算表.xls VIP
- 考试妇科试题.docx VIP
- 德国科技创新与产业趋势.pptx VIP
文档评论(0)