You can find the ReTrace jar in the lib
directory of the ProGuard distribution. To run ReTrace, just type:
java -jar retrace.jar
[options...] mapping_file [stacktrace_file]
Alternatively, the bin
directory contains some short Linux and Windows scripts containing this command. These are the arguments:
mapping_file : Specifies the name of the mapping file, produced by ProGuard with the option “-printmapping
mapping_file”, while obfuscating the application that produced the stack trace.
stacktrace_file : Optionally specifies the name of the file containing the stack trace. If no file is specified, a stack trace is read from the standard input. The stack trace must be encoded with UTF-8 encoding. Blank lines and unrecognized lines are ignored.
The following options are supported:
-verbose
: Specifies to print out more informative stack traces that include not only method names, but also method return types and arguments.
-regex
regular_expression
: Specifies the regular expression that is used to parse the lines in the stack trace. Specifying a different regular expression allows to de-obfuscate more general types of input than just stack traces. The default is suitable for stack traces produced by most JVMs:
(?:.*?\bat\s+%c\.%m\s*\(%s(?::%l)?\)\s*(?:~\[.*\])?)|(?:(?:.*?[:"]\s+)?%c(?::.*)?)
The regular expression is a Java regular expression (cfr. the documentation of java.util.regex.Pattern
), with a few additional wildcards:
Wildcard | Description | Example |
---|---|---|
%c | matches a class name | com.example.MyClass |
%C | matches a class name with slashes | com/example/MyClass |
%t | matches a field type or method return type | com.example.MyClass[] |
%f | matches a field name | myField |
%m | matches a method name | myMethod |
%a | matches a list of method arguments | boolean,int |
%s | matches a source file name | MyClass.java |
%l | matches a line number inside a method | 123 |
Elements that match these wildcards are de-obfuscated, when possible. Note that regular expressions must not contain any capturing groups. Use non-capturing groups instead: (?:
...)
The default expression for instance matches the following lines:
Exception in thread "main" com.example.MyException: Some message at com.example.MyClass.myMethod(MyClass.java:123)
The restored stack trace is printed to the standard output. The completeness of the restored stack trace depends on the presence of line number tables in the obfuscated class files:
Preserving line number tables is explained in detail in this example in the ProGuard User Manual.
Source file names are currently restored based on the names of the outer-most classes. If you prefer to keep the obfuscated name, you can replace %s
in the default regular expression by .*
Unobfuscated elements and obfuscated elements for which no mapping is available will be left unchanged.