欢迎来到天天文库
浏览记录
ID:56391703
大小:218.00 KB
页数:23页
时间:2020-06-15
《程序调试技巧.ppt》由会员上传分享,免费在线阅读,更多相关内容在PPT专区-天天文库。
1、程序调试技巧研发部2008年培训培训内容调试方法断点技巧线程调试服务调试DLL调试辅助工具调试方法集成调试,单步跟踪运行,查看各个变量数据,堆栈等最便宜的调试工具:ODS,Trace,MessageBox输出日志利用辅助工具修改变量对运行结果不一致的,可以修改数据变量的值,来验证猜测的问题和检验结果一般集成调试工具都支持修改变量的值例如怀疑一个函数的返回值不正确导致其他的地方出错,你可以强行修改函数的返回值来验证你的想法缩小范围定位有问题的代码块或者函数采用替代函数检验是否某些函数、过程有问题注释代码
2、块,然后逐步一行行取消注释来判断问题出在何处代码断点断点是最基本的集成调试手段普通的断点方式,在源代码中某一行下断点即可代码断点关键是要知道在什么地方下即可也可以在源代码中下中断断点:int3断点源代码中的int3中断是效率最高的中断方式,特别适合循环中条件中断或不断调用中的条件中断条件断点断点可以设定一些条件,满足某些条件才真正中断程序运行,帮助加快调试的步伐条件可以为运行中,通过断点处多少次才中断(经常用于循环中);也可以为一个表达式,例如某个变量满足一个条件才中断(经常针对特定的数据)条件断点会
3、导致程序运行效率低下,但在Delphi中可以利用汇编的int3中断加快速度,例如如果一个100万次的循环,运行到第90万次的时候程序出错,那么我们如果用其他的方式来中断的话,等待90万次运行是耗时很久的,而如果用int3来中断,则非常快,和正常运行没有区别!数据/地址断点数据断点和地址断点在某些情况下非常有用,但很少人用数据断点非常适合某个变量数据被误修改、对象被错误释放,或者指定地址被错误访问的情况数据/地址断点就是针对某个变量下断点,变量的值被读取或写入的时候,就会在读取或者修改该变量的对应的源代
4、码行中断数据断点可以为读取断点或者写入断点对于AV错误(内存访问错误),非常有效和有用例子:对解码数据转换的时候,发现转换函数在某种情况下出错,利用地址断点很容易就发现了一个指针初始化不正确的错误组合断点若干个断点一起的时候起作用,例如有A,B两个断点,A和B可以分别设定中断动作,例如可以设定A中断的时候,B断点暂时失效,这样可以在一些互斥的断点间提高调试效率比较少用汇编代码大部分的集成开发环境,都支持查看CPU代码利用CPU代码窗口,可以查看到原始的CPU的执行指令,可以发现一些蛛丝马迹CPU代码和
5、源代码不是一一对应,一条高级代码可能对应一条或多条汇编指令CPU代码查看时需要注意编译器的优化指令CPU代码查看和调试,属于非常底层调试,调试时注意查看各个寄存器和堆栈数据无源代码也可以调试!破解经常需要汇编调试procedureTForm1.Button1Click(Sender:TObject);VarX:TButton;BeginX.Free;//请注意看会发生什么?为什么呢?End;线程调试线程调试比较麻烦,要考虑清楚线程之间的关系,理清思路去调试查看当前运行代码所在的线程句柄,配合调用堆栈,
6、检查代码真正运行的线程和代码所在对象的关系检查线程对象创建和调用是否是同一个线程?是否注意了线程同步?线程死锁?是否考虑到了在多CPU下的情况?检查线程对象中创建了的其他的窗口或对象是否其运行线程和创建线程是否一致?窗口的创建线程和消息处理必须是同一个线程!例:调用报表COM接口的时候,发现自己编写的测试程序可以正常调用,但是在后台服务当中运行不正常,调试发现测试程序是在主线程,而以服务运行的时候,创建COM是一个线程,而执行COM中的方法是在另外的线程,导致出错,结果把报表COM线程模式更改为支持多
7、线程解决问题服务的调试服务程序以后台运行,服务运行方式和普通应用程序不一样,一般后台运行的服务没有桌面交互,无须用户干预服务程序可以Attach,注意运行前必须Build或者Link一次,否则Attach后的断点可能不正常如果要调试程序初始化的时候的错误中断,那么可以在服务程序运行的最开始调用Sleep(6000),以便你有足够的时间Attach上去;为方便调试,建议把服务做成两栖程序,既可以作为桌面程序运行,又可以作为服务运行(强烈推荐),Delphi要实现两栖程序非常简单,但带来的好处却非常大!D
8、LL调试DLL无法直接运行,必须利用宿主程序来调用宿主程序必须调用DLL,或者创建COM对象的时候,集成调试器才能中断或允许中断宿主程序也可以Attach上去Delphi中如果DLL无法调试,可以把DLL所在的工程和宿主程序所在的工程放到一个工程组(ProjectGroup)中请注意使用绝对路径,某些版本Delphi和Windows不兼容,可能无法使用相对目录内存泄露VC在调试程序退出的时候会提示内存泄露,注意查看输出的提示信息Delphi程序可以利用M
此文档下载收益归作者所有