A stack trace is a record of
function calls until now
within the current call stack.
Slide 36
Slide 36 text
stack trace or gtfo
Slide 37
Slide 37 text
$ node
Slide 38
Slide 38 text
$ node
> throw new Error('lol')
Slide 39
Slide 39 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
Slide 40
Slide 40 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
name
Slide 41
Slide 41 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
message
Slide 42
Slide 42 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
stack trace
Slide 43
Slide 43 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
frame
Slide 44
Slide 44 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
caller
Slide 45
Slide 45 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
source
Slide 46
Slide 46 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
line number
Slide 47
Slide 47 text
Error: lol
at repl:1:7
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface. (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
column number
Slide 48
Slide 48 text
> typeof new Error('lol').stack
Slide 49
Slide 49 text
> typeof new Error('lol').stack
'string'
Slide 50
Slide 50 text
/at (?:(.+)\s+)?\(?(?:(.
+?):(\d+):(\d+)|([^)]+))
\)?/
* regular expression to parse a v8 stack trace
Slide 51
Slide 51 text
// awesome.js
(function() {
!
var things = [
{foo: 'bar'}
];
!
function showThing(index) {
console.log(things[index].foo);
}
!
showThing(1);
!
})();
Slide 52
Slide 52 text
$ node awesome.js
!
/jsconf/awesome.js:9
console.log(things[index].foo);
^
TypeError: Cannot read property 'foo' of undefined
at showThing (/jsconf/awesome.js:9:30)
at /jsconf/awesome.js:12:3
at Object. (/jsconf/awesome.js:14:2)
Slide 53
Slide 53 text
FireFox
!
TypeError: things[index] is undefined
!
showThing@http://localhost:8000/awesome.js:9
@http://localhost:8000/awesome.js:12
@http://localhost:8000/awesome.js:2
Slide 54
Slide 54 text
Safari
!
TypeError: 'undefined' is not an object (evaluating
‘things[index].foo')
!
showThing@http://localhost:8000/awesome.js:9:30
http://localhost:8000/awesome.js:12:16
global code@http://localhost:8000/awesome.js:14:2
$ node awesome.min.js
!
/jsconf/awesome.min.js:1
o=[{foo:"bar"}];function n(n){console.log(o[n].foo)}n(1)
^
TypeError: Cannot read property 'foo' of undefined
at n (/jsconf/awesome.min.js:1:125)
at /jsconf/awesome.min.js:1:131
at Object. (/jsconf/awesome.min.js:1:137)
Slide 57
Slide 57 text
source maps
Slide 58
Slide 58 text
A source map maps up
minified tokens to positions
in the original source.
Slide 59
Slide 59 text
Translates
app.min.js, line 1, col 125
app.js, line 9, col 30
Slide 60
Slide 60 text
Translates
symbol “n”
symbol “showThing”
Slide 61
Slide 61 text
A source map requires 3
things to be useful.
Slide 62
Slide 62 text
1. Filename
2. Line number
3. Column number
Slide 63
Slide 63 text
Column numbers are rare.
Slide 64
Slide 64 text
window.onerror only has
line number.
Slide 65
Slide 65 text
FireFox only has line
number.
showThing@http://localhost:8000/awesome.js:9
Slide 66
Slide 66 text
Internet Explorer… lol
* exercise for the reader
Slide 67
Slide 67 text
Error.prototype.stack being
a string sucks. We can do
better.
Slide 68
Slide 68 text
V8’s CallSite API
code.google.com/p/v8/wiki/JavaScriptStackTraceApi
Slide 69
Slide 69 text
Error.prepareStackTrace
Slide 70
Slide 70 text
We can tell V8 how to transform
raw CallSite objects into the
Error.prototype.stack property.