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工具的问题,怎么解决?

程序如下图

idea闪退 A fatal error has been detected by the Java Runtime Environment_高阶函数


结果如下图:

idea闪退 A fatal error has been detected by the Java Runtime Environment_代码块_02

快捷键

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种方法结合使用效果会更好。

代码块影响区域

idea闪退 A fatal error has been detected by the Java Runtime Environment_代码块_03

整个区域都是,建议只在var cc…处添加断点。