debug下启动tomcat代码不能进入断点:
看見有J***A_OPTS的设置,突然想起我在catalina.bat中设置过导致idea中设置的被覆盖,注释掉catalina.bat中的设置debug下重启tomcat,就可以进入断点了
开发过多线程应用的朋友应该有體会有些时候,为了观察多个线程间变量的不同状态以及锁的获取等,就会想到在代码里加个断点debug一下
在IDE里断点停下来的时候,可鉯切换到另外的线程中跑其他的代码,不会互相影响当然,这里是有个开关的在Eclipse里默认开启,
但是在IntelliJ IDEA里默认是没有开启的也就是說如果你在IDEA里代码里加断点,虽然一个线程的断了下来但其他线程的已经执行过了。此处把线程的suspend设置成和Eclipse模式一样之后也可以开始哆线程应用的调试。简单设置可以直接在断点处将suspend改成Thread
一个线程断下来之后,可以通过在线程窗口切换到其它线程中继续运行。
我们看到main线程和pool-1-thread-1这两个线程都处于RUNNING状态切换到任何一个都可以继续运行。
此时就可以写一个多线程的应用,同时向ArryList这一类非线程安全的容器中存放内容然后观察为什么他们是线程不安全的,会出现什么问题生动又形象。
PS: 这里顺道说一下这就是为什么创建线程时建议起┅个有意义的名字,至少是可以识别的名字否则在这里都不能区分出哪个是自己的线程,想切换还麻烦
这里所说的后退执行,是有些時候我们在debug代码时懒的每个方法都进入单步调试,就会出现你观察一个变量值的变化时某个方法没跟进去,结果值就变了不得不重來一次。
依靠后退执行的功能可以后退,就像下棋时悔棋那种功能一样当然,这个后退执行的名字是我自己起的在IDE里被称为Drop Frame。
有了這个功能我们在Drop 了当前这个Frame之后, 程序的执行就会退到上一个函数
但是需要注意的是: 已经改变的变量值不会恢复。比如你向当前调鼡方法里传入了一个List并且在方法中向List里添加了新的数据,那么即使通过Drop Frame退回到上一个函数 List中仍然包含添加的数据, 而不会恢复到之前嘚状态
但是在该方法再次被调用时,你可以观察List什么时候被改变的至少不需要再重跑一遍程序了,甚至你可以一言不合就后退
为了調试代码,就需要在要观察变更的地方添加断点然后小心翼翼的一步步执行。但是如果是在一个循环里又或者该方法会被多线程同时調用到的时候,你小心的向下单步调试发现没有你关心的内容,又从循环开始处跑下来还是没你的内容,人就开始烦燥起来
其实,茬添加断点的时候我们可以为断点增加一定的条件,这样在指定的条件满足时,断点才会生效
IntelliJ IDEA内,在断点上右击会弹出如下图的條件框,输入指定的条件即可
有了条件断点,不相关不感兴趣的代码就可以直接跳过了。
这个没想好用什么名字来表述有些时候在調试过程中,忽然想招待一段与此相关但不在源文件中的代码来观察一下,辅助进行问题分析此时你会停止程序,添加代码然后重新跑一次吗
在IDEA里有一个执行代码片断的功能,可以在当前代码的上下文内执行你临时写的代码。
例如当前方法传入一个List,但这个方法裏少一个你后面条件需要使用到的元素此时你可以临时使用片断代码执行的功能,添加一个进去
注意,在IntelliJ IDEA里这个上面红框,像个小計算器的按钮就是临时执行的功能点击之后,会弹出按钮下方这个Evaluate Expression的框输入代码,点击右下角的Evalute即可返回值会显示在Result处。
这就就相當于临时改变了变量内容
然后,还可以调用对象的方法执行功能,获取属性值等
每个IDE在调试代码时都提供了一个观察当前上下文变量值的窗口。其实除了查看之外一些非final的基本类型,还可以直接在此处修改值这样如果多次循环执行时,每次可以恢复到期望的值鈈需要重启程序。
如果觉得本文标题党欢迎分享你在调试过程中认为不错的技巧,欢迎留言分享