diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 96e1e99..7b24770 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -650,6 +650,9 @@
 
     assert internal.enableVerticalClassMerging || !proguardConfiguration.isOptimizing();
     if (internal.debug) {
+      internal.proguardConfiguration.getKeepAttributes().lineNumberTable = true;
+      internal.proguardConfiguration.getKeepAttributes().localVariableTable = true;
+      internal.proguardConfiguration.getKeepAttributes().localVariableTypeTable = true;
       // TODO(zerny): Should we support inlining in debug mode? b/62937285
       internal.enableInlining = false;
       internal.enableClassInlining = false;
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
index 275d2e9..b518683 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
@@ -18,10 +17,11 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.forceproguardcompatibility.keepattributes.TestKeepAttributes;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
-import java.nio.file.Path;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
@@ -32,12 +32,24 @@
   public static final Class CLASS = TestKeepAttributes.class;
 
   @Test
+  public void keepAllAttributesInDebugMode()
+      throws ExecutionException, CompilationFailedException, IOException {
+    List<String> keepRules = ImmutableList.of(
+        "-keep class ** { *; }"
+    );
+    CodeInspector inspector = compile(keepRules, CompilationMode.DEBUG);
+    DebugInfoInspector debugInfo = debugInfoForMain(inspector);
+    checkLineNumbers(true, debugInfo);
+    checkLocals(true, debugInfo);
+  }
+
+  @Test
   public void discardAllAttributes()
       throws CompilationFailedException, IOException, ExecutionException {
     List<String> keepRules = ImmutableList.of(
         "-keep class ** { *; }"
     );
-    CodeInspector inspector = compile(keepRules);
+    CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
     DebugInfoInspector debugInfo = debugInfoForMain(inspector);
     checkLineNumbers(false, debugInfo);
     checkLocals(false, debugInfo);
@@ -50,7 +62,7 @@
         "-keep class ** { *; }",
         "-keepattributes " + ProguardKeepAttributes.LINE_NUMBER_TABLE
     );
-    CodeInspector inspector = compile(keepRules);
+    CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
     DebugInfoInspector debugInfo = debugInfoForMain(inspector);
     checkLineNumbers(true, debugInfo);
     checkLocals(false, debugInfo);
@@ -66,10 +78,11 @@
             + ", "
             + ProguardKeepAttributes.LOCAL_VARIABLE_TABLE
     );
-    CodeInspector inspector = compile(keepRules);
+    CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
     DebugInfoInspector debugInfo = debugInfoForMain(inspector);
     checkLineNumbers(true, debugInfo);
-    checkLocals(true, debugInfo);
+    // Locals are never included in release builds.
+    checkLocals(false, debugInfo);
   }
 
   @Test
@@ -80,7 +93,7 @@
     );
     // Compiling with a keep rule for locals but no line results in an error in R8.
     try {
-      compile(keepRules);
+      compile(keepRules, CompilationMode.RELEASE);
     } catch (CompilationFailedException e) {
       assertTrue(e.getCause().getMessage().contains(ProguardKeepAttributes.LOCAL_VARIABLE_TABLE));
       assertTrue(e.getCause().getMessage().contains(ProguardKeepAttributes.LINE_NUMBER_TABLE));
@@ -89,24 +102,29 @@
     fail("Expected error");
   }
 
-  private CodeInspector compile(List<String> keepRules)
+  private CodeInspector compile(List<String> keepRules, CompilationMode mode)
       throws CompilationFailedException, IOException, ExecutionException {
-    Path dexOut = temp.getRoot().toPath().resolve("dex.zip");
-    R8.run(R8Command.builder()
-        .setMode(CompilationMode.DEBUG)
-        .addProgramFiles(ToolHelper.getClassFileForTestClass(CLASS))
-        .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
-        .addProguardConfiguration(keepRules, Origin.unknown())
-        .setProgramConsumer(new DexIndexedConsumer.ArchiveConsumer(dexOut))
-        .build());
-    ToolHelper.runArtRaw(dexOut.toString(), CLASS.getCanonicalName());
-    return new CodeInspector(dexOut);
+    AndroidAppConsumers sink = new AndroidAppConsumers();
+    R8.run(
+        R8Command.builder()
+            .setMode(mode)
+            .addProgramFiles(
+                ToolHelper.getClassFilesForTestDirectory(
+                    ToolHelper.getClassFileForTestClass(CLASS).getParent()))
+            .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+            .addProguardConfiguration(keepRules, Origin.unknown())
+            .setProgramConsumer(sink.wrapProgramConsumer(emptyConsumer(Backend.DEX)))
+            .build());
+    AndroidApp app = sink.build();
+    CodeInspector codeInspector = new CodeInspector(app);
+    runOnArt(app, CLASS.getTypeName());
+    return codeInspector;
   }
 
   private DebugInfoInspector debugInfoForMain(CodeInspector inspector) {
     return new DebugInfoInspector(
         inspector,
-        CLASS.getCanonicalName(),
+        CLASS.getTypeName(),
         new MethodSignature("main", "void", Collections.singleton("java.lang.String[]")));
   }
 
