idea debug
只对debug的简单调试功能的使用进行了说明,其实也已经够用了。
没有对深层次的debug调试功能进行说明。
一、code
1.1.项目结构

1.2.项目代码
MainApplication?
package com.java2001;
public class MainApplication {
public static void main(String[] args) {
Test1 test1 = new Test1();
System.out.println("main, step1");
System.out.println("main, step2");
test1.test1_1();
System.out.println("main, step3");
}
}
Test1?
package com.java2001;
public class Test1 {
public static void test1_1(){
System.out.println("Test1, test1_1, step1");
System.out.println("Test1, test1_1, step2");
test1_2("Ta1entO_o");
System.out.println("Test1, test1_1, step3");
}
public static String test1_2(String name){
System.out.println("Test1, test1_2, step1");
System.out.println("Test1, test1_2, step2, " + name);
System.out.println("Test1, test1_2, step3");
test1_3();
return "hello," + name;
}
public static void test1_3(){
System.out.println("Test1, test1_3, step1");
System.out.println("Test1, test1_3, step2");
System.out.println("Test1, test1_3, step3");
}
}
二、功能按钮
2.1.Show Execution Point

功能:跳转到正在执行的断点处。
断点位置如下?

在MainApplication点击debug按钮开始跑程序。

页面会跳到加断点的程序中。
并且在断点所在行进行高亮展示。
旁边的红色圆圈加了一个黄色的对号。
回到MainApplication页面。

然后点击 Show Execution Point,页面会跳到刚才程序加断点的地方。

2.2.Step Over

功能:逐行执行,不进入方法。
断点位置。

点击debug进行运行,程序停在断点行,并且高亮显示。

注意此时断点行的语句还没有执行,只打印了上一句。

不断点击Step Over按钮,程序逐行执行。
每点一次,高亮下调一行。


不断点击Step Over,直到程序执行完毕。
2.3.Step Into

功能:逐行执行,遇到自定义方法后,进入自定义方法逐行执行。
断点位置。

点击debug执行程序。
点击debug进行运行,程序停在断点行,并且高亮显示。

点击StepInto,程序进入下一行高亮。

再次点击StepInto,程序进入 test1_1方法体内。

然后不断点击StepInto,程序逐行执行,直到程序运行到test1_2方法。

此时再点击StepInto,程序进入test1_2方法体内。

不断点击StepInto,程序逐行执行。
遇到test1_3()执行,再点击StepInto,程序进入test1_3方法体内。
不断点击StepInto,程序在test1_3方法体内逐行执行。
当执行完test1_3方法,即程序运行到test1_3的右花括号位置。
此时再次点击StepInto,会返回test1_2方法体内,继续在test1_2方法体内逐行执行。
当执行完test1_2方法,即程序运行到test1_2的右花括号位置。
再次点击stepInto,会返回test1_1方法体内,继续在test1_1方法体内逐行执行。
当执行完test1_1方法,即程序运行到test1_1的右花括号位置。
再次点击stepInto,会返回main方法体内,继续在main方法体内逐行执行。
当执行完main方法,即程序运行到main的右花括号位置。
程序执行完毕。
这个原理类似于栈,遇到新方法,压入栈,方法体执行完了,出栈。
入栈
执行
main方法,main方法入栈。
main方法内调用了test1_1方法,test1_1方法入栈。
test1_1方法内调用了test1_2方法,test1_2方法入栈。
test1_2方法内调用了test1_3方法,test1_3方法入栈。
出栈
test1_3执行完,出栈,回到test1_2中。
test1_2执行完,出栈,回到test1_1中。
test1_1执行完,出栈,回到main中。
main执行完,程序执行完毕,栈空。
2.4.Force Step Into

功能:逐行执行,
遇到自定义方法后,进入自定义方法逐行执行。
遇到内置方法后,进入内置方法逐行执行。
Force Step Into功能和StepInto功能相似。Force Step Into功能比StepInto功能强,但是用处不大。
断点位置。
点击dubug执行程序,程序停到断点位置。
此时点击Force Step Into程序进入内置方法println中。
其余和Step Into相同。
我们使用的基本都是自己写的方法,所以说Force Step Into几乎没什么用。
深入源码学习的时候可能会用到。
2.5.Step Out

功能:迅速执行完当前方法,然后跳出当前方法,回到调用此方法的方法。
用栈的思想来解释比较好理解:迅速将栈顶方法执行完,然后让栈顶方法出栈。
断点位置。
点击debug执行程序,程序停到断点位置。
此时,程序停在test1_2中,并且当前高亮行及下面的语句还未执行。
控制台打印信息如下。
此时,程序停在test1_2中。
test1_2是被test1_1调用的。
所以,点击Step Out,迅速执行完test1_2,然后回到test1_1。
此时,程序直接回到test1_1中调用test1_2()的地方 ,且test1_2()已经执行完毕。
**注意:**此时连test1_2中的test1_3也执行完了。
此时,程序走到了test1_1方法中的test1_2(),且这行代码执行完毕。
如果再点击StepOut,
会迅速执行完test1_1还未执行的语句,
然后程序会回到Main方法,因为test1_1是被Main方法调用的。
2.6.Drop Frame

功能:不执行剩余语句,然后跳出当前方法,回到调用此方法的方法。
与Step Out的区别就是:Step Out执行完断点所在方法,而Drop Frame不会执行完当前方法。
断点位置。
点击debug执行程序,程序停到断点位置。
此时,程序停在test1_2中,并且当前高亮行及下面的语句还未执行。
控制台打印信息如下。
此时,程序停在test1_2中。
test1_2是被test1_1调用的。
所以,点击Drop Frame,不会执行test1_2中剩余语句,然后回到test1_1。
控制台信息如下。
控制台信息没有变化,
程序直接回到test1_1中调用test1_2()的地方 。
此时,相当于test1_2()还没有执行。
用栈的思想来解释比较好理解:栈顶方法还未执行完毕,就直接让它出栈,然后当再遇到此方法的时候,重新让他入栈,重新执行。
停在test1_2中,并且当前高亮行及下面的语句还未执行。
控制台打印信息如下。

此时,程序停在test1_2中。
test1_2是被test1_1调用的。
所以,点击Drop Frame,不会执行test1_2中剩余语句,然后回到test1_1。
控制台信息如下。
控制台信息没有变化,
程序直接回到test1_1中调用test1_2()的地方 。
此时,相当于test1_2()还没有执行。
用栈的思想来解释比较好理解:栈顶方法还未执行完毕,就直接让它出栈,然后当再遇到此方法的时候,重新让他入栈,重新执行。
本文只对idea调试的简单功能进行讲解,
深层次的调试功能我不会,因为还没有学习。