Home | History | Annotate | Download | only in retrace
      1 <!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      2 <html>
      3 <head>
      4 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
      5 <meta http-equiv="content-style-type" content="text/css">
      6 <link rel="stylesheet" type="text/css" href="../style.css">
      7 <title>ReTrace Examples</title>
      8 <script type="text/javascript" language="JavaScript">
      9 <!--
     10 if (window.self==window.top)
     11   window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
     12 else {
     13   var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
     14   if (window.top.location.hash!=hash)
     15     window.top.location.hash=hash;
     16 }
     17 //-->
     18 </script>
     19 </head>
     20 <body>
     21 
     22 <h2>Examples</h2>
     23 
     24 Some typical example uses:
     25 <ol>
     26 <li><a href="#with">Restoring a stack trace with line numbers</a></li>
     27 <li><a href="#withverbose">Restoring a stack trace with line numbers
     28     (verbose)</a></li>
     29 <li><a href="#without">Restoring a stack trace without line numbers</a></li>
     30 </ol>
     31 
     32 <h3><a name="with">Restoring a stack trace with line numbers</a></h3>
     33 
     34 Assume for instance ProGuard itself has been obfuscated using the following
     35 extra options:
     36 <pre>
     37 -printmapping proguard.map
     38 
     39 -renamesourcefileattribute ProGuard
     40 -keepattributes SourceFile,LineNumberTable
     41 </pre>
     42 <p>
     43 
     44 Now assume the processed application throws an exception, and we have saved the
     45 stack trace in <code>proguard.trace</code>, shown below. Of course, in real
     46 life ProGuard rarely throws exceptions, so this is a purposely generated
     47 exception. :)
     48 
     49 <pre>
     50 Exception in thread "main" java.lang.Error: Random exception
     51         at pro.bY.a(ProGuard:576)
     52         at pro.bO.a(ProGuard:431)
     53         at pro.bj.a(ProGuard:145)
     54         at pro.bY.a(ProGuard:522)
     55         at pro.bj.a(ProGuard:129)
     56         at pro.bN.a(ProGuard:125)
     57         at pro.bY.a(ProGuard:251)
     58         at pro.bY.a(ProGuard:229)
     59         at pro.l.a(ProGuard:55)
     60         at pro.bo.b(ProGuard:405)
     61         at pro.ci.a(ProGuard:51)
     62         at pro.bo.a(ProGuard:356)
     63         at pro.be.a(ProGuard:109)
     64         at pro.bo.a(ProGuard:356)
     65         at pro.be.a(ProGuard:186)
     66         at pro.bg.a(ProGuard:369)
     67         at pro.bY.a(ProGuard:286)
     68         at pro.bh.a(ProGuard:55)
     69         at pro.bg.b(ProGuard:408)
     70         at pro.bY.a(ProGuard:190)
     71         at pro.bg.a(ProGuard:369)
     72         at pro.M.a(ProGuard:110)
     73         at pro.bY.a(ProGuard:449)
     74         at pro.M.a(ProGuard:99)
     75         at pro.bo.a(ProGuard:372)
     76         at pro.bY.a(ProGuard:649)
     77         at pro.bY.a(ProGuard:112)
     78         at pro.P.a(ProGuard:66)
     79         at pro.p.a(ProGuard:83)
     80         at pro.bU.a(ProGuard:69)
     81         at pro.bo.a(ProGuard:356)
     82         at pro.J.a(ProGuard:149)
     83         at pro.I.a(ProGuard:49)
     84         at pro.J.a(ProGuard:105)
     85         at pro.cf.c(ProGuard:370)
     86         at pro.cf.a(ProGuard:317)
     87         at pro.bc.a(ProGuard:55)
     88         at proguard.ProGuard.a(ProGuard:363)
     89         at proguard.ProGuard.c(ProGuard:187)
     90         at proguard.ProGuard.b(ProGuard:385)
     91         at proguard.ProGuard.main(ProGuard:429)
     92 </pre>
     93 <p>
     94 
     95 We can then use the following command to recover the stack trace:
     96 <pre>
     97 <b>java -jar retrace.jar proguard.map proguard.trace</b>
     98 </pre>
     99 <p>
    100 
    101 The output will look as follows:
    102 <pre>
    103 Exception in thread "main" java.lang.Error: Random exception
    104         at proguard.shrink.UsageMarker.visitInstruction(ProGuard:576)
    105         at proguard.classfile.instruction.GenericInstruction.accept(ProGuard:431)
    106         at proguard.classfile.CodeAttrInfo.instructionsAccept(ProGuard:145)
    107         at proguard.shrink.UsageMarker.visitCodeAttrInfo(ProGuard:522)
    108         at proguard.classfile.CodeAttrInfo.accept(ProGuard:129)
    109         at proguard.classfile.ProgramMemberInfo.attributesAccept(ProGuard:125)
    110         at proguard.shrink.UsageMarker.visitMemberInfo(ProGuard:251)
    111         at proguard.shrink.UsageMarker.visitProgramMethodInfo(ProGuard:229)
    112         at proguard.classfile.ProgramMethodInfo.accept(ProGuard:55)
    113         at proguard.classfile.ProgramClassFile.methodAccept(ProGuard:405)
    114         at proguard.classfile.visitor.NamedMethodVisitor.visitProgramClassFile(ProGuard:51)
    115         at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
    116         at proguard.classfile.visitor.ClassFileUpDownTraveler.visitProgramClassFile(ProGuard:109)
    117         at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
    118         at proguard.classfile.visitor.ClassFileUpDownTraveler.visitLibraryClassFile(ProGuard:186)
    119         at proguard.classfile.LibraryClassFile.accept(ProGuard:369)
    120         at proguard.shrink.UsageMarker.visitLibraryMethodInfo(ProGuard:286)
    121         at proguard.classfile.LibraryMethodInfo.accept(ProGuard:55)
    122         at proguard.classfile.LibraryClassFile.methodsAccept(ProGuard:408)
    123         at proguard.shrink.UsageMarker.visitLibraryClassFile(ProGuard:190)
    124         at proguard.classfile.LibraryClassFile.accept(ProGuard:369)
    125         at proguard.classfile.ClassCpInfo.referencedClassAccept(ProGuard:110)
    126         at proguard.shrink.UsageMarker.visitClassCpInfo(ProGuard:449)
    127         at proguard.classfile.ClassCpInfo.accept(ProGuard:99)
    128         at proguard.classfile.ProgramClassFile.constantPoolEntryAccept(ProGuard:372)
    129         at proguard.shrink.UsageMarker.markCpEntry(ProGuard:649)
    130         at proguard.shrink.UsageMarker.visitProgramClassFile(ProGuard:112)
    131         at proguard.classfile.visitor.VariableClassFileVisitor.visitProgramClassFile(ProGuard:66)
    132         at proguard.classfile.visitor.MultiClassFileVisitor.visitProgramClassFile(ProGuard:83)
    133         at proguard.classfile.visitor.FilteredClassFileVisitor.visitProgramClassFile(ProGuard:69)
    134         at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
    135         at proguard.classfile.ClassPool.classFileAccept(ProGuard:149)
    136         at proguard.classfile.visitor.NamedClassFileVisitor.visitClassPool(ProGuard:49)
    137         at proguard.classfile.ClassPool.accept(ProGuard:105)
    138         at proguard.KeepCommand.executeShrinkingPhase(ProGuard:370)
    139         at proguard.KeepCommand.execute(ProGuard:317)
    140         at proguard.CompoundCommand.execute(ProGuard:55)
    141         at proguard.ProGuard.executeCommands(ProGuard:363)
    142         at proguard.ProGuard.shrink(ProGuard:187)
    143         at proguard.ProGuard.execute(ProGuard:385)
    144         at proguard.ProGuard.main(ProGuard:429)
    145 </pre>
    146 
    147 <h3><a name="withverbose">Restoring a stack trace with line numbers (verbose)</a></h3>
    148 
    149 In the previous example, we could also use the verbose flag:
    150 <pre>
    151 <b>java -jar retrace.jar -verbose proguard.map proguard.trace</b>
    152 </pre>
    153 <p>
    154 
    155 The output will then look as follows:
    156 <pre>
    157 Exception in thread "main" java.lang.Error: Random exception
    158         at proguard.shrink.UsageMarker.void visitInstruction(proguard.classfile.ClassFile,proguard.classfile.instruction.Instruction)(ProGuard:576)
    159         at proguard.classfile.instruction.GenericInstruction.void accept(proguard.classfile.ClassFile,proguard.classfile.instruction.InstructionVisitor)(ProGuard:431)
    160         at proguard.classfile.CodeAttrInfo.void instructionsAccept(proguard.classfile.ClassFile,proguard.classfile.instruction.InstructionVisitor)(ProGuard:145)
    161         at proguard.shrink.UsageMarker.void visitCodeAttrInfo(proguard.classfile.ClassFile,proguard.classfile.CodeAttrInfo)(ProGuard:522)
    162         at proguard.classfile.CodeAttrInfo.void accept(proguard.classfile.ClassFile,proguard.classfile.visitor.AttrInfoVisitor)(ProGuard:129)
    163         at proguard.classfile.ProgramMemberInfo.void attributesAccept(proguard.classfile.ProgramClassFile,proguard.classfile.visitor.AttrInfoVisitor)(ProGuard:125)
    164         at proguard.shrink.UsageMarker.void visitMemberInfo(proguard.classfile.ProgramClassFile,proguard.classfile.ProgramMemberInfo)(ProGuard:251)
    165         at proguard.shrink.UsageMarker.void visitProgramMethodInfo(proguard.classfile.ProgramClassFile,proguard.classfile.ProgramMethodInfo)(ProGuard:229)
    166         at proguard.classfile.ProgramMethodInfo.void accept(proguard.classfile.ProgramClassFile,proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:55)
    167         at proguard.classfile.ProgramClassFile.void methodAccept(proguard.classfile.visitor.MemberInfoVisitor,java.lang.String,java.lang.String)(ProGuard:405)
    168         at proguard.classfile.visitor.NamedMethodVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:51)
    169         at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
    170         at proguard.classfile.visitor.ClassFileUpDownTraveler.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:109)
    171         at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
    172         at proguard.classfile.visitor.ClassFileUpDownTraveler.void visitLibraryClassFile(proguard.classfile.LibraryClassFile)(ProGuard:186)
    173         at proguard.classfile.LibraryClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:369)
    174         at proguard.shrink.UsageMarker.void visitLibraryMethodInfo(proguard.classfile.LibraryClassFile,proguard.classfile.LibraryMethodInfo)(ProGuard:286)
    175         at proguard.classfile.LibraryMethodInfo.void accept(proguard.classfile.LibraryClassFile,proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:55)
    176         at proguard.classfile.LibraryClassFile.void methodsAccept(proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:408)
    177         at proguard.shrink.UsageMarker.void visitLibraryClassFile(proguard.classfile.LibraryClassFile)(ProGuard:190)
    178         at proguard.classfile.LibraryClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:369)
    179         at proguard.classfile.ClassCpInfo.void referencedClassAccept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:110)
    180         at proguard.shrink.UsageMarker.void visitClassCpInfo(proguard.classfile.ClassFile,proguard.classfile.ClassCpInfo)(ProGuard:449)
    181         at proguard.classfile.ClassCpInfo.void accept(proguard.classfile.ClassFile,proguard.classfile.visitor.CpInfoVisitor)(ProGuard:99)
    182         at proguard.classfile.ProgramClassFile.void constantPoolEntryAccept(proguard.classfile.visitor.CpInfoVisitor,int)(ProGuard:372)
    183         at proguard.shrink.UsageMarker.void markCpEntry(proguard.classfile.ClassFile,int)(ProGuard:649)
    184         at proguard.shrink.UsageMarker.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:112)
    185         at proguard.classfile.visitor.VariableClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:66)
    186         at proguard.classfile.visitor.MultiClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:83)
    187         at proguard.classfile.visitor.FilteredClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:69)
    188         at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
    189         at proguard.classfile.ClassPool.void classFileAccept(proguard.classfile.visitor.ClassFileVisitor,java.lang.String)(ProGuard:149)
    190         at proguard.classfile.visitor.NamedClassFileVisitor.void visitClassPool(proguard.classfile.ClassPool)(ProGuard:49)
    191         at proguard.classfile.ClassPool.void accept(proguard.classfile.visitor.ClassPoolVisitor)(ProGuard:105)
    192         at proguard.KeepCommand.void executeShrinkingPhase(proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:370)
    193         at proguard.KeepCommand.void execute(int,proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:317)
    194         at proguard.CompoundCommand.void execute(int,proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:55)
    195         at proguard.ProGuard.void executeCommands(int)(ProGuard:363)
    196         at proguard.ProGuard.void shrink()(ProGuard:187)
    197         at proguard.ProGuard.void execute(java.lang.String[])(ProGuard:385)
    198         at proguard.ProGuard.void main(java.lang.String[])(ProGuard:429)
    199 </pre>
    200 
    201 
    202 <h3><a name="without">Restoring a stack trace without line numbers</a></h3>
    203 
    204 Assume for instance ProGuard itself has been obfuscated using the following
    205 extra options, this time without preserving the line number tables:
    206 <pre>
    207 -printmapping proguard.map
    208 </pre>
    209 <p>
    210 
    211 A stack trace <code>proguard.trace</code> will then lack line number
    212 information:
    213 <pre>
    214 Exception in thread "main" java.lang.Error: Random exception
    215         at pro.bY.a(Unknown Source)
    216         at pro.bO.a(Unknown Source)
    217         at pro.bj.a(Unknown Source)
    218         at pro.bY.a(Unknown Source)
    219         at pro.bj.a(Unknown Source)
    220         at pro.bN.a(Unknown Source)
    221         at pro.bY.a(Unknown Source)
    222         at pro.bY.a(Unknown Source)
    223         at pro.l.a(Unknown Source)
    224         at pro.bo.b(Unknown Source)
    225         at pro.ci.a(Unknown Source)
    226         at pro.bo.a(Unknown Source)
    227         at pro.be.a(Unknown Source)
    228         at pro.bo.a(Unknown Source)
    229         at pro.be.a(Unknown Source)
    230         at pro.bg.a(Unknown Source)
    231         at pro.bY.a(Unknown Source)
    232         at pro.bh.a(Unknown Source)
    233         at pro.bg.b(Unknown Source)
    234         at pro.bY.a(Unknown Source)
    235         at pro.bg.a(Unknown Source)
    236         at pro.M.a(Unknown Source)
    237         at pro.bY.a(Unknown Source)
    238         at pro.M.a(Unknown Source)
    239         at pro.bo.a(Unknown Source)
    240         at pro.bY.a(Unknown Source)
    241         at pro.bY.a(Unknown Source)
    242         at pro.P.a(Unknown Source)
    243         at pro.p.a(Unknown Source)
    244         at pro.bU.a(Unknown Source)
    245         at pro.bo.a(Unknown Source)
    246         at pro.J.a(Unknown Source)
    247         at pro.I.a(Unknown Source)
    248         at pro.J.a(Unknown Source)
    249         at pro.cf.c(Unknown Source)
    250         at pro.cf.a(Unknown Source)
    251         at pro.bc.a(Unknown Source)
    252         at proguard.ProGuard.a(Unknown Source)
    253         at proguard.ProGuard.c(Unknown Source)
    254         at proguard.ProGuard.b(Unknown Source)
    255         at proguard.ProGuard.main(Unknown Source)
    256 </pre>
    257 <p>
    258 
    259 We can still use the same command to recover the stack trace:
    260 <pre>
    261 <b>java -jar retrace.jar proguard.map proguard.trace</b>
    262 </pre>
    263 <p>
    264 
    265 The output will now give a list of alternative original method names for each
    266 ambiguous obfuscated method name:
    267 <pre>
    268 Exception in thread "main" java.lang.Error: Random exception
    269         at proguard.shrink.UsageMarker.visitProgramClassFile(Unknown Source)
    270                                        visitLibraryClassFile
    271                                        visitProgramFieldInfo
    272                                        visitProgramMethodInfo
    273                                        visitMemberInfo
    274                                        visitLibraryFieldInfo
    275                                        visitLibraryMethodInfo
    276                                        visitIntegerCpInfo
    277                                        visitLongCpInfo
    278                                        visitFloatCpInfo
    279                                        visitDoubleCpInfo
    280                                        visitStringCpInfo
    281                                        visitUtf8CpInfo
    282                                        visitFieldrefCpInfo
    283                                        visitInterfaceMethodrefCpInfo
    284                                        visitMethodrefCpInfo
    285                                        visitClassCpInfo
    286                                        visitNameAndTypeCpInfo
    287                                        visitUnknownAttrInfo
    288                                        visitInnerClassesAttrInfo
    289                                        visitConstantValueAttrInfo
    290                                        visitExceptionsAttrInfo
    291                                        visitCodeAttrInfo
    292                                        visitLineNumberTableAttrInfo
    293                                        visitLocalVariableTableAttrInfo
    294                                        visitSourceFileAttrInfo
    295                                        visitDeprecatedAttrInfo
    296                                        visitSyntheticAttrInfo
    297                                        visitInstruction
    298                                        visitCpInstruction
    299                                        visitExceptionInfo
    300                                        visitInnerClassesInfo
    301                                        visitLocalVariableInfo
    302                                        markCpEntry
    303                                        markAsUnused
    304                                        isUsed
    305         at proguard.classfile.instruction.GenericInstruction.create(Unknown Source)
    306                                                              isWide
    307                                                              getLength
    308                                                              accept
    309         at proguard.classfile.CodeAttrInfo.getAttribute(Unknown Source)
    310                                            getAttrInfoLength
    311                                            readInfo
    312                                            accept
    313                                            instructionsAccept
    314                                            exceptionsAccept
    315         [...]
    316         at proguard.KeepCommand.executeShrinkingPhase(Unknown Source)
    317                                 access$100
    318         at proguard.KeepCommand.keepField(Unknown Source)
    319                                 ensureMultiClassFileVisitorForMembers
    320                                 execute
    321                                 executeObfuscationPhase
    322                                 access$002
    323                                 access$000
    324                                 access$102
    325                                 access$108
    326         at proguard.CompoundCommand.addCommand(Unknown Source)
    327                                     execute
    328         at proguard.ProGuard.readCommands(Unknown Source)
    329                              obfuscate
    330                              executeCommands
    331         at proguard.ProGuard.shrink(Unknown Source)
    332         at proguard.ProGuard.check(Unknown Source)
    333                              execute
    334         at proguard.ProGuard.main(Unknown Source)
    335 </pre>
    336 
    337 <hr />
    338 <noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
    339 <address>
    340 Copyright &copy; 2002-2011
    341 <a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
    342 </address>
    343 </body>
    344 </html>
    345 
    346