You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
347 lines
18 KiB
347 lines
18 KiB
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
|
<meta http-equiv="content-style-type" content="text/css">
|
|
<link rel="stylesheet" type="text/css" href="../style.css">
|
|
<title>ReTrace Examples</title>
|
|
</head>
|
|
<body>
|
|
|
|
<script type="text/javascript" language="JavaScript">
|
|
<!--
|
|
if (window.self==window.top)
|
|
document.write('<a class="largebutton" target="_top" href="../../index.html#manual/retrace/examples.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
|
|
//-->
|
|
</script>
|
|
<noscript>
|
|
<a class="largebutton" target="_top" href="../../index.html#manual/retrace/examples.html">ProGuard index</a>
|
|
<a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a>
|
|
<a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a>
|
|
<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
|
|
</noscript>
|
|
|
|
<h2>Examples</h2>
|
|
|
|
Some typical example uses:
|
|
<ol>
|
|
<li><a href="#with">Restoring a stack trace with line numbers</a></li>
|
|
<li><a href="#withverbose">Restoring a stack trace with line numbers
|
|
(verbose)</a></li>
|
|
<li><a href="#without">Restoring a stack trace without line numbers</a></li>
|
|
</ol>
|
|
|
|
<h3><a name="with">Restoring a stack trace with line numbers</a></h3>
|
|
|
|
Assume for instance ProGuard itself has been obfuscated using the following
|
|
extra options:
|
|
<pre>
|
|
-printmapping proguard.map
|
|
|
|
-renamesourcefileattribute ProGuard
|
|
-keepattributes SourceFile,LineNumberTable
|
|
</pre>
|
|
<p>
|
|
|
|
Now assume the processed application throws an exception, and we have saved the
|
|
stack trace in <code>proguard.trace</code>, shown below. Of course, in real
|
|
life ProGuard rarely throws exceptions, so this is a purposely generated
|
|
exception. :)
|
|
|
|
<pre>
|
|
Exception in thread "main" java.lang.Error: Random exception
|
|
at pro.bY.a(ProGuard:576)
|
|
at pro.bO.a(ProGuard:431)
|
|
at pro.bj.a(ProGuard:145)
|
|
at pro.bY.a(ProGuard:522)
|
|
at pro.bj.a(ProGuard:129)
|
|
at pro.bN.a(ProGuard:125)
|
|
at pro.bY.a(ProGuard:251)
|
|
at pro.bY.a(ProGuard:229)
|
|
at pro.l.a(ProGuard:55)
|
|
at pro.bo.b(ProGuard:405)
|
|
at pro.ci.a(ProGuard:51)
|
|
at pro.bo.a(ProGuard:356)
|
|
at pro.be.a(ProGuard:109)
|
|
at pro.bo.a(ProGuard:356)
|
|
at pro.be.a(ProGuard:186)
|
|
at pro.bg.a(ProGuard:369)
|
|
at pro.bY.a(ProGuard:286)
|
|
at pro.bh.a(ProGuard:55)
|
|
at pro.bg.b(ProGuard:408)
|
|
at pro.bY.a(ProGuard:190)
|
|
at pro.bg.a(ProGuard:369)
|
|
at pro.M.a(ProGuard:110)
|
|
at pro.bY.a(ProGuard:449)
|
|
at pro.M.a(ProGuard:99)
|
|
at pro.bo.a(ProGuard:372)
|
|
at pro.bY.a(ProGuard:649)
|
|
at pro.bY.a(ProGuard:112)
|
|
at pro.P.a(ProGuard:66)
|
|
at pro.p.a(ProGuard:83)
|
|
at pro.bU.a(ProGuard:69)
|
|
at pro.bo.a(ProGuard:356)
|
|
at pro.J.a(ProGuard:149)
|
|
at pro.I.a(ProGuard:49)
|
|
at pro.J.a(ProGuard:105)
|
|
at pro.cf.c(ProGuard:370)
|
|
at pro.cf.a(ProGuard:317)
|
|
at pro.bc.a(ProGuard:55)
|
|
at proguard.ProGuard.a(ProGuard:363)
|
|
at proguard.ProGuard.c(ProGuard:187)
|
|
at proguard.ProGuard.b(ProGuard:385)
|
|
at proguard.ProGuard.main(ProGuard:429)
|
|
</pre>
|
|
<p>
|
|
|
|
We can then use the following command to recover the stack trace:
|
|
<pre>
|
|
<b>java -jar retrace.jar proguard.map proguard.trace</b>
|
|
</pre>
|
|
<p>
|
|
|
|
The output will look as follows:
|
|
<pre>
|
|
Exception in thread "main" java.lang.Error: Random exception
|
|
at proguard.shrink.UsageMarker.visitInstruction(ProGuard:576)
|
|
at proguard.classfile.instruction.GenericInstruction.accept(ProGuard:431)
|
|
at proguard.classfile.CodeAttrInfo.instructionsAccept(ProGuard:145)
|
|
at proguard.shrink.UsageMarker.visitCodeAttrInfo(ProGuard:522)
|
|
at proguard.classfile.CodeAttrInfo.accept(ProGuard:129)
|
|
at proguard.classfile.ProgramMemberInfo.attributesAccept(ProGuard:125)
|
|
at proguard.shrink.UsageMarker.visitMemberInfo(ProGuard:251)
|
|
at proguard.shrink.UsageMarker.visitProgramMethodInfo(ProGuard:229)
|
|
at proguard.classfile.ProgramMethodInfo.accept(ProGuard:55)
|
|
at proguard.classfile.ProgramClassFile.methodAccept(ProGuard:405)
|
|
at proguard.classfile.visitor.NamedMethodVisitor.visitProgramClassFile(ProGuard:51)
|
|
at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
|
|
at proguard.classfile.visitor.ClassFileUpDownTraveler.visitProgramClassFile(ProGuard:109)
|
|
at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
|
|
at proguard.classfile.visitor.ClassFileUpDownTraveler.visitLibraryClassFile(ProGuard:186)
|
|
at proguard.classfile.LibraryClassFile.accept(ProGuard:369)
|
|
at proguard.shrink.UsageMarker.visitLibraryMethodInfo(ProGuard:286)
|
|
at proguard.classfile.LibraryMethodInfo.accept(ProGuard:55)
|
|
at proguard.classfile.LibraryClassFile.methodsAccept(ProGuard:408)
|
|
at proguard.shrink.UsageMarker.visitLibraryClassFile(ProGuard:190)
|
|
at proguard.classfile.LibraryClassFile.accept(ProGuard:369)
|
|
at proguard.classfile.ClassCpInfo.referencedClassAccept(ProGuard:110)
|
|
at proguard.shrink.UsageMarker.visitClassCpInfo(ProGuard:449)
|
|
at proguard.classfile.ClassCpInfo.accept(ProGuard:99)
|
|
at proguard.classfile.ProgramClassFile.constantPoolEntryAccept(ProGuard:372)
|
|
at proguard.shrink.UsageMarker.markCpEntry(ProGuard:649)
|
|
at proguard.shrink.UsageMarker.visitProgramClassFile(ProGuard:112)
|
|
at proguard.classfile.visitor.VariableClassFileVisitor.visitProgramClassFile(ProGuard:66)
|
|
at proguard.classfile.visitor.MultiClassFileVisitor.visitProgramClassFile(ProGuard:83)
|
|
at proguard.classfile.visitor.FilteredClassFileVisitor.visitProgramClassFile(ProGuard:69)
|
|
at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
|
|
at proguard.classfile.ClassPool.classFileAccept(ProGuard:149)
|
|
at proguard.classfile.visitor.NamedClassFileVisitor.visitClassPool(ProGuard:49)
|
|
at proguard.classfile.ClassPool.accept(ProGuard:105)
|
|
at proguard.KeepCommand.executeShrinkingPhase(ProGuard:370)
|
|
at proguard.KeepCommand.execute(ProGuard:317)
|
|
at proguard.CompoundCommand.execute(ProGuard:55)
|
|
at proguard.ProGuard.executeCommands(ProGuard:363)
|
|
at proguard.ProGuard.shrink(ProGuard:187)
|
|
at proguard.ProGuard.execute(ProGuard:385)
|
|
at proguard.ProGuard.main(ProGuard:429)
|
|
</pre>
|
|
|
|
<h3><a name="withverbose">Restoring a stack trace with line numbers (verbose)</a></h3>
|
|
|
|
In the previous example, we could also use the verbose flag:
|
|
<pre>
|
|
<b>java -jar retrace.jar -verbose proguard.map proguard.trace</b>
|
|
</pre>
|
|
<p>
|
|
|
|
The output will then look as follows:
|
|
<pre>
|
|
Exception in thread "main" java.lang.Error: Random exception
|
|
at proguard.shrink.UsageMarker.void visitInstruction(proguard.classfile.ClassFile,proguard.classfile.instruction.Instruction)(ProGuard:576)
|
|
at proguard.classfile.instruction.GenericInstruction.void accept(proguard.classfile.ClassFile,proguard.classfile.instruction.InstructionVisitor)(ProGuard:431)
|
|
at proguard.classfile.CodeAttrInfo.void instructionsAccept(proguard.classfile.ClassFile,proguard.classfile.instruction.InstructionVisitor)(ProGuard:145)
|
|
at proguard.shrink.UsageMarker.void visitCodeAttrInfo(proguard.classfile.ClassFile,proguard.classfile.CodeAttrInfo)(ProGuard:522)
|
|
at proguard.classfile.CodeAttrInfo.void accept(proguard.classfile.ClassFile,proguard.classfile.visitor.AttrInfoVisitor)(ProGuard:129)
|
|
at proguard.classfile.ProgramMemberInfo.void attributesAccept(proguard.classfile.ProgramClassFile,proguard.classfile.visitor.AttrInfoVisitor)(ProGuard:125)
|
|
at proguard.shrink.UsageMarker.void visitMemberInfo(proguard.classfile.ProgramClassFile,proguard.classfile.ProgramMemberInfo)(ProGuard:251)
|
|
at proguard.shrink.UsageMarker.void visitProgramMethodInfo(proguard.classfile.ProgramClassFile,proguard.classfile.ProgramMethodInfo)(ProGuard:229)
|
|
at proguard.classfile.ProgramMethodInfo.void accept(proguard.classfile.ProgramClassFile,proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:55)
|
|
at proguard.classfile.ProgramClassFile.void methodAccept(proguard.classfile.visitor.MemberInfoVisitor,java.lang.String,java.lang.String)(ProGuard:405)
|
|
at proguard.classfile.visitor.NamedMethodVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:51)
|
|
at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
|
|
at proguard.classfile.visitor.ClassFileUpDownTraveler.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:109)
|
|
at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
|
|
at proguard.classfile.visitor.ClassFileUpDownTraveler.void visitLibraryClassFile(proguard.classfile.LibraryClassFile)(ProGuard:186)
|
|
at proguard.classfile.LibraryClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:369)
|
|
at proguard.shrink.UsageMarker.void visitLibraryMethodInfo(proguard.classfile.LibraryClassFile,proguard.classfile.LibraryMethodInfo)(ProGuard:286)
|
|
at proguard.classfile.LibraryMethodInfo.void accept(proguard.classfile.LibraryClassFile,proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:55)
|
|
at proguard.classfile.LibraryClassFile.void methodsAccept(proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:408)
|
|
at proguard.shrink.UsageMarker.void visitLibraryClassFile(proguard.classfile.LibraryClassFile)(ProGuard:190)
|
|
at proguard.classfile.LibraryClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:369)
|
|
at proguard.classfile.ClassCpInfo.void referencedClassAccept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:110)
|
|
at proguard.shrink.UsageMarker.void visitClassCpInfo(proguard.classfile.ClassFile,proguard.classfile.ClassCpInfo)(ProGuard:449)
|
|
at proguard.classfile.ClassCpInfo.void accept(proguard.classfile.ClassFile,proguard.classfile.visitor.CpInfoVisitor)(ProGuard:99)
|
|
at proguard.classfile.ProgramClassFile.void constantPoolEntryAccept(proguard.classfile.visitor.CpInfoVisitor,int)(ProGuard:372)
|
|
at proguard.shrink.UsageMarker.void markCpEntry(proguard.classfile.ClassFile,int)(ProGuard:649)
|
|
at proguard.shrink.UsageMarker.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:112)
|
|
at proguard.classfile.visitor.VariableClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:66)
|
|
at proguard.classfile.visitor.MultiClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:83)
|
|
at proguard.classfile.visitor.FilteredClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:69)
|
|
at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
|
|
at proguard.classfile.ClassPool.void classFileAccept(proguard.classfile.visitor.ClassFileVisitor,java.lang.String)(ProGuard:149)
|
|
at proguard.classfile.visitor.NamedClassFileVisitor.void visitClassPool(proguard.classfile.ClassPool)(ProGuard:49)
|
|
at proguard.classfile.ClassPool.void accept(proguard.classfile.visitor.ClassPoolVisitor)(ProGuard:105)
|
|
at proguard.KeepCommand.void executeShrinkingPhase(proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:370)
|
|
at proguard.KeepCommand.void execute(int,proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:317)
|
|
at proguard.CompoundCommand.void execute(int,proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:55)
|
|
at proguard.ProGuard.void executeCommands(int)(ProGuard:363)
|
|
at proguard.ProGuard.void shrink()(ProGuard:187)
|
|
at proguard.ProGuard.void execute(java.lang.String[])(ProGuard:385)
|
|
at proguard.ProGuard.void main(java.lang.String[])(ProGuard:429)
|
|
</pre>
|
|
|
|
|
|
<h3><a name="without">Restoring a stack trace without line numbers</a></h3>
|
|
|
|
Assume for instance ProGuard itself has been obfuscated using the following
|
|
extra options, this time without preserving the line number tables:
|
|
<pre>
|
|
-printmapping proguard.map
|
|
</pre>
|
|
<p>
|
|
|
|
A stack trace <code>proguard.trace</code> will then lack line number
|
|
information:
|
|
<pre>
|
|
Exception in thread "main" java.lang.Error: Random exception
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.bO.a(Unknown Source)
|
|
at pro.bj.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.bj.a(Unknown Source)
|
|
at pro.bN.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.l.a(Unknown Source)
|
|
at pro.bo.b(Unknown Source)
|
|
at pro.ci.a(Unknown Source)
|
|
at pro.bo.a(Unknown Source)
|
|
at pro.be.a(Unknown Source)
|
|
at pro.bo.a(Unknown Source)
|
|
at pro.be.a(Unknown Source)
|
|
at pro.bg.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.bh.a(Unknown Source)
|
|
at pro.bg.b(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.bg.a(Unknown Source)
|
|
at pro.M.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.M.a(Unknown Source)
|
|
at pro.bo.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.bY.a(Unknown Source)
|
|
at pro.P.a(Unknown Source)
|
|
at pro.p.a(Unknown Source)
|
|
at pro.bU.a(Unknown Source)
|
|
at pro.bo.a(Unknown Source)
|
|
at pro.J.a(Unknown Source)
|
|
at pro.I.a(Unknown Source)
|
|
at pro.J.a(Unknown Source)
|
|
at pro.cf.c(Unknown Source)
|
|
at pro.cf.a(Unknown Source)
|
|
at pro.bc.a(Unknown Source)
|
|
at proguard.ProGuard.a(Unknown Source)
|
|
at proguard.ProGuard.c(Unknown Source)
|
|
at proguard.ProGuard.b(Unknown Source)
|
|
at proguard.ProGuard.main(Unknown Source)
|
|
</pre>
|
|
<p>
|
|
|
|
We can still use the same command to recover the stack trace:
|
|
<pre>
|
|
<b>java -jar retrace.jar proguard.map proguard.trace</b>
|
|
</pre>
|
|
<p>
|
|
|
|
The output will now give a list of alternative original method names for each
|
|
ambiguous obfuscated method name:
|
|
<pre>
|
|
Exception in thread "main" java.lang.Error: Random exception
|
|
at proguard.shrink.UsageMarker.visitProgramClassFile(Unknown Source)
|
|
visitLibraryClassFile
|
|
visitProgramFieldInfo
|
|
visitProgramMethodInfo
|
|
visitMemberInfo
|
|
visitLibraryFieldInfo
|
|
visitLibraryMethodInfo
|
|
visitIntegerCpInfo
|
|
visitLongCpInfo
|
|
visitFloatCpInfo
|
|
visitDoubleCpInfo
|
|
visitStringCpInfo
|
|
visitUtf8CpInfo
|
|
visitFieldrefCpInfo
|
|
visitInterfaceMethodrefCpInfo
|
|
visitMethodrefCpInfo
|
|
visitClassCpInfo
|
|
visitNameAndTypeCpInfo
|
|
visitUnknownAttrInfo
|
|
visitInnerClassesAttrInfo
|
|
visitConstantValueAttrInfo
|
|
visitExceptionsAttrInfo
|
|
visitCodeAttrInfo
|
|
visitLineNumberTableAttrInfo
|
|
visitLocalVariableTableAttrInfo
|
|
visitSourceFileAttrInfo
|
|
visitDeprecatedAttrInfo
|
|
visitSyntheticAttrInfo
|
|
visitInstruction
|
|
visitCpInstruction
|
|
visitExceptionInfo
|
|
visitInnerClassesInfo
|
|
visitLocalVariableInfo
|
|
markCpEntry
|
|
markAsUnused
|
|
isUsed
|
|
at proguard.classfile.instruction.GenericInstruction.create(Unknown Source)
|
|
isWide
|
|
getLength
|
|
accept
|
|
at proguard.classfile.CodeAttrInfo.getAttribute(Unknown Source)
|
|
getAttrInfoLength
|
|
readInfo
|
|
accept
|
|
instructionsAccept
|
|
exceptionsAccept
|
|
[...]
|
|
at proguard.KeepCommand.executeShrinkingPhase(Unknown Source)
|
|
access$100
|
|
at proguard.KeepCommand.keepField(Unknown Source)
|
|
ensureMultiClassFileVisitorForMembers
|
|
execute
|
|
executeObfuscationPhase
|
|
access$002
|
|
access$000
|
|
access$102
|
|
access$108
|
|
at proguard.CompoundCommand.addCommand(Unknown Source)
|
|
execute
|
|
at proguard.ProGuard.readCommands(Unknown Source)
|
|
obfuscate
|
|
executeCommands
|
|
at proguard.ProGuard.shrink(Unknown Source)
|
|
at proguard.ProGuard.check(Unknown Source)
|
|
execute
|
|
at proguard.ProGuard.main(Unknown Source)
|
|
</pre>
|
|
|
|
<hr />
|
|
<address>
|
|
Copyright © 2002-2014
|
|
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
|
|
</address>
|
|
</body>
|
|
</html>
|
|
|