diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParseVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParseVisitor.java index 6cd79c7ace550ae720b288bc2c640a62f7705183..3bc4368aefbeee584c4a683993e35b864681008c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParseVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParseVisitor.java @@ -17,7 +17,7 @@ import jadx.core.dex.visitors.JadxVisitor; import jadx.core.dex.visitors.blocksmaker.BlockSplitter; import jadx.core.dex.visitors.ssa.SSATransform; import jadx.core.utils.ErrorsCounter; -import jadx.core.utils.exceptions.DecodeException; +import jadx.core.utils.Utils; import jadx.core.utils.exceptions.JadxException; @JadxVisitor( @@ -40,11 +40,13 @@ public class DebugInfoParseVisitor extends AbstractVisitor { processDebugInfo(mth, debugOffset); } } catch (Exception e) { - LOG.error("Error to parse debug info: {}", ErrorsCounter.formatMsg(mth, e.getMessage()), e); + mth.addComment("JADX WARNING: Error to parse debug info: " + + ErrorsCounter.formatMsg(mth, e.getMessage()) + + '\n' + Utils.getStackTrace(e)); } } - private void processDebugInfo(MethodNode mth, int debugOffset) throws DecodeException { + private void processDebugInfo(MethodNode mth, int debugOffset) { InsnNode[] insnArr = mth.getInstructions(); DebugInfoParser debugInfoParser = new DebugInfoParser(mth, debugOffset, insnArr); List localVars = debugInfoParser.process(); @@ -107,8 +109,8 @@ public class DebugInfoParseVisitor extends AbstractVisitor { int line = insn.getSourceLine(); if (line != 0) { mth.setSourceLine(line - 1); + return; } - return; } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParser.java b/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParser.java index 6b2e8e7e9f0173c6ff6dab66a1e8eaf9fe9acb5e..e0f2252213f29fbd592c365d8926bccbc848ad90 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParser.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/debuginfo/DebugInfoParser.java @@ -10,7 +10,6 @@ import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.nodes.DexNode; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.nodes.MethodNode; -import jadx.core.utils.exceptions.DecodeException; public class DebugInfoParser { private static final int DBG_END_SEQUENCE = 0x00; @@ -50,7 +49,7 @@ public class DebugInfoParser { this.insnByOffset = insnByOffset; } - public List process() throws DecodeException { + public List process() { boolean varsInfoFound = false; resultList = new ArrayList<>(); @@ -142,15 +141,11 @@ public class DebugInfoParser { } default: { - if (c >= DBG_FIRST_SPECIAL) { - int adjustedOpCode = c - DBG_FIRST_SPECIAL; - int addrInc = adjustedOpCode / DBG_LINE_RANGE; - addr = addrChange(addr, addrInc, line); - line += DBG_LINE_BASE + adjustedOpCode % DBG_LINE_RANGE; - setLine(addr, line); - } else { - throw new DecodeException("Unknown debug insn code: " + c); - } + int adjustedOpCode = c - DBG_FIRST_SPECIAL; + int addrInc = adjustedOpCode / DBG_LINE_RANGE; + addr = addrChange(addr, addrInc, line); + line += DBG_LINE_BASE + adjustedOpCode % DBG_LINE_RANGE; + setLine(addr, line); break; } }