Debug用于跟踪代码的运行过程,通常在程序运行过程中出现异常时,开启Debug模式可以分析定位异常发生的位置发生,以及运行过程中参数的变化。通常我们也可以开启Debug模式来跟踪代码的运行过程来学习三方框架的源码。1.开始Debug,先在IDEA中看一下Debug模式下的界面。下面是在IDEA中启动Debug模式,进入断点后的界面。我这里是Windows,可能和Mac图标略有不同。简单说一下下图中标注的8个地方:①以Debug模式启动服务,左边的按钮是以Run模式启动。在开发中,我一般直接启动Debug模式,方便随时调试代码。②断点:在左侧行号栏点击左键,或快捷键Ctrl+F8标记/取消断点,断点线颜色可自行设置。③调试窗口:访问请求到达第一个断点后,自动激活调试窗口。如果没有自动激活,可以到设置里进行设置,如图1.2所示。④调试按钮:共有8个按钮。调试的主要功能对应这些按钮。您可以通过将鼠标悬停在按钮上来查看相应的快捷键。在菜单栏运行中可以找到相同对应的功能,如图1.4所示。⑤服务按钮:可以在这里关闭/启动服务,设置断点等。⑥方法调用栈:显示线程调试的所有方法。如果勾选右上角的【ShowAllFrames】按钮,其他类库的方法就不会显示出来,否则这里会有很多方法。⑦变量:在变量区可以查看当前断点之前的方法中的变量。⑧Watches:查看变量,可以将Variables区的变量拖到Watches中查看【图1.1】【图1.2】:在设置中勾选Showdebugwindowonbreakpoint,进入后会自动激活Debug窗口breakpoint【图1.3】:如果你的IDEA底部没有显示工具栏或者状态栏,可以在View中打开,显示工具栏会方便我们使用。您可以自己尝试这四个选项。【图1.4】:在菜单栏Run中,有调试对应的功能,同时可以查看对应的快捷键。二、基本使用&快捷键Debug功能主要对应图1中的4、5两组按键:1、首先第一组按键,共8个按键,从左到右依次为:[图2.1]显示执行点(Alt+F10):如果您的光标在另一行或其他页面上,单击此按钮可跳转到执行当前代码的行。StepOver(F8):Stepover,逐行往下走,如果这一行有方法,则不会进入该方法。StepInto(F7):步入,如果当前行有方法,可以进入方法,一般用于进入自定义方法,不会进入官方类库的方法,比如put方法online25.ForceStepInto(Alt+Shift+F7):强制步入,可以进入任意方法,查看底层源码时可以使用该方法进入官方类库。StepOut(Shift+F8):Stepout,从踏入的方法退出到方法调用。这个时候方法已经执行了,但是赋值还没有完成。DropFrame(defaultnone):回滚断点,后面章节会详细介绍。RuntoCursor(Alt+F9):运行到光标处,可以将光标定位到需要查看的行,然后使用该功能,代码会运行到光标所在行,没有断点。EvaluateExpression(Alt+F8):计算表达式,后面章节会详细介绍。2、第二组按钮,共7个按钮,从上到下依次为:【图2.2】重新运行'xxxx':重新运行程序,会关闭服务,然后重新启动程序。Update'tech'application(Ctrl+F5):更新程序,一般在你的代码被更改后执行这个功能。该功能对应的操作在服务配置中,如图2.3所示。恢复程序(F9):恢复程序,比如你在第20行和第25行有两个断点,当前运行到第20行,按F9,然后运行到下一个断点(即第25行),再按F9运行整个过程,因为后面没有断点。暂停程序:暂停程序并启用调试。目前还没有发现具体的用法。停止'xxx'(Ctrl+F2):连续按两次关闭程序。有时候你会发现,关闭服务再重启,会报端口被占用。这是因为服务没有完全关闭,所以需要杀掉所有的JVM进程。ViewBreakpoints(Ctrl+Shift+F8):查看所有断点,后面章节会讲到。MuteBreakpoints:静音断点。选择此项后,所有断点都会变成灰色,断点将被禁用。按F9直接运行程序。再次点击,断点变为红色,有效。如果只想禁用某个断点,可以在断点上右击取消Enabled,如图2.4所示,该行的断点就失效了。[图2.3]Updateprogram,On'Update'actions,执行更新操作时要做什么,一般选择'Updateclassesandresources',即更新类和资源文件。一般最好配合热部署插件,比如JRebel,这样就不用每次改代码都重启服务了。上一章附上如何激活JRebel。下面的Onframedeactivation是在IDEA窗口失去焦点时触发的,也就是当你从idea切换到浏览器时,idea会自动帮你做事。一般可以设置Donothing,频繁切换会比较消耗资源。 [图2.4]3.变量查看在调试过程中,跟踪查看变量的变化是非常必要的。这里简单介绍一下IDEA中可以查看变量的几个地方。相信大多数人都明白。1、如下,在IDEA中,参数所在行之后会显示当前变量的值。【图3.1】2、当光标悬停在参数上时,显示当前变量信息。点击打开详情如图3.3所示。我一般用这种方法,又快又方便。[图3.2][图3.3]3.ViewinVariables,当前方法中的所有变量都显示在这里。【图3.4】4、在Watches中,点击NewWatch,输入要查看的变量。或者您可以将它从Variables拖到Watche中查看。【图3.5】如果你发现自己没有Watches,可能就是下图所在的位置。[图3.6][图3.7]4.计算表达式上面提到的计算表达式就是图4.1所示的按钮,EvaluateExpression(Alt+F8)。您可以使用此操作在调试期间计算表达式的值,而无需打印信息。【图4.1】1、按Alt+F8或按钮,也可以选择一个表达式然后Alt+F8弹出计算表达式的窗口,如下,按回车或点击Evaluate计算表达式的值.这个表达式既可以是一般的变量或参数,也可以是方法。当你在一行代码中调用多个方法时,你可以通过这种方式检查方法的返回值。[图4.2]2.设置变量。在计算表达式框中,可以改变变量的值,所以有时候很方便我们调试各种取值的情况对不对?[图4.3]5.智能进入想一想,一行代码有好几种方法,怎么只选择一种方法进入。前面说了使用StepInto(Alt+F7)或者ForceStepInto(Alt+Shift+F7)进入方法,但是这两个操作会按照方法调用的先后顺序依次进入,比较麻烦。然后SmartStepInto就很方便了,SmartStepInto,这个功能在Run里可以看到,SmartStepInto(Shift+F7),如图5.1【图5.1】按Shift+F7,会自动定位到当前断点行,列出需要输入的方法,如图5.2所示,点击方法进入方法。如果只有一种方法,直接进入,类似于ForceStepInto。[图5.2]6.断点条件设置通过设置断点条件,只有满足条件才会在断点处停止,否则直接运行。通常,当我们在遍历一个比较大的集合或数组时,我们会在循环中设置一个断点。我们是不是要一个一个的看变量的值呢?一定很累,也许你还是错过了这个,值得再做一次。1、在断点上右击,直接设置当前断点的条件,如图6.1,只有我设置exist为true时,断点才会生效。【图6.1】2、点击ViewBreakpoints(Ctrl+Shift+F8)查看所有断点。JavaLineBreakpoints显示所有断点,在右边勾选Condition,设置断点的条件。如果勾选Logmessagetoconsole,当前断点行会输出到控制台,如图6.3,如果勾选Evaluateandlog,可以执行这行代码计算表达式的值并输出结果到控制台。[图6.2][图6.3]3.说说右边的Filter。这些一般不常用,简单解释一下意思。Instancefilters:实例过滤,输入实例ID(图6.5中的实例ID),但是我这里没有成功,不知道为什么,知道的朋友留言。Classfilters:类过滤,根据类名过滤,也不成功。。。passcount:在循环中使用,如果断点在循环中,可以设置这个值,循环多少次后停在断点处,然后循环将在断点处停止。[图6.4][图6.5]4.异常断点通过设置异常断点,当程序中出现需要拦截的异常时,会自动定位异常行。如图6.6所示,点击+号addJavaExceptionBreakpoints添加异常断点。然后进入需要断点的异常类,如图6.7所示,然后在JavaExceptionBreakpoints中可以看到添加的异常断点。我在这里添加了一个NullPointerException异常断点,如图6.8所示。空指针异常发生后,会自动定位到空指针异常行。[图6.6][图6.7][图6.8]7、多线程调试一般我们在调试的时候都是在一个线程中,一步一步来。但是有的时候你会发现,在调试的时候,你连另外一个请求都发起不了?这是因为IDEA在调试时默认的阻塞级别是ALL,会阻塞其他线程,只有当前调试线程结束后才运行其他线程。可以在ViewBreakpoints中选择Thread,如图7.1所示,然后点击MakeDefault将其设置为默认选项。【图7.1】切换线程,在图7.2的Frames下拉列表中,可以切换当前线程,如下我这里有两个Debug线程,切换到另一个进入另一个Debug线程。【图7.2】八、fallbackbreakpoint调试的时候,不想再次发起请求,要走一遍流程吗?1、首先了解一下该方法的调用栈,如图8.1所示。首先请求进入DemoController的insertDemo方法,然后调用insert方法。让我们忽略其他调用。top方法是当前断点所在的方法。【图8.1】2.断点回滚所谓断点回滚,其实就是回滚到上一个方法调用的开始处。在IDEA中,测试不能逐行回滚,也不能返回到上一个断点。相反,返回到以前的方法。回退有两种方式,一种是DropFrame按钮(图8.2),会根据调用的方法逐步回退,包括第三方类库的其他方法(取消ShowAllFrames按钮会显示第三方类库的方法,如图8.3)。第二种方法是在调用栈方法上选择要回滚的方法,右键选择DropFrame(图8.4),回滚到该方法的上一次方法调用。这时候按F9(ResumeProgram)可以看到程序进入了这个方法的断点。但是需要注意一点,断点回滚只能走一遍流程,一些参数/数据之前的状态发生了变化,不能回滚到之前的状态,比如对象,集合,更新的数据库数据等等等等。图[8.2]图[8.3]图[8.4]9.中断Debug是否想在Debug过程中中断请求并停止执行其余过程?有时候,我们看到传入的参数不对之后,就不想走后面的流程了。怎么中断这个请求(后面的过程需要删除数据库数据...),是不是应该关闭服务重启程序呢?好吧,我以前也这样做过。确切的说,我还没有找到直接中断请求的方法(除了关闭服务),但是可以通过ForceReturn,即强制返回,来避免后面的过程,如图9.1所示。点击强制返回,弹出返回值窗口。我的方法的返回类型是Map,所以我这里直接返回结果强制返回,这样后面的流程就不会进行了。或者你可以新建HashMap<>()。【图9.1】【图9.2】十、附:JRebel激活目前,我一直在使用JRebel作为热部署工具,效果还是比较满意的。修改Java代码或xml等配置文件即可热更新。偶尔,当服务运行时间过长,或者更改了很多文件时,热更新没有生效,需要重启服务。这里只是简单介绍一下我在网上看到的一种免费(非破解)获得永久使用权的方法。我不确定什么时候不能使用这种方法。①首先你需要一个Facebook或Twitter账号(最好是Twitter)②进入这个网站:https://my.jrebel.com/,然后登录...③然后你就可以在InstallandAcctate中得到你的永久激活码。④在settings中设置Jrebel中的激活码,如图10.3所示。如果没有安装JRebel插件,请先安装并在Plugins中搜索JRebel插件。【图10.1】【图10.2】【图10.3】有什么不对的地方或者更好的方法,欢迎留言!作者:bojiangzhouhttps://www.cnblogs.com/chian...
