程序猿二三事之工具使用-Eclipse调试Java常用功能介绍

[ TOC ]

调试常用功能介绍

日常java开发中实际写代码的时间并不会很多,花在整理思路,代码重构,调试bug会占用很大部分时间。
熟练掌握调试工具,了解调试相关技巧,是java开发中减少调试时间,提高效率不可或缺的一部分。
使用System.out.println作为调试主要工具的方法,是java初学者对着书本例子敲代码的做法。

一、调试相关的常用窗口

调试中最常用的窗口是:

窗口 说明
Debug窗口 主要显示当前线程方法调用栈, 以及代码行数(有调试信息的代码)
断点Breakpoints窗口 => 断点列表窗口,可以方便增加断点,设置断点条件,删除断点等
变量Variables窗口 => 显示当前方法的本地变量,非static方法,包含this应用,可以修改变量值
代码编辑窗口 => 这个不用多说了
输出Console窗口 => 日志等输出内容,调试时,可以将关注的组件级别设置低一点,以便获得跟多输出信息

另外辅助的窗口有:

窗口 说明
表达式expression窗口 => 写上自己需要观察的数据的表达式,或者修改变量值
Display窗口 => 可以在display中执行代码块,输出内容等
大纲Outline窗口 => 查看当前类的方法,变量等
类型层级Type hierarchy窗口 => 查看当前所在类的继承层次,包括实现接口,类继承层次
方法调用关系Call hierarchy窗口 => 查看当前方法被哪些方法调用,调用方法在哪些类中、第几行,可以直接打开对应的方法
搜索结果Search窗口 => 结合快捷键可以查看变量、方法等在工作空间、项目、工作集中被引用或定义的代码位置

窗口全览

all_window_over_view
all_window_over_view

二、断点类型及断点窗口

在调试中可以设置的断点类型有五种: 行断点(line breakpoints),方法断点(method breakpoints ),观察断点(watch breakpoints-成员变量访问变更),异常断点(exception breakpoints), 类加载断点(class load breakpoints)。每种断点的设置有些许不一样,可以在断点上右键->Breakpoint properties进行设置,但一般在断点窗口有快速设置的界面,Breakpoint properties中多了filter, 其实比较鸡肋,用处不大。

断点相关的快捷键

快捷键 说明
ctrl+shift+b 在光标处大断点/取消断点
ctrl+alt+b 忽略所有断点
Alt+shift+q, b 激活断点窗口

1、行断点: 在方法中的某一行上打断点1.1、1.4。行断点可以设置挂起线程/VM的条件1.3,访问次数1.2。
1.3中的条件是,spring在注册Bean定义(registerBeanDefinition)时,如果是org.springframework.demo.MyBean,就挂起线程,可以开始单步调试了。
对于命中次数(hit count)1.2的使用,一般是在循环中,第N个对象的处理有问题,设置hit count = N, 重调试时,可以方便到达需要调试的循环次数时,停下来调试。

2、方法断点:在方法上打断点2.1、2.2。方法断点的好处是可以从方法方法进入或者退出时2.3,停下来调试,类似行断点,而且只有行断点和方法断点有条件和访问次数的设置功能。
但是方法断点还有另外一个好处,如果代码编译时,指定不携带调试信息,行断点是不起作用的,只能打方法断点。
有兴趣的可以通过A1将Add line number... 前的勾去掉, 调试下看看。

line_and_method_breakpoints
line_and_method_breakpoints

3、观察断点: 在成员变量上打的断点3.1、3.3。只有对象成员变量有效果,静态成员变量不起作用。
可以设置变量被访问或者设置的时候挂起线程/VM 3.2,也就是类似3.4的所有对成员变量的访问或者设置的方法都会被监控到
4、异常断点: 异常断点可以通过4.6添加,或者点击日志信息中输出的异常类信息添加。
异常断点4.1,系统发生异常时,在被捕获异常的抛出位置处或者程序未捕获的异常抛出处4.2、4.4, 挂起线程/VM, 也可以指定是否包括异常的子类也被检测4.3、4.5。
另外除了以上正常设置的异常挂起,从java->debug中可以设置挂起执行,主要有下面两个: 1、是否在发生全局未捕获时挂起(suspend execution on uncaught exceptions),调试时,老是有异常挂起影响调试,但是没有设置异常断点的情况,就可以勾选掉这个选项;2、是否在编译错误时挂起,一般在边调试边改代码时会发生这种情况;

另外要提一个的是有main方法启动的应用,可以在调试配置中勾选stop in main A3, 程序进入时,会挂起线程,等待调试。

watch_and_exception_breakpoints
watch_and_exception_breakpoints

5、类加载断点: 在类名上打的断点5.1。接口上是打不了类加载断点的,但是抽象类是可以的,只是在调试的时候,断点不会明显进入classloader中,单步进入知会进入到子类的构造方法中,非抽象类在挂起线程后单步进入就会到classloader中(如果没有filter过滤掉的话)5.3。类加载断点不管是打在抽象或者非抽象类上,都会在类第一次加载或者第一个子类第一次被加载时,挂起线程/VM 5.2。

class_load_breakpoints
class_load_breakpoints

三、Debug窗口、代码窗口,快捷键

打完断点进入调试阶段,调试过程中最主要的就是调试窗口和代码窗口, 调试窗口和代码窗口的右键菜单、使用的快捷键以及达到的效果都值得深入了解;

Debug窗口右键菜单及快捷键:如A6所示。
代码窗口右键菜单及快捷键:如A7所示。

下面将按照功能,结合A6、A7一起说明:

1、调试执行

标记 功能 快捷键 描述
6.4 Step Info F5 -> 单步进入(如果有方法调用,将进入调用方法中进行调试);
6.4 Step Over F6 -> 单步跳过(不进入行的任何方法调用中,直接执行完当前代码行,并跳到下一行);
6.4 Step Return F7 -> 单步返回(执行完当前方法,并从调用栈中弹出当前方法,返回当前方法被调用处);
6.5 Resume F8 -> 恢复正常执行(直到遇到下一个断点);
7.4 Run to Line Ctrl+R -> 执行到当前行(将忽略中间所有断点,执行到当前光标所在行);
6.3 Drop To Frame -> 回退到指定方法开始处执行,这个功能相当赞。
在方法调用栈上的某个方法右键,选择Drop To Frame就可以从该方法的开始处执行
比如重新执行本方法,可以在本方法上用Drop To Frame,将从本方法的第一行重新执行。
当然对于有副作用的方法,比如数据库操作,更改传入参数的对象内容等操作可能重新执行就再是你想要的内容了。
6.1+6.2 Copy Stack -> 拷贝当前线程栈信息

如果在调试时,需要排除一些类、包等不需要进入调试,可以使用Edit Step Filters设置。
A6的properties: Java进程启动相关信息,包括控制台启动参数,环境参数等。如果参数启动参数有问题可以先看看这里的实际启动参数是不是有误。另外还可以查看虚拟机支持调试的相关选项。

debug_and_code_window
debug_and_code_window

2、数据查看

标记 功能 快捷键 描述
7.4 Inspect ctrl+shift+i -> 察看选择的变量、表达式的值或执行结果, 再次按ctrl+shift+i可以将当前表达式或值添加到Expressions窗口中查看;
7.4 Display ctrl+shift+d -> 显示选择的变量、表达式的值或执行结果, 再次按ctrl+shift+d可以将当前表达式或值添加到Display窗口中显示;
7.4 Execute ctrl+u -> 执行选择表达式;
7.4 Run to Line ctrl+r -> 执行到当前行(将忽略中间所有断点,执行到当前光标所在行);
7.3 All Instances ctrl+shift+n -> 查看选择的类的所有对象,这个功能超赞;
7.3 Instance Count -> 查看选择的类的所有对象个数;
7.4 Watch -> 添加当前变量、表达式到Expressions窗口中;

四、调试时窗口

1、Display窗口A8
在Display窗口中,可以执行代码之外的任何合理的语句,也可以使用Inspect, Display, Execute这些方式查看或者执行语句——8.1。
比如, a、输入com.alibaba.fastjson.JSON.toJSONString(registry, true); 并选择这一行代码,ctrl+shift+d,可以执行这行代码并在Display窗口中输出结果——8.2。
b、当然也可以改变当前代码的变量值,比如输入beanName = "myBeanX"; 选择这行代码,用Inspect, Display, Execute这几种方式都可以执行这行代码。
c、也可以输入System.out.println(com.alibaba.fastjson.JSON.toJSONString(registry, true)); 执行就会在console窗口输出结果。

2、Variables窗口A9
在Variable窗口中可以看到当前方法的本地变量值8.3,非静态方法会有this表示对象自己,也可以查看本地变量相应的属性8.4, 8.5的功能可以让集合类型对象中的数据显示容易看点。
这个窗口除了察看变量的功能之外,还可以直接在Value列修改变量值或对象属性。

3、Expression窗口A10
Expression窗口的功能主要是用来察看变量之外的表达式的结果,执行固定表达式等功能。比如察看变量definitionHolder中的属性beanDefinitionHolder, 直接将definitionHolder.getBeanDefinition()加入到Expressions窗口8.6, 8.7。

display_variables_expression_window
display_variables_expression_window

五、代码查看辅助窗口

1、代码窗口

标记 功能 快捷键 描述
11.1~11.5 quick type hierarchy ctrl+t 查看当前类、接口的继承层次, 默认进入时,显示继承/实现当前类/方法的子类,子接口11.1;再次ctrl+t,将显示当前类、接口继承/实现的超类/接口11.2;调试时,经常用该功能,在接口或抽象类的方法调用处11.3,ctrl+t察看实现类11.4,直接导航到对应的实现方法中11.5。
quick outline ctrl+o 查看当前类的大纲,包括方法,属性等内容; 用处不大;
open declarations F3 查看变量、属性、方法定义的地方
code_window_hotkeys
code_window_hotkeys

2、Call Hierarchy窗口:

标记 功能 快捷键 描述
12.1~12.2 open call hierarchy ctrl+alt+h 查看方法被调用层次, 可以看当前方法被调用的地方12.1,或者当前方法调用了其他类的方法12.2
call_hierarchy
call_hierarchy

3、Type Hierarchy窗口

标记 功能 快捷键 描述
13.1~13.4 open type hierarchy F4 查看继承层次, 可以查看类的继承层次,包括子类父类13.1, 或者类实现的接口继承层次13.2,还会根据选择的类/接口,在右边显示该类的大纲13.3、 13.4; 13.3可以选择是否显示父类/父接口的属性、方法等
type_hierarchy
type_hierarchy

4、Search 窗口

标记 功能 快捷键 描述
14.1 declarations ctrl+g 相同的方法签名在工作空间中及第三方jar包中被定义的位置14.1
14.2 references ctrl+shif+g 当前选中的变量、属性、方法在工作空间中及第三方jar包中被引用的位置14.2
14.3 ctrl+shift+u 查看变量、属性 、方法在当前类中出现的地方14.3
14.4 implements 查看实现当前接口的类14.8
14.4~14.7 显示方式 可以选择不同的显示方式,具体看图
search_window
search_window

PS:简书不支持内嵌html????

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容