First the exception message gives you an idea of what has happened. In your
case you have called "length()" on a null object.
In your example if you use breakpoint on uncaught exception you are
somewhere in HandlerManager which uses an EventBus to fire events. The
problem is that all event handlers (in your case the ClickHandler) will be
executed by the EventBus and possible exceptions are recorded. Once all
handlers have been executed all recorded exceptions are wrapped by a single
UmbrellaException which is the one you are seeing now in your breakpoint.
What you can do now is to inspect the UmbrellaException $e0 in the Scope
Variables section of Chrome Dev Tools. If you open up the path $e0 ->
causes -> map_0 -> hashCodeMap you will see all the exceptions of all the
event handlers stored in that map. All these exceptions have a stackTrace
variable containing the JavaScript stack trace including JavaScript file
(e.g. <hash>.cache.html), method name and line number. You should be able
to look that up in the <hash>.cache.html file.
If you don't know where to set the breakpoint before the exception occurs
then SourceMaps don't help you a lot because you need to look at the
JavaScript stack trace. Also if you find it annoying to click through the
Chrome Dev Tools to inspect the UmbrellaException (which might be large,
depending on how many exception have been wrapped by it) you could also log
the exception and ALL its contents to console using:
GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
Logger logger = Logger.getLogger("Uncaught Exception Logger");
@Override
public void onUncaughtException(Throwable e) {
String json = JsonLogRecordClientUtil.throwableAsJson(e);
logger.severe(prettify(json));
}
private native String prettify(String json) /*-{
// will fail in IE6/7
return $wnd.JSON.stringify($wnd.JSON.parse(json), undefined, 2);
}-*/;
});
You would need to inherit GWT logging: <inherits
name="com.google.gwt.logging.Logging"/>. You could also send the exception
to the server and deobfuscate it back to a Java stack trace using
StackTraceDeobfuscator and the symbols map / sourcemap data generated by
the GWT compiler (by default stored in war/WEB-INF/deploy). Just keep in
mind that UmbrellaException only provides the first wrapped exception in
UmbrellaException.getCause(). To deobfuscate everything you would need to
go through UmbrellaException.getCauses().
Hope that helps.
-- J.
--
You received this message because you are subscribed to the Google Groups
"Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.