Невозможно деобфобывать GWT stacktrace
Мы пытаемся отправить исключенные GWT исключения (мы используем GWT 2.5 rc1) на наш сервер для ведения журналов и отладки. Мы хотим деобфобывать трассировки стека исключений, иначе это было бы почти бесполезно.
После некоторых исследований я нашел 7 советов по обработке исключений в GWT и WebModeExceptions, которые содержали ценная информация.
Итак, мы создали GWT UncaughtExceptionHandler, который использует настраиваемую службу RPC для передачи исключений со своими трассировками стека. Это прекрасно работает.
Как описано в разделе разделов деобфузии WebModeExceptions, мы включили эмуляцию stacktrace с этим в нашем модуле GWT:
<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers"
value="true" />
Теперь наши stacktraces выглядят так:
com.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot call method 'pp' of null
Unknown.aT(Unknown Source:174)
Unknown.AVa(Unknown Source:501)
Unknown.YF(Unknown Source:29)
Unknown.Lqb(Unknown Source:138)
...
Мне кажется, что это нормально, потому что оно содержит имя запутанного метода и номер строки, который, как представляется, является тем, что требуется, как описано в разделе раздел деобфузии WebModeExceptions.
Затем мы скомпилируем наши модули GWT с параметром -extra, чтобы получить символы.
Наша специализированная служба журналов использует каталог symbolMaps для вызова com.google.gwt.logging.server.StackTraceDeobfuscator. Мы используем HTTP-заголовок X-GWT-Permutation для вызова деобфускатора. Я вошел в метод deobfuscate, чтобы убедиться, что он может загрузить карту символов. Это могло бы. Я подтвердил, что используемое имя файла symbolMap соответствует имени файла *.cache.js модуля GWT. Он соответствует.
Таким образом, служба выполняет это:
// Create the deobfuscator
String dir = getSymbolMapsDirPath();
StackTraceDeobfuscator deobfuscator = new StackTraceDeobfuscator(dir);
// request is the HttpServletRequest
String strongName = request.getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);
// Deobfuscate the stack trace
exception.setStackTrace(
deobfuscator.deobfuscateStackTrace(exception.getStackTrace(), strongName));
// Log the exception
logger.severe("Uncaught GWT exception", exception);
Конечным результатом является то, что трассировки стека не деформируются. Иногда некоторые строки получат deobufscated с неправильным именем класса и метода, но не более того. При просмотре файла symbolMap фактические символы в трассировке стека не соответствуют ни одному из символов в файле symbolMap.
Любая идея, что мы делаем здесь неправильно?
EDIT: я попробовал RemoteLoggingServiceImpl и получил те же результаты.
Ответы
Ответ 1
После дальнейшего исследования кажется, что новый параметр компилятора GWT -XenableClosureCompiler
, который мы использовали, генерирует код, который не выводит трассировки стека, который использует карты символов, сгенерированные компилятором. После удаления этой опции трассировки стека могут быть деобфузированы успешно.
В качестве стороннего примечания параметры компилятора и модуля GWT, необходимые для деобфузирования трассировки стека (те, которые описаны в моем вопросе и удаление опции компилятора закрытия), делают наши последние файлы js вдвое больше, чем раньше.
Ответ 2
Версия StackTraceDeobfuscator
в вопросе теперь устарела. Здесь новый способ (не совсем так сильно отличается):
import com.google.gwt.core.server.StackTraceDeobfuscator;
import com.google.gwt.user.client.rpc.RpcRequestBuilder;
String path = getServletConfig().getServletContext().getRealPath("/WEB-INF/deploy/<your module name>/symbolMaps/");
StackTraceDeobfuscator deobfuscator = StackTraceDeobfuscator.fromFileSystem(path);
String strongName = getThreadLocalRequest().getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);
// Do the magic
deobfuscator.deobfuscateStackTrace(exception, strongName);
// Log it
logger.severe("Uncaught GWT exception", exception);