Мы пытаемся отправить исключенные 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 и получил те же результаты.