From 6187d13f149b42faae0729716e76a46ac3f72cda Mon Sep 17 00:00:00 2001 From: Ian Zerny Date: Fri, 4 Feb 2022 11:49:20 +0100 Subject: [PATCH] Only include debug info within the instruction range of a method. --- .../dexbacked/CDexBackedMethodImplementation.java | 2 +- .../dexbacked/DexBackedMethodImplementation.java | 2 +- .../org/jf/dexlib2/dexbacked/util/DebugInfo.java | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java index 62d529eb..043bc183 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java @@ -75,7 +75,7 @@ public class CDexBackedMethodImplementation extends DexBackedMethodImplementatio } @Override - protected int getInstructionsSize() { + public int getInstructionsSize() { int instructionsSize = dexFile.getDataBuffer().readUshort( codeOffset + CDEX_INSTRUCTIONS_SIZE_AND_PREHEADER_FLAGS_OFFSET) >> CDEX_INSTRUCTIONS_SIZE_SHIFT; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java index 3fabe103..7d2fa80c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java @@ -66,7 +66,7 @@ public class DexBackedMethodImplementation implements MethodImplementation { return dexFile.getDataBuffer().readUshort(codeOffset); } - protected int getInstructionsSize() { + public int getInstructionsSize() { return dexFile.getDataBuffer().readSmallUint(codeOffset + CodeItem.INSTRUCTION_COUNT_OFFSET); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java index cb59f68d..4781d6ad 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java @@ -32,6 +32,7 @@ package org.jf.dexlib2.dexbacked.util; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterators; import org.jf.dexlib2.AccessFlags; import org.jf.dexlib2.DebugItemType; import org.jf.dexlib2.dexbacked.DexBackedDexFile; @@ -117,6 +118,10 @@ public abstract class DebugInfo implements Iterable { DexReader reader = dexFile.getDataBuffer().readerAt(debugInfoOffset); final int lineNumberStart = reader.readBigUleb128(); int registerCount = methodImpl.getRegisterCount(); + // Debug information can have events for addresses past the instructions. + // They have no relevance for the method in question and are excluded from the iterator. + final int lastInstructionAddress = methodImpl.getInstructionsSize() + - Iterators.getLast(methodImpl.getInstructions().iterator()).getCodeUnits(); //TODO: does dalvik allow references to invalid registers? final LocalInfo[] locals = new LocalInfo[registerCount]; @@ -172,7 +177,7 @@ public abstract class DebugInfo implements Iterable { @Nullable protected DebugItem readNextItem(@Nonnull DexReader reader) { - while (true) { + while (codeAddress <= lastInstructionAddress) { int next = reader.readUbyte(); switch (next) { case DebugItemType.END_SEQUENCE: { @@ -270,10 +275,13 @@ public abstract class DebugInfo implements Iterable { int adjusted = next - 0x0A; codeAddress += adjusted / 15; lineNumber += (adjusted % 15) - 4; - return new ImmutableLineNumber(codeAddress, lineNumber); + return codeAddress <= lastInstructionAddress + ? new ImmutableLineNumber(codeAddress, lineNumber) + : endOfData(); } } } + return endOfData(); } }; }