Do an ordinal step over while stepping over inlined calls in dex

(cherry picked from commit d741895)
This commit is contained in:
Nikolay Krasko
2016-10-12 01:08:01 +03:00
committed by Nikolay Krasko
parent b6460e6280
commit 06b72e608e
16 changed files with 276 additions and 0 deletions
@@ -35,6 +35,7 @@ import com.sun.jdi.request.EventRequestManager;
import com.sun.jdi.request.StepRequest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.debugger.NoStrataPositionManagerHelperKt;
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
import org.jetbrains.kotlin.psi.KtNamedFunction;
@@ -50,9 +51,17 @@ public class DebuggerSteppingHelper {
final KotlinSteppingCommandProvider.KotlinSourcePosition kotlinSourcePosition
) {
final DebugProcessImpl debugProcess = suspendContext.getDebugProcess();
return debugProcess.new ResumeCommand(suspendContext) {
@Override
public void contextAction() {
// In DEX there's no strata for trying to understand what lines were inlined and no local variables attributes are
// preserved that can be used for fine tuning. So do an ordinal 'step over' instead.
if (NoStrataPositionManagerHelperKt.isDexDebug(suspendContext.getDebugProcess())) {
debugProcess.createStepOverCommand(suspendContext, true).contextAction();
return;
}
try {
StackFrameProxyImpl frameProxy = suspendContext.getFrameProxy();
if (frameProxy != null) {
@@ -0,0 +1,10 @@
LineBreakpoint created at inlineInIfFalseDex.kt:6
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineInIfFalseDex.InlineInIfFalseDexKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
inlineInIfFalseDex.kt:6
inlineInIfFalseDex.kt:15
inlineInIfFalseDex.kt:9
inlineInIfFalseDex.kt:10
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,10 @@
LineBreakpoint created at inlineInIfTrueDex.kt:6
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineInIfTrueDex.InlineInIfTrueDexKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
inlineInIfTrueDex.kt:6
inlineInIfTrueDex.kt:14
inlineInIfTrueDex.kt:7
inlineInIfTrueDex.kt:9
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,14 @@
LineBreakpoint created at soInlineAnonymousFunctionArgumentDex.kt:5
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineAnonymousFunctionArgumentDex.SoInlineAnonymousFunctionArgumentDexKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
soInlineAnonymousFunctionArgumentDex.kt:5
soInlineAnonymousFunctionArgumentDex.kt:7
soInlineAnonymousFunctionArgumentDex.kt:15
soInlineAnonymousFunctionArgumentDex.kt:8
soInlineAnonymousFunctionArgumentDex.kt:16
soInlineAnonymousFunctionArgumentDex.kt:15
soInlineAnonymousFunctionArgumentDex.kt:11
soInlineAnonymousFunctionArgumentDex.kt:16
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,12 @@
LineBreakpoint created at soInlineCallInLastStatementInInlineDex.kt:10
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineDex.SoInlineCallInLastStatementInInlineDexKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
soInlineCallInLastStatementInInlineDex.kt:10
soInlineCallInLastStatementInInlineDex.kt:11
soInlineCallInLastStatementInInlineDex.kt:15
soInlineCallInLastStatementInInlineDex.kt:11
soInlineCallInLastStatementInInlineDex.kt:16
soInlineCallInLastStatementInInlineDex.kt:6
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,9 @@
LineBreakpoint created at soInlineCallInLastStatementInInlineFunctionArgument.kt:7
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineFunctionArgument.SoInlineCallInLastStatementInInlineFunctionArgumentKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
soInlineCallInLastStatementInInlineFunctionArgument.kt:7
soInlineCallInLastStatementInInlineFunctionArgument.kt:8
soInlineCallInLastStatementInInlineFunctionArgument.kt:9
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,10 @@
LineBreakpoint created at soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineCallInLastStatementInInlineFunctionArgumentDex.SoInlineCallInLastStatementInInlineFunctionArgumentDexKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:7
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:17
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:18
soInlineCallInLastStatementInInlineFunctionArgumentDex.kt:14
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,18 @@
LineBreakpoint created at soInlineWhileConditionDex.kt:5
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! soInlineWhileConditionDex.SoInlineWhileConditionDexKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
soInlineWhileConditionDex.kt:5
soInlineWhileConditionDex.kt:7
soInlineWhileConditionDex.kt:18
soInlineWhileConditionDex.kt:7
soInlineWhileConditionDex.kt:8
soInlineWhileConditionDex.kt:7
soInlineWhileConditionDex.kt:18
soInlineWhileConditionDex.kt:7
soInlineWhileConditionDex.kt:12
soInlineWhileConditionDex.kt:18
soInlineWhileConditionDex.kt:12
soInlineWhileConditionDex.kt:15
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
@@ -0,0 +1,18 @@
package inlineInIfFalseDex
fun main(args: Array<String>) {
val bar = ""
//Breakpoint!
if (inlineCall { true }) {
foo()
}
foo()
}
fun foo() {}
inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
return false
}
// STEP_OVER: 8
@@ -0,0 +1,17 @@
package inlineInIfTrueDex
fun main(args: Array<String>) {
val bar = ""
//Breakpoint!
if (inlineCall { true }) {
foo()
}
}
fun foo() {}
inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
return true
}
// STEP_OVER: 6
@@ -0,0 +1,20 @@
package soInlineAnonymousFunctionArgumentDex
fun main(args: Array<String>) {
//Breakpoint!
val b = 1
foo(
fun (){ test(1) }
)
foo(fun (){ test(1) })
}
inline fun foo(f: () -> Unit) {
f()
}
fun test(i: Int) = 1
// STEP_OVER: 10
@@ -0,0 +1,20 @@
package soInlineCallInLastStatementInInlineDex
fun main(args: Array<String>) {
bar()
nop()
}
inline fun bar() {
//Breakpoint!
nop()
foo { 42 }
}
inline fun foo(f: () -> Unit) {
f()
}
fun nop() {}
// STEP_OVER: 8
@@ -0,0 +1,22 @@
package soInlineCallInLastStatementInInlineFunctionArgument
fun main(args: Array<String>) {
bar {
nop()
//Breakpoint!
foo()
}
}
inline fun bar(f: () -> Unit) {
nop()
f()
}
inline fun foo() {
nop()
}
fun nop() {}
// STEP_OVER: 3
@@ -0,0 +1,22 @@
package soInlineCallInLastStatementInInlineFunctionArgumentDex
fun main(args: Array<String>) {
bar {
nop()
//Breakpoint!
foo()
}
}
inline fun bar(f: () -> Unit) {
nop()
f()
}
inline fun foo() {
nop()
}
fun nop() {}
// STEP_OVER: 5
@@ -0,0 +1,23 @@
package soInlineWhileConditionDex
fun main(args: Array<String>) {
//Breakpoint!
var i = 1
// inline in while condition (true)
while (id { i < 2 }) {
i++
}
// inline in while condition (false)
while (id { false }) {
bar()
}
}
inline fun id(f: () -> Boolean): Boolean {
return f()
}
fun bar() {}
// STEP_OVER: 12
@@ -421,12 +421,24 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
doStepOverTest(fileName);
}
@TestMetadata("inlineInIfFalseDex.kt")
public void testInlineInIfFalseDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfFalseDex.kt");
doStepOverTest(fileName);
}
@TestMetadata("inlineInIfTrue.kt")
public void testInlineInIfTrue() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrue.kt");
doStepOverTest(fileName);
}
@TestMetadata("inlineInIfTrueDex.kt")
public void testInlineInIfTrueDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInIfTrueDex.kt");
doStepOverTest(fileName);
}
@TestMetadata("inlineInObjectDex.kt")
public void testInlineInObjectDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/inlineInObjectDex.kt");
@@ -451,12 +463,36 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
doStepOverTest(fileName);
}
@TestMetadata("soInlineAnonymousFunctionArgumentDex.kt")
public void testSoInlineAnonymousFunctionArgumentDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineAnonymousFunctionArgumentDex.kt");
doStepOverTest(fileName);
}
@TestMetadata("soInlineCallInLastStatementInInline.kt")
public void testSoInlineCallInLastStatementInInline() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInline.kt");
doStepOverTest(fileName);
}
@TestMetadata("soInlineCallInLastStatementInInlineDex.kt")
public void testSoInlineCallInLastStatementInInlineDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineDex.kt");
doStepOverTest(fileName);
}
@TestMetadata("soInlineCallInLastStatementInInlineFunctionArgument.kt")
public void testSoInlineCallInLastStatementInInlineFunctionArgument() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgument.kt");
doStepOverTest(fileName);
}
@TestMetadata("soInlineCallInLastStatementInInlineFunctionArgumentDex.kt")
public void testSoInlineCallInLastStatementInInlineFunctionArgumentDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineFunctionArgumentDex.kt");
doStepOverTest(fileName);
}
@TestMetadata("soInlineCallInLastStatementInInlineInInline.kt")
public void testSoInlineCallInLastStatementInInlineInInline() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineCallInLastStatementInInlineInInline.kt");
@@ -505,6 +541,12 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
doStepOverTest(fileName);
}
@TestMetadata("soInlineWhileConditionDex.kt")
public void testSoInlineWhileConditionDex() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soInlineWhileConditionDex.kt");
doStepOverTest(fileName);
}
@TestMetadata("soReifiedInlineIfConditionFalse.kt")
public void testSoReifiedInlineIfConditionFalse() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepOver/soReifiedInlineIfConditionFalse.kt");