diff --git a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
index 4a19677..6b561d8 100644
--- a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
+++ b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
@@ -26,6 +26,7 @@
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.android.tools.r8.utils.ThreadUtils;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -140,7 +141,10 @@
     // We are using the proguard configuration for adapting resources.
     InternalOptions options =
         new InternalOptions(
-            ProguardConfiguration.builder(factory, getReporter()).build(), getReporter());
+            ProguardConfiguration.builder(factory, getReporter())
+                .addKeepAttributePatterns(ImmutableList.of("*"))
+                .build(),
+            getReporter());
     assert options.threadCount == ThreadUtils.NOT_SPECIFIED;
     options.relocatorCompilation = true;
     options.threadCount = getThreadCount();
diff --git a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
index 5e66581..7d9dadb 100644
--- a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
+++ b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
@@ -27,6 +27,9 @@
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
 import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.LocalVariableTable;
+import com.android.tools.r8.utils.codeinspector.LocalVariableTable.LocalVariableTableEntry;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -65,8 +68,7 @@
   }
 
   @Test
-  public void testRelocatorEmptyToSomething()
-      throws IOException, CompilationFailedException, ExecutionException {
+  public void testRelocatorEmptyToSomething() throws IOException, CompilationFailedException {
     String originalPrefix = "";
     String newPrefix = "foo.bar.baz";
     Path output = temp.newFile("output.jar").toPath();
@@ -82,8 +84,7 @@
   }
 
   @Test
-  public void testRelocatorSomethingToEmpty()
-      throws IOException, CompilationFailedException, ExecutionException {
+  public void testRelocatorSomethingToEmpty() throws IOException {
     String originalPrefix = "com.android.tools.r8";
     String newPrefix = "";
     Path output = temp.newFile("output.jar").toPath();
@@ -99,6 +100,50 @@
   }
 
   @Test
+  public void testRelocateKeepsDebugInfo()
+      throws IOException, CompilationFailedException, ExecutionException {
+    String originalPrefix = "com.android.tools.r8";
+    String newPrefix = "com.android.tools.r8";
+    Path output = temp.newFile("output.jar").toPath();
+    Map<String, String> mapping = new HashMap<>();
+    mapping.put(originalPrefix, newPrefix);
+    runRelocator(ToolHelper.R8_JAR, mapping, output);
+    // Assert that all classes are the same, have the same methods and debug info:
+    CodeInspector originalInspector = new CodeInspector(ToolHelper.R8_JAR);
+    CodeInspector relocatedInspector = new CodeInspector(output);
+    for (FoundClassSubject clazz : originalInspector.allClasses()) {
+      ClassSubject relocatedClass = relocatedInspector.clazz(clazz.getFinalName());
+      assertThat(relocatedClass, isPresent());
+      assertEquals(clazz.getDexClass().sourceFile, relocatedClass.getDexClass().sourceFile);
+      for (FoundMethodSubject originalMethod : clazz.allMethods()) {
+        MethodSubject relocatedMethod = relocatedClass.method(originalMethod.asMethodReference());
+        assertThat(relocatedMethod, isPresent());
+        assertEquals(originalMethod.hasLineNumberTable(), relocatedMethod.hasLineNumberTable());
+        if (originalMethod.hasLineNumberTable()) {
+          // TODO(b/155303677): Figure out why we cannot assert the same lines.
+          // assertEquals(
+          //     originalMethod.getLineNumberTable().getLines().size(),
+          //     relocatedMethod.getLineNumberTable().getLines().size());
+        }
+        assertEquals(
+            originalMethod.hasLocalVariableTable(), relocatedMethod.hasLocalVariableTable());
+        if (originalMethod.hasLocalVariableTable()) {
+          LocalVariableTable originalVariableTable = originalMethod.getLocalVariableTable();
+          LocalVariableTable relocatedVariableTable = relocatedMethod.getLocalVariableTable();
+          assertEquals(originalVariableTable.size(), relocatedVariableTable.size());
+          for (int i = 0; i < originalVariableTable.getEntries().size(); i++) {
+            LocalVariableTableEntry originalEntry = originalVariableTable.get(i);
+            LocalVariableTableEntry relocatedEntry = relocatedVariableTable.get(i);
+            assertEquals(originalEntry.name, relocatedEntry.name);
+            assertEquals(originalEntry.signature, relocatedEntry.signature);
+            assertEquals(originalEntry.type.toString(), relocatedEntry.type.toString());
+          }
+        }
+      }
+    }
+  }
+
+  @Test
   public void testRelocateAll() throws IOException, CompilationFailedException, ExecutionException {
     String originalPrefix = "com.android.tools.r8";
     String newPrefix = "foo.bar.baz";
@@ -181,7 +226,7 @@
 
   @Test
   public void testPartialPrefix()
-      throws IOException, CompilationFailedException, ExecutionException {
+      throws CompilationFailedException, IOException, ExecutionException {
     String originalPrefix = "com.android.tools.r";
     String newPrefix = "i_cannot_w";
     Map<String, String> mapping = new LinkedHashMap<>();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index fe574e4..782bbf0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -229,6 +229,9 @@
   @Override
   public boolean hasLocalVariableTable() {
     Code code = getMethod().getCode();
+    if (code == null) {
+      return false;
+    }
     if (code.isDexCode()) {
       DexCode dexCode = code.asDexCode();
       if (dexCode.getDebugInfo() != null) {
@@ -254,6 +257,9 @@
   @Override
   public LineNumberTable getLineNumberTable() {
     Code code = getMethod().getCode();
+    if (code == null) {
+      return null;
+    }
     if (code.isDexCode()) {
       return getDexLineNumberTable(code.asDexCode());
     }
