Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AngularJS - Stack trace ignoring source map

I've written an AngularJS app but it's proving a bit of a nightmare to debug. I'm using Grunt + uglify to concatenate and minify my application code. It also creates a source map alongside the minified JS file.

The source map seems to work properly when there is a JS error in the file, but outside of the AngularJS application. e.g. If I write console.log('a.b'); at the top of one of the files, the error logged in the Chrome debugger displays line + file info for the original file, not the minified one.

The problem occurs when there is a problem with code that Angular runs itself (e.g. in Controller code). I get a nice stack trace from Angular, but it only details the minified file not the original.

Is there anything I can do to get Angular to acknowledge the source map?

Example error below:

TypeError: Cannot call method 'getElement' of undefined at Object.addMapControls (http://my-site/wp-content/plugins/my-maps/assets/js/app.min.js:1:2848) at Object.g [as init] (http://my-site/wp-content/plugins/my-maps/assets/js/app.min.js:1:344) at new a (http://my-site/wp-content/plugins/my-maps/assets/js/app.min.js:1:591) at d (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.min.js:29:495) at Object.instantiate (http://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.min.js:30:123) 
like image 899
Tom Seldon Avatar asked Oct 17 '13 07:10

Tom Seldon


1 Answers

Larrifax's answer is good but there is an improved version of the function documented in the same issue report:

.config(function($provide) {    // Fix sourcemaps   // @url https://github.com/angular/angular.js/issues/5217#issuecomment-50993513   $provide.decorator('$exceptionHandler', function($delegate) {     return function(exception, cause) {       $delegate(exception, cause);       setTimeout(function() {         throw exception;       });     };   }); }) 

This will generate two stack traces, as Andrew Magee noted: one formatted by Angular, then a second one formatted by the browser. The second trace will apply sourcemaps. It's probably not a great idea to disable the duplicates, because you may have other Angular modules that also do work with exceptions that could be called after this via the delegation.

like image 132
Marc Durdin Avatar answered Oct 23 '22 05:10

Marc Durdin