常用程序调试技巧.pptx
《常用程序调试技巧.pptx》由会员分享,可在线阅读,更多相关《常用程序调试技巧.pptx(66页珍藏版)》请在冰豆网上搜索。
,常用程序调试技巧,程序错误好比大楼火灾,你知道冒烟了,却不知道哪层着火了。
从楼顶开始找火源,只能被熏死。
看不透浓烟,怎么也找不到火源。
说在前面
(1),本来程序调试是建立在对程序流程理解的基础上,这也是开发过程中对自己程序进行调试的前提。
而我要分享的是以另一种调试方法,类似黑客入侵,是假设你不知道程序逻辑的或者出错模块,但是知道故障信息和调试方法。
说在前面
(2),有一种误区:
程序调试只是找到程序中的错误。
我可以很负责任的告诉你,学好程序调试技术是当黑客的基础,无论是盗取密码、注入病毒、无源码的条件下改变程序行为等等在你看来遥不可及的事情都是以程序调试技术为基础的。
摆脱对程序调试的恐惧、厌烦情绪,其实程序调试是很有趣的。
摆脱这种情绪,是提高程序调试水平的前提。
分享内容,程序错误分类调试的禁忌调试的思路调试工具的使用EXE崩溃的处理办法,程序错误分类
(1),逻辑错误:
表现:
1、计算结果显示与预期不一致2、程序行为异常(功能非预期),程序错误分类
(2),程序异常:
表现:
1、界面元素事件失效2、操作无反应3、错误提示4、EXT框架界面变“大白脸”,程序错误分类(3),EXE崩溃:
表现:
1、提示非法操作2、蓝屏(因调用系统级服务)3、弹出调试窗口(如果客户机上注册了JIT调试器),调试的禁忌,千万不要以阅读代码为调试程序的开始,因为你的大脑不是电脑,不可能像CPU那样执行程序。
调试程序不需要事先了解程序流程,首要目的是快速问题定位。
别上来就用调试器,因为脚本错误仅仅是表象,要找到引起错误的根源。
慎用调试器,调试器是双刃剑!
过度使用调试器会陷入如潮水般的错误信息中,就好像黑客跟踪混淆后的程序一样,很可能无功而返。
好比破解软件,不需要把整个程序反汇编,只需跟踪关键信息。
调试思路,抓住错误信息:
发现浓烟(故障表现),追踪错误信息的传输流,抽丝剥茧找到问题原,因。
(找到浓烟的上升通道,而不是进每间屋子去找起火点),找到引发错误的原点,仔细调试该方法、修改,错误。
(找到起火点,定点清除),注意:
就好像高楼着火,底层的问题会如同浓烟一般的在楼顶显出。
所以,在定位到是脚本本身的问题再开启调试器,否则就会陷入无尽的调试。
调试思路,再现故障故障分段定位问题,调试思路
(1),再现故障,1、记录用户的使用环境,如操作系统版本、浏览器种类、版本以及关键设置。
2、记录用户的操作步骤、输入参数、频率。
3、利用用户的操作步骤在开发机器上再现故障。
如果不能再现,可能:
1、程序部署不完全2、用户环境问题3、收集的参数信息不完整4、错误数据引起的程序问题,调试思路,故障分段,作为经常使用的B/S开发模式,最好的故障分段方法就是以网络作为划分界限。
将程序分为:
Server端:
CSP页面、类方法Browser端:
CSP页面,JavaScript,故障分段使用的软件:
HttpWatchProfessional,用这个软件干啥?
1、分析浏览器传输的数据,找到故障出在Browser端还是Server端。
2、收集类方法、Query调用参数,用于下一步在Terminal下调试。
3、收集Server端返回数据:
校验返回数据,例如JSON串是否合法,判断返回结果是否正确。
HttpWatch,未发送数据,发送数据正确,发送数据错误,返回数据正确,返回数据错误,Browser端,Server端,图解HttpWatch分析结果对应的故障发生点,HTTPWatch的使用,1、安装好HttpWatch2、进入IE,在菜单中选择HttpWatch,或者按【Shift】+【F2】启动HttpWatch,3、按按钮,HttpWatch开始监听IE的请求。
有HTTP错误的【Result】列会标红。
选择改行,可以查看具体的页面内容。
*代码404代表页面没找到,出现这种错误一般见于脚本路径错误。
*这种问题一般会引起界面元素无反应(事件响应失灵),Ext界面会变“白脸”显示不出内容等现象。
【Method】列,POST的行,代表提交数据,可以选择改行,查看提交的参数,服务器返回的数据。
【URL】列,代表访问的页面。
【POSTData】页签,可以查看提交的参数。
【Content】页签,可以查看服务器响应的页面内容。
在Chrome中如何操作?
方法:
1、按【F12】,启动调试工具2、选择【Network】页签3、刷新页面,在Chrome中如何操作?
4、点击一行,可以看到提交的信息以及服务器的响应信息。
在FireFox中如何操作?
方法:
1、按【F12】启动调试工具2、选择【网络】页签3、按【重新载入】按钮4、其它同Chrome,在FireFox中如何操作?
【参数】页签,可以查阅提交(POST)的参数信息。
【响应】页签,可以查阅服务器返回的信息。
在FireFox中如何操作?
调试思路
(2),定位问题在上一步中,我们找到了故障的分段情况,在这个步骤,要定位问题。
1、如果是Server端的故障,利用HttpWatch收集到的参数,找到对应的类方法或Query,然后到Terminal和Studio中进行调试,方法这里不再赘述。
2、如果是Browser端的故障,则需要缩小排查范围。
定位问题的方法1、利用HttpWatch找到页面加载的JS文件(排除系统自带的以及本组公用的JS)。
2、利用HttpWatch检查页面需要的JS文件是否正确下载。
路径错误,HTTP错误代码:
404。
路径错误,引用了别的文件。
没清缓存,还是原来错误的JS内容。
定位问题的方法:
3、使用工具:
调试器利用堆栈调用查看出问题的函数以及先后调用关系。
在堆栈,从上至下检查每级函数调用的参数及返回值,找到出现故障的函数。
例如:
*参数传递错误引起的运行错误*参数正确,处理逻辑有问题,进入JS函数进行调试,调试脚本的范围顺序:
界面独有JS本组公共JS系统框架JS调试脚本的步骤:
清空/禁用缓存语法检测逻辑检测,调试器的使用,1、IE调试器使用前的设置2、语法错误的检查3、IE调试器的使用4、Chrome和FireFox调试器的使用,IE调试器使用前的设置(调试器的使用),
(1)设置IE的页面兼容性设置。
*在IE菜单中选择【工具】【兼容性视图设置】*勾选【在兼容性视图中显示所有网站】,
(2)修改IE的选项卡设置:
这也是为了更方便的使用调试功能,快速定位页面以及启动调试器,防止菜单栏被隐藏。
在IE菜单栏中选择【工具】-【Internet选项】,打开设置窗口后选择【常规】页签,点击【选项卡】项目的【设置】按钮,按照下图设置,然后按【确定】按钮,(3)设置IE的调试选项,启用调试后,IE在网页脚本出错时会弹出调试器选择对话框,并根据用户选择启动对应的调试器。
还是在【Internet选项】对话框中,选择【高级】页签,然后找到调试选项,如下图所示设置,然后按【确定】按钮,语法错误的发现与定位(调试器的使用),在IE的调试器内,启动调试,如果遇到语法错误,会提示如下:
在Chrome中的调试器下,语法错误会显示如下:
1、系统不会提示具体哪行有语法问题。
2、系统会提示那个有语法错误的文件中的函数全都无效(notdefined)。
3、在“无效函数”调用处停止。
在FireFox浏览器下,调试器的表现和Chrome是相类似的。
Chrome和FireFox需要自己检查js的脚本错误:
利用WindowsScriptHost检查脚本错误Cscript.exe,IE调试器的使用(调试器的使用),1、启动调试器,在任意IE窗口,按【F12】键(Chrome和FireFox操作相同)选择【脚本】页签按【启动调试】按钮,IE调试器的使用,2、等待错误触发,程序出错崩溃断点脚本中“debugger”语句的执行,IE调试器的使用(界面介绍1),继续执行逐语句,代码窗口:
控制语句执行、下断点、监视逐过程跳出,当前执行的语句断点,IE调试器的使用(界面介绍2-1),控制台:
显示输出、单步执行语句,在脚本中输出的信息,执行脚本语句例如:
变量名,表达式,拦截cspRunServerMethod,传统的cspRunServerMethod需要加密调用的类方法,且函数调用参数不好获取。
解决办法:
可以利用JavaScript的函数覆盖功能拦截cspRunServerMethod。
在CSP页面中加载该js文件(放在所有js引用语句之后)。
下面即是脚本拦截的内容:
varfnOldCspRunServerMethod=null;functionhookCspRunServerMethod()varstrExpression=varstrResult=fnOldCspRunServerMethod(;for(vari=0;i0)strExpression+=,;strExpression+=arguments+i+;strExpression+=);eval(strExpression);varstrTmp=tkMakeServerCall(%CSP.Page,Decrypt,arguments0);varMethodName=strTmp.substr(strTmp.lastIndexOf(.)+1,strTmp.length-strTmp.lastIndexOf(.)-1);varClassName=strTmp.substr(2,strTmp.lastIndexOf(.)-2);tryvartmpStr=ntmpStr+=调用类:
+ClassName+n;tmpStr+=调用方法名:
+MethodName+n;for(vari=1;i1)tmpStr+=,;tmpStr+=+argumentsi+;tmpStr+=)n;if(strResult!
=null)tmpStr+=返回结果:
【+strResult+】n;window.console.info(tmpStr);elsetmpStr+=此函数调用出错!
返回结果:
【+strResult+】n;window.console.error(tmpStr);returnstrResult;catch(err)functioninitHook()fnOldCspRunServerMethod=cspRunServerMethod;cspRunServerMethod=hookCspRunServerMethod;initHook();,拦截cspRunServerMethod(效果截图),随着语句执行,可以在“控制台”中显示调用信息。
IE中需要先“启动调试”才能显示调用信息。
IE调试器的使用(界面介绍2-2),向调试器输出一般信息:
window.console.info(输出信息);,向调试器输出错误信息:
window.console.error(输出信息);,IE调试器的使用(界面介绍2-3),注意:
(1)尽量不要用alert语句弹框来调试程序。
因为程序停止时,你也不能进行任何操作(例如查看变量值,堆栈信息),而且如果在正式库上调试程序,这样做用户会很反感,也容易出现问题(比如alert拼写错误导致脚本直接报错停止执行)。
IE调试器的使用(界面介绍2-4),注意:
输出信息在不启动调试时是不显示的。
若希望程序中途暂停,可以使用语句:
debugger;,IE调试器的使用(界面介绍3),断点:
管理代码中的断点信息,IE调试器的使用(界面介绍4),局部变量:
显示/编辑当前作用域的变量,IE调试器的使用(界面介绍5),监视:
监视某个变量的值,IE调试器的使用(界面介绍6),调用堆栈:
显示函数的调用顺序,关于堆栈,函数8函数7函数6函数5函数4函数3函数2函数1,出错函数,出错表现,1、错误信息会像浓烟一般的向上传递,所以需要在堆栈上检查各级函数并检查各函数的传入参数。
2、在找到着火点(出错函