Idea调试Kotlin的高阶函数卡死问题
文章目录
- 前言
- 快捷键
- 解决办法
- 方法一:代码块里没有断点
- 方法二:代码块里有断点
- 总结
前言
在用Idea
调试Kotlin程序时,在高阶函数里添加断点,然后debug启动,用f8快捷键单步调试,总是不出意外的报错,idea就死掉(用程序结束更合适),idea的工具错误提示如下
java.lang.IllegalStateException
at org.jetbrains.kotlin.idea.debugger.stepping.KotlinStepOverInlineFilter.getCallingExpressionLines(KotlinStepOverInlineFilter.kt:62)
at com.intellij.debugger.engine.RequestHint.a(RequestHint.java:161)
at com.intellij.debugger.engine.RequestHint.a(RequestHint.java:176)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:949)
at com.intellij.openapi.application.ReadAction.compute(ReadAction.java:57)
at com.intellij.debugger.engine.RequestHint.checkCurrentPosition(RequestHint.java:174)
at com.intellij.debugger.engine.DebugProcessEvents$2.a(DebugProcessEvents.java:546)
at java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1353)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.allMatch(ReferencePipeline.java:454)
at com.intellij.debugger.engine.DebugProcessEvents$2.contextAction(DebugProcessEvents.java:544)
at com.intellij.debugger.engine.events.SuspendContextCommandImpl.action(SuspendContextCommandImpl.java:57)
at com.intellij.debugger.engine.events.DebuggerCommandImpl.run(DebuggerCommandImpl.java:33)
at com.intellij.debugger.engine.DebuggerManagerThreadImpl.processEvent(DebuggerManagerThreadImpl.java:133)
at com.intellij.debugger.engine.DebuggerManagerThreadImpl.processEvent(DebuggerManagerThreadImpl.java:29)
at com.intellij.debugger.impl.InvokeThread.a(InvokeThread.java:138)
at com.intellij.debugger.impl.InvokeThread.access$100(InvokeThread.java:19)
at com.intellij.debugger.impl.InvokeThread$WorkerThreadRequest.a(InvokeThread.java:49)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:229)
at com.intellij.debugger.impl.InvokeThread$WorkerThreadRequest.run(InvokeThread.java:48)
at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:310)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
这可能是idea工具的问题,怎么解决?
程序如下图
结果如下图:
快捷键
F9 resume programe 恢复程序
Alt+F10 show execution point 显示执行断点
F8 Step Over 相当于eclipse的f6 跳到下一步
F7 Step Into 相当于eclipse的f5就是 进入到代码
Alt+shift+F7 Force Step Into 这个是强制进入代码
Shift+F8 Step Out 相当于Eclipse中,f8跳到下一个断点/f7跳出函数
Atl+F9 Run To Cursor 运行到光标处
ctrl+shift+F9 Debug运行java类
ctrl+shift+F10 正常运行java类
alt+F8
解决办法
如果我们不在高阶函数里添加断点的话(上面的it.add(“111”)代码)就不会出这个错误。
方法一:代码块里没有断点
代码块里没有断点的情况下F7+F8结合使用的方式。
我们不在高阶函数的代码块里添加断点,使用F7进入代码块,在代码块里用F8调试。
方法二:代码块里有断点
代码块里有断点的情况下F9的方式。
如果我们使用断点的情况下,在代码块影响的区域都不能使用F8单步调试,而应该使用F9或alt+F9,让它正常运行执行直到下一个断点。
使用这种方式那断点加的就比较多。
总结
我把同样的程序换到eclipse里执行是可以单步执行的,但Idea里不行,多半的工具的问题,可惜的是eclipse对Kotlin直接的不好,没代码提示。
建议使用F7+F8结合使用的方式调试比较好,因为断点相对的比较少。同时可以在高阶函数的代码块影响不到的区域添加断点,使用F9执行到下一个断点处。上述2种方法结合使用效果会更好。
代码块影响区域
整个区域都是,建议只在var cc…处添加断点。