Невозможно деобфобывать 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);