debug没反应 eclipse_IDEA&Eclipse中debugger调试常用技巧

本文详细介绍了在IDEA和Eclipse中进行debug时的多种高级技巧,包括改变变量值、条件断点、代码片段与变量视图、Evaluate或Inspect、丢弃栈帧、智能步入与步入选择、变量断点、方法断点、多线程调试、日志断点、强制返回等。这些技巧能够帮助开发者更高效地定位和解决问题。
摘要由CSDN通过智能技术生成

转载请说明出处:IDEA&Eclipse中debugger调试常用技巧

改变变量的值

在调试的过程中可以改变非final变量的值。

911cf5a90b59833827d5f866354ea509.gif

IEDA改变值.gif

条件断点

有时候断点会打在循环里,或者希望在某个条件下才触发断点,这个时候条件断点就派上用场了,在idea里对着断点右键。如下,在循环里,希望i的值为8的时候才开始调试。

0e9885524ab73367c6f032ba9860161a.gif

条件断点.gif

代码片段&&变量视图

有时候你调试的时候,突然想增加一段代码,又不想重新启动调试,这个功能可以用上。

f19d334f5e0e5aec3e99717910a47a9c.png
ac0f4400cd5d7501ff4c7c0d7ec1cc1c.gif

代码片段.gif

在调试的过程中同时改变了变量的视图,用toString来显示,可以看到list里的两个值1和2。

Evaluate or Inspect

上面的代码片段使用到的是Evaluate功能,这个功能很强大,比如我在跟踪spring源码的时候,我想知道AOP代理对象如何产生的时候,遇到如下代码:

c4a51c4014a2aa04ba9ca0edaee71d02.png

image.png


因为我主要关注代理对象什么时候产生,所以这个时候我只想看看那个方法给我返回了代理对象,这时候我应该直接Step Over还是Step Into到resolveName这个方法里呢?可以用Evaluate来帮忙:

f35b19b74f08c26175dbc67427e3aa89.png

image.png


从上图可以看出,我评估了一下这个方法,发现这个方法能返回代理对象,显然我需要Step Into到这个方法里。

Eclipse如果想在Eclipse里执行evalution或者叫Inspect,有两种方式:

1.需要在window -> show view -> display打开display面板,然后在面板里执行(ctrl+u)java语句。

fd826d4beebf75092e89969e0ed149e2.png
9cd51bd2e6123951f5c7ad3a60871579.png

2.选中语句,右键 -> Inspect(快捷键是Ctrl+Shift+I):

cba3f3ca60a7c5a698c0c021ddd1395a.png

丢弃栈帧(Drop Frame)

大家应该都遇到过调试代码的时候想回到上一步,或者回到上一个调用方法的时候吧?IDE 为我们提供了一个Drop Frame的功能,可以让我们丢弃当前的栈帧,如果不知道这个功能,你可能只能选择重新启动debugger开始调试,这样效率有点低。假设有这样的调用关系:methodA -> methodB -> methodC -> methodD如下:代码调试到第51行,想看看从50进入到methodD内部调试,这个时候就可以使用丢弃栈帧了。在底下调用栈中右键methodC -> Drop Frame,就会回到methodB调用的那一个栈帧。

e8d27140fd0a42e92ab8662af7b7a250.png
689d40ee59814c0454d6f7a03679e35d.gif

Drop Frame.gif

智能步入(Smart Step Into)/步入选择(Step Into Selection)

有时候调试代码的时候会存在层层嵌套的情况,这个时候step into可能就没这么好用了,选择性的step into就显得很重要了。

IDEA

69f25735e7d48ce26b2f95b5e0213da7.gif

SmartStepInto.gif

EclipseEclipse需要先选中想要Step Into的方法,然后按Ctrl+F5进入,如下:

d5307f5f168c8a820c7917110223b61f.gif

StepIntoSelection.gif

变量断点

变量断点在变量初始化或者变量值改变的时候可以是程序停在变量值改变的那行代码上。

d9815080b2bee0b8d9de40d366bd9e2e.png

变量断点

当然,变量断点也是可以设置condition的,如上图。

方法断点&&Force step into

方法上也是可以打断点的,比如有时候我们想进入到jdk内部的方法里,因为jdk的class在编译的时候为了节省空间,去掉了调试信息,用普通的step into可能进入不了方法内部,这个时候可以在相应的方法上打个断点,或者使用Force step into进入到方法体内部。

e7f0131292fb32687d8ea64a51aa84c9.png

方法断点

879600e4905f767b075092f27b7d676a.png

Force step into

多线程调试

idea中让其他线程也在断点中停下来。

693aa021db862d6c866f71bb8f95b7c6.png

image.png

通过Debugger窗口下拉菜单来切换线程:

4f7d1b365315be7ea4eec6e69b800d52.png

image.png

eclipse中让整个虚拟机都挂起,避免其他线程继续执行。

9fbff7ef529c49bc83cf7697d01a22e9.png

日志断点(添加执行语句)

有这样一些场景:需要动态插入一条执行语句,或者调试的时候需要额外打印一些日志信息来协助观察问题。有时候可能会选择在代码里写入一些语句,这样会污染代码而且可能忘记删除或者注释掉,而且通过添加代码的方式可能会导致整个项目重新编译,需要较长时间。

ac40b1d3f6d02bfd8e76394490dac450.png
ddc00179a918afab26747e977b1a25ce.png
d2872cec8d1f958a9ef98a9207db6f90.png

红框部分相当于Log#info出来的信息。

当然你也可以log出堆栈信息,如下,勾选:

323a02a057e0b74b948b849cfee887a0.png

甚至你可以添加语句,然后让debug的时候跳过这个断点,不要停留,这样你debug的时候断点到这里就不会挂起:

e9c76bc7c3665560fb2449ac82f4369d.png

强制返回(Force Return)

之前在windows上调试hadoop代码的时候,有一段代码要判断可读权限(boolean canRead()),总是返回false导致程序异常而执行中断,然后发现可以在进入某个方法后强制返回,强制返回一个true就不会出错了。

9f58978f05983e085b147e23a08c5dd8.gif

ForceReturn.gif


只要在对应的方法上执行:右键 -> Force Return就可以编写返回语句了。可以编写负责语句,也可以调用方法。

82a7970e78c04dc38c708df126a6f20b.png

多语句

2d7a8736fc2d9f79aaca1ef99ef25260.png

调用方法

本文的录屏软件使用的是ScreenToGif.exe。

未完待续,持续更新。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值