diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index 8f2e9ce..b6ec466 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -244,8 +244,11 @@
     return inspect(t -> Assert.assertTrue(t.getLocalNames().isEmpty()));
   }
 
-  protected final JUnit3Wrapper.Command checkLine(int line) {
-    return inspect(t -> t.checkLine(line));
+  protected final JUnit3Wrapper.Command checkLine(String sourceFile, int line) {
+    return inspect(t -> {
+      Assert.assertEquals(sourceFile, t.getCurrentSourceFile());
+      Assert.assertEquals(line, t.getCurrentLineNumber());
+    });
   }
 
   protected final JUnit3Wrapper.Command checkMethod(String className, String methodName) {
@@ -477,11 +480,48 @@
         Assert.assertEquals(expectedValue, localValue);
       }
 
-      public void checkLine(int line) {
-        Location location = getLocation();
-        int currentLine = getMirror()
-            .getLineNumber(location.classID, location.methodID, location.index);
-        Assert.assertEquals(line, currentLine);
+      public int getCurrentLineNumber() {
+        ReplyPacket reply = getMirror().getLineTable(location.classID, location.methodID);
+        if (reply.getErrorCode() != 0) {
+          return -1;
+        }
+
+        long startCodeIndex = reply.getNextValueAsLong();
+        long endCodeIndex = reply.getNextValueAsLong();
+        int lines = reply.getNextValueAsInt();
+        int line = -1;
+        long previousLineCodeIndex = -1;
+        for (int i = 0; i < lines; ++i) {
+          long currentLineCodeIndex = reply.getNextValueAsLong();
+          int currentLineNumber = reply.getNextValueAsInt();
+
+          // Code indices are in ascending order.
+          assert currentLineCodeIndex >= startCodeIndex;
+          assert currentLineCodeIndex <= endCodeIndex;
+          assert currentLineCodeIndex > previousLineCodeIndex;
+          previousLineCodeIndex = currentLineCodeIndex;
+
+          if (location.index >= currentLineCodeIndex) {
+            line = currentLineNumber;
+          } else {
+            break;
+          }
+        }
+
+        return line;
+      }
+
+      public String getCurrentSourceFile() {
+        CommandPacket sourceFileCommand = new CommandPacket(
+            JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
+            JDWPCommands.ReferenceTypeCommandSet.SourceFileCommand);
+        sourceFileCommand.setNextValueAsReferenceTypeID(location.classID);
+        ReplyPacket replyPacket = getMirror().performCommand(sourceFileCommand);
+        if (replyPacket.getErrorCode() != 0) {
+          return null;
+        } else {
+          return replyPacket.getNextValueAsString();
+        }
       }
 
       public List<String> getLocalNames() {
diff --git a/src/test/java/com/android/tools/r8/debug/DefaultMethodTest.java b/src/test/java/com/android/tools/r8/debug/DefaultMethodTest.java
index ea116a7..e0eb5ea 100644
--- a/src/test/java/com/android/tools/r8/debug/DefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/DefaultMethodTest.java
@@ -11,6 +11,8 @@
 
 public class DefaultMethodTest extends DebugTestBase {
 
+  private static final String SOURCE_FILE = "DebugDefaultMethod.java";
+
   @Test
   public void testDefaultMethod() throws Throwable {
     String debuggeeClass = "DebugDefaultMethod";
@@ -21,7 +23,7 @@
     commands.add(breakpoint(debuggeeClass, "testDefaultMethod"));
     commands.add(run());
     commands.add(checkMethod(debuggeeClass, "testDefaultMethod"));
-    commands.add(checkLine(27));
+    commands.add(checkLine(SOURCE_FILE, 27));
     if (!supportsDefaultMethod()) {
       // We desugared default method. This means we're going to step through an extra (forward)
       // method first.
@@ -50,7 +52,7 @@
     commands.add(run());
     commands.add(run() /* resume after 1st breakpoint */);
     commands.add(checkMethod(debuggeeClass, "testDefaultMethod"));
-    commands.add(checkLine(27));
+    commands.add(checkLine(SOURCE_FILE, 27));
     commands.add(stepInto());
     commands.add(checkMethod("DebugDefaultMethod$OverrideImpl", "doSomething"));
     commands.add(checkLocal(parameterName));
@@ -61,5 +63,4 @@
 
     runDebugTestJava8(debuggeeClass, commands);
   }
-
 }
diff --git a/src/test/java/com/android/tools/r8/debug/ExceptionTest.java b/src/test/java/com/android/tools/r8/debug/ExceptionTest.java
index 5f15f8f..3d4202b 100644
--- a/src/test/java/com/android/tools/r8/debug/ExceptionTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ExceptionTest.java
@@ -10,6 +10,8 @@
  */
 public class ExceptionTest extends DebugTestBase {
 
+  public static final String SOURCE_FILE = "Exceptions.java";
+
   @Test
   public void testStepOnCatch() throws Throwable {
     int catchLine;
@@ -24,9 +26,9 @@
     runDebugTest("Exceptions",
         breakpoint("Exceptions", "catchException"),
         run(),
-        checkLine(9), // line of the method call throwing the exception
+        checkLine(SOURCE_FILE, 9), // line of the method call throwing the exception
         stepOver(),
-        checkLine(catchLine), // line of the catch declaration
+        checkLine(SOURCE_FILE, catchLine), // line of the catch declaration
         run());
   }
 
diff --git a/src/test/java/com/android/tools/r8/debug/LambdaTest.java b/src/test/java/com/android/tools/r8/debug/LambdaTest.java
index 467ae09..52d9c70 100644
--- a/src/test/java/com/android/tools/r8/debug/LambdaTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LambdaTest.java
@@ -8,6 +8,8 @@
 
 public class LambdaTest extends DebugTestBase {
 
+  public static final String SOURCE_FILE = "DebugLambda.java";
+
   @Test
   public void testLambdaDebugging() throws Throwable {
     String debuggeeClass = "DebugLambda";
@@ -17,9 +19,9 @@
         breakpoint(debuggeeClass, initialMethodName),
         run(),
         checkMethod(debuggeeClass, initialMethodName),
-        checkLine(12),
+        checkLine(SOURCE_FILE, 12),
         stepInto(INTELLIJ_FILTER),
-        checkLine(16),
+        checkLine(SOURCE_FILE, 16),
         run());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsTest.java b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
index 0d72ab9..6132ace 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.debug;
 
-import com.android.tools.r8.debug.DebugTestBase;
 import org.apache.harmony.jpda.tests.framework.jdwp.Value;
 import org.junit.Test;
 
@@ -12,6 +11,8 @@
  */
 public class LocalsTest extends DebugTestBase {
 
+  public static final String SOURCE_FILE = "Locals.java";
+
   @Test
   public void testNoLocal() throws Throwable {
     final String className = "Locals";
@@ -20,11 +21,11 @@
         breakpoint(className, methodName),
         run(),
         checkMethod(className, methodName),
-        checkLine(8),
+        checkLine(SOURCE_FILE, 8),
         checkNoLocal(),
         stepOver(),
         checkMethod(className, methodName),
-        checkLine(9),
+        checkLine(SOURCE_FILE, 9),
         checkNoLocal(),
         run());
   }
@@ -37,10 +38,10 @@
         breakpoint(className, methodName),
         run(),
         checkMethod(className, methodName),
-        checkLine(12),
+        checkLine(SOURCE_FILE, 12),
         checkNoLocal(),
         stepOver(),
-        checkLine(13),
+        checkLine(SOURCE_FILE, 13),
         checkLocal("i", Value.createInt(Integer.MAX_VALUE)),
         run());
   }
@@ -57,14 +58,14 @@
         breakpoint(className, methodName),
         run(),
         checkMethod(className, methodName),
-        checkLine(17),
+        checkLine(SOURCE_FILE, 17),
         checkLocal("p", pValue),
         stepOver(),
-        checkLine(18),
+        checkLine(SOURCE_FILE, 18),
         checkLocal("p", pValue),
         checkLocal("c", cValue),
         stepOver(),
-        checkLine(19),
+        checkLine(SOURCE_FILE, 19),
         checkLocal("p", pValue),
         checkLocal("c", cValue),
         checkLocal("v", vValue),
@@ -84,16 +85,16 @@
         breakpoint(className, methodName),
         run(),
         checkMethod(className, methodName),
-        checkLine(17),
+        checkLine(SOURCE_FILE, 17),
         checkLocal("p", pValue),
         stepOver(),
-        checkLine(18),
+        checkLine(SOURCE_FILE, 18),
         checkLocal("p", pValue),
         checkLocal("c", cValue),
         setLocal("c", newValue),
         checkLocal("c", newValue),  // we should see the updated value
         stepOver(),
-        checkLine(19),
+        checkLine(SOURCE_FILE, 19),
         checkLocal("p", pValue),
         checkLocal("c", newValue),
         checkLocal("v", vValue),
@@ -109,15 +110,15 @@
         breakpoint(className, methodName),
         run(),
         checkMethod(className, methodName),
-        checkLine(23),
+        checkLine(SOURCE_FILE, 23),
         checkNoLocal(),
         stepOver(),
         checkMethod(className, methodName),
-        checkLine(24),
+        checkLine(SOURCE_FILE, 24),
         checkLocal("i", Value.createInt(0)),
         setLocal("i", newValueForI),
         stepOver(),
-        checkLine(25),
+        checkLine(SOURCE_FILE, 25),
         checkLocal("i", newValueForI),
         checkLocal("f", Value.createFloat(0)),
         run());
@@ -133,15 +134,15 @@
         breakpoint(className, methodName),
         run(),
         checkMethod(className, methodName),
-        checkLine(29),
+        checkLine(SOURCE_FILE, 29),
         checkNoLocal(),
         stepOver(),
         checkMethod(className, methodName),
-        checkLine(30),
+        checkLine(SOURCE_FILE, 30),
         checkLocal("i", oldValueForI),
         setLocal("i", newValueForI),
         stepOver(),
-        checkLine(33),
+        checkLine(SOURCE_FILE, 33),
         checkLocal("i", newValueForI),
         run());
   }
diff --git a/src/test/java/com/android/tools/r8/debug/MultipleReturnsTest.java b/src/test/java/com/android/tools/r8/debug/MultipleReturnsTest.java
index 0b7973e..1d708cf 100644
--- a/src/test/java/com/android/tools/r8/debug/MultipleReturnsTest.java
+++ b/src/test/java/com/android/tools/r8/debug/MultipleReturnsTest.java
@@ -10,16 +10,18 @@
  */
 public class MultipleReturnsTest extends DebugTestBase {
 
+  public static final String SOURCE_FILE = "MultipleReturns.java";
+
   @Test
   public void testMultipleReturns() throws Throwable {
     runDebugTest("MultipleReturns",
         breakpoint("MultipleReturns", "multipleReturns"),
         run(),
         stepOver(),
-        checkLine(16), // this should be the 1st return statement
+        checkLine(SOURCE_FILE, 16), // this should be the 1st return statement
         run(),
         stepOver(),
-        checkLine(18), // this should be the 2nd return statement
+        checkLine(SOURCE_FILE, 18), // this should be the 2nd return statement
         run());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java b/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java
index a5b7d4e..8184c0c 100644
--- a/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java
@@ -11,18 +11,20 @@
 
 public class SyntheticMethodTest extends DebugTestBase {
 
+  public static final String SOURCE_FILE = "InnerAccessors.java";
+
   private void debugInnerAccessors(StepFilter stepFilter) throws Throwable {
     String debuggeeClass = "InnerAccessors";
     List<Command> commands = new ArrayList<>();
     commands.add(breakpoint("InnerAccessors$Inner", "callPrivateMethodInOuterClass"));
     commands.add(run());
-    commands.add(checkLine(13));
+    commands.add(checkLine(SOURCE_FILE, 13));
     commands.add(stepInto(stepFilter));  // skip synthetic accessor
     if (stepFilter == NO_FILTER) {
       commands.add(stepInto(stepFilter));
     }
     commands.add(checkMethod(debuggeeClass, "privateMethod"));
-    commands.add(checkLine(8));
+    commands.add(checkLine(SOURCE_FILE, 8));
     commands.add(run());
     runDebugTest(debuggeeClass, commands);
   }
