js/src/doc/Debugger/Debugger.md

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:5391444ac6b4
1 # The Debugger Object
2
3 When called as a constructor, the `Debugger` object creates a new
4 `Debugger` instance.
5
6 <code>new Debugger([<i>global</i>, ...])</code>
7 : Create a debugger object, and apply its [`addDebuggee`][add] method to
8 each of the given <i>global</i> objects to add them as the initial
9 debuggees.
10
11 ## Accessor Properties of the Debugger Prototype Object
12
13 A `Debugger` instance inherits the following accessor properties from
14 its prototype:
15
16 `enabled`
17 : A boolean value indicating whether this `Debugger` instance's handlers,
18 breakpoints, watchpoints, and the like are currently enabled. It is an
19 accessor property with a getter and setter: assigning to it enables or
20 disables this `Debugger` instance; reading it produces true if the
21 instance is enabled, or false otherwise. This property is initially
22 `true` in a freshly created `Debugger` instance.
23
24 This property gives debugger code a single point of control for
25 disentangling itself from the debuggee, regardless of what sort of
26 events or handlers or "points" we add to the interface.
27
28 `uncaughtExceptionHook`
29 : Either `null` or a function that SpiderMonkey calls when a call to a
30 debug event handler, breakpoint handler, watchpoint handler, or similar
31 function throws some exception, which we refer to as
32 <i>debugger-exception</i> here. Exceptions thrown in the debugger are
33 not propagated to debuggee code; instead, SpiderMonkey calls this
34 function, passing <i>debugger-exception</i> as its sole argument and
35 the `Debugger` instance as the `this` value. This function should
36 return a [resumption value][rv], which determines how the debuggee
37 should continue.
38
39 If the uncaught exception hook itself throws an exception,
40 <i>uncaught-hook-exception</i>, SpiderMonkey throws a new error object,
41 <i>confess-to-debuggee-exception</i>, to the debuggee whose message
42 blames the debugger, and includes textual descriptions of
43 <i>uncaught-hook-exception</i> and the original
44 <i>debugger-exception</i>.
45
46 If `uncaughtExceptionHook`'s value is `null`, SpiderMonkey throws an
47 exception to the debuggee whose message blames the debugger, and
48 includes a textual description of <i>debugger-exception</i>.
49
50 Assigning anything other than a callable value or `null` to this
51 property throws a `TypeError` exception.
52
53 (This is not an ideal way to handle debugger bugs, but the hope here is
54 that some sort of backstop, even if imperfect, will make life easier for
55 debugger developers. For example, an uncaught exception hook may have
56 access to browser-level features like the `alert` function, which this
57 API's implementation does not, making it possible to present debugger
58 errors to the developer in a way suited to the context.)
59
60
61 ## Debugger Handler Functions
62
63 Each `Debugger` instance inherits accessor properties with which you can
64 store handler functions for SpiderMonkey to call when given events occur
65 in debuggee code.
66
67 When one of the events described below occurs in debuggee code, the engine
68 pauses the debuggee and calls the corresponding debugging handler on each
69 `Debugger` instance that is observing the debuggee. The handler functions
70 receive the `Debugger` instance as their `this` value. Most handler
71 functions can return a [resumption value][rv] indicating how the debuggee's
72 execution should proceed.
73
74 On a new `Debugger` instance, each of these properties is initially
75 `undefined`. Any value assigned to a debugging handler must be either a
76 function or `undefined`; otherwise a `TypeError` is thrown.
77
78 Handler functions run in the same thread in which the event occurred.
79 They run in the compartment to which they belong, not in a debuggee
80 compartment.
81
82 <code>onNewScript(<i>script</i>, <i>global</i>)</code>
83 : New code, represented by the [`Debugger.Script`][script] instance
84 <i>script</i>, has been loaded in the scope of the debuggee global
85 object <i>global</i>. <i>global</i> is a [`Debugger.Object`][object]
86 instance whose referent is the global object.
87
88 This method's return value is ignored.
89
90 <code>onDebuggerStatement(<i>frame</i>)</code>
91 : Debuggee code has executed a <i>debugger</i> statement in <i>frame</i>.
92 This method should return a [resumption value][rv] specifying how the
93 debuggee's execution should proceed.
94
95 <code>onEnterFrame(<i>frame</i>)</code>
96 : The stack frame <i>frame</i> is about to begin executing code.
97 (Naturally, <i>frame</i> is currently the youngest
98 [visible frame][vf].) This method should return
99 a [resumption value][rv] specifying how the debuggee's execution should
100 proceed.
101
102 SpiderMonkey only calls `onEnterFrame` to report
103 [visible][vf], non-`"debugger"` frames.
104
105 <code>onThrow(<i>frame</i>, <i>value</i>) <i>(future plan)</i></code>
106 : The exception <i>value</i> is being thrown by <i>frame</i>, which is
107 running debuggee code. This method should return a
108 [resumption value][rv] specifying how the debuggee's execution should
109 proceed. If it returns `undefined`, the exception is thrown as normal.
110
111 A call to the `onThrow` handler is typically followed by one or more
112 calls to the `onExceptionUnwind` handler.
113
114 *(pending discussion)* If the debuggee executes
115 `try { throw 0; } finally { f(); }` and `f()` executes without error,
116 the `onThrow` handler is called only once. The debugger is not notified
117 when the exception is set aside in order to execute the `finally` block,
118 nor when it is restored after the `finally` block completes normally.
119
120 *(An alternative design here would be: onException(status, frame, value)
121 where status is one of the strings "throw", "unwind", "catch",
122 "finally", "rethrow". JS\_SaveExceptionState would trigger a "finally"
123 event, JS\_RestoreExceptionState would trigger a "rethrow",
124 JS\_ClearPendingException would trigger a "catch"; not sure what
125 JS\_DropExceptionState or a return/throw from a finally block should
126 do.)*
127
128 <code>onExceptionUnwind(<i>frame</i>, <i>value</i>)</code>
129 : The exception <i>value</i> has been thrown, and has propagated to
130 <i>frame</i>; <i>frame</i> is the youngest remaining stack frame, and is a
131 debuggee frame. This method should return a [resumption value][rv]
132 specifying how the debuggee's execution should proceed. If it returns
133 `undefined`, the exception continues to propagate as normal: if control in
134 `frame` is in a `try` block, control jumps to the corresponding `catch` or
135 `finally` block; otherwise, <i>frame</i> is popped, and the exception
136 propagates to <i>frame</i>'s caller.
137
138 When an exception's propagation causes control to enter a `finally`
139 block, the exception is temporarily set aside. If the `finally` block
140 finishes normally, the exception resumes propagation, and the debugger's
141 `onExceptionUnwind` handler is called again, in the same frame. (The
142 other possibility is for the `finally` block to exit due to a `return`,
143 `continue`, or `break` statement, or a new exception. In those cases the
144 old exception does not continue to propagate; it is discarded.)
145
146 <code>sourceHandler(<i>ASuffusionOfYellow</i>)</code>
147 : This method is never called. If it is ever called, a contradiction has
148 been proven, and the debugger is free to assume that everything is true.
149
150 <code>onError(<i>frame</i>, <i>report</i>)</code>
151 : SpiderMonkey is about to report an error in <i>frame</i>. <i>Report</i>
152 is an object describing the error, with the following properties:
153
154 `message`
155 : The fully formatted error message.
156
157 `file`
158 : If present, the source file name, URL, etc. (If this property is
159 present, the <i>line</i> property will be too, and vice versa.)
160
161 `line`
162 : If present, the source line number at which the error occurred.
163
164 `lineText`
165 : If present, this is the source code of the offending line.
166
167 `offset`
168 : The index of the character within lineText at which the error occurred.
169
170 `warning`
171 : Present and true if this is a warning; absent otherwise.
172
173 `strict`
174 : Present and true if this error or warning is due to the strict option
175 (not to be confused with ES strict mode)
176
177 `exception`
178 : Present and true if an exception will be thrown; absent otherwise.
179
180 `arguments`
181 : An array of strings, representing the arguments substituted into the
182 error message.
183
184 This method's return value is ignored.
185
186 `onNewGlobalObject(global)`
187 : A new global object, <i>global</i>, has been created. The application
188 embedding the JavaScript implementation may provide details about what
189 kind of global it is via <code><i>global</i>.hostAnnotations</code>.
190
191 This handler method should return a [resumption value][rv] specifying how
192 the debuggee's execution should proceed. However, note that a <code>{ return:
193 <i>value</i> }</code> resumption value is treated like `undefined` ("continue
194 normally"); <i>value</i> is ignored. (Allowing the handler to substitute
195 its own value for the new global object doesn't seem useful.)
196
197 This handler method is only available to debuggers running in privileged
198 code ("chrome", in Firefox). Most functions provided by this `Debugger`
199 API observe activity in only those globals that are reachable by the
200 API's user, thus imposing capability-based restrictions on a
201 `Debugger`'s reach. However, the `onNewGlobalObject` method allows the
202 API user to monitor all global object creation that occurs anywhere
203 within the JavaScript system (the "JSRuntime", in SpiderMonkey terms),
204 thereby escaping the capability-based limits. For this reason,
205 `onNewGlobalObject` is only available to privileged code.
206
207
208
209 ## Function Properties of the Debugger Prototype Object
210
211 The functions described below may only be called with a `this` value
212 referring to a `Debugger` instance; they may not be used as methods of
213 other kinds of objects.
214
215 <code id="addDebuggee">addDebuggee(<i>global</i>)</code>
216 : Add the global object designated by <i>global</i> to the set of global
217 objects this `Debugger` instance is debugging. If the designated global
218 is already a debuggee, this has no effect. Return this `Debugger`'s
219 [`Debugger.Object`][object] instance referring to the designated global.
220
221 The value <i>global</i> may be any of the following:
222
223 * A global object.
224
225 * An HTML5 `WindowProxy` object (an "outer window", in Firefox
226 terminology), which is treated as if the `Window` object of the
227 browsing context's active document (the "inner window") were passed.
228
229 * A cross-compartment wrapper of an object; we apply the prior rules to
230 the wrapped object.
231
232 * A [`Debugger.Object`][object] instance belonging to this `Debugger` instance;
233 we apply the prior rules to the referent.
234
235 * Any other sort of value is treated as a `TypeError`. (Note that each
236 rule is only applied once in the process of resolving a given
237 <i>global</i> argument. Thus, for example, a [`Debugger.Object`][object]
238 referring to a second [`Debugger.Object`][object] which refers to a global does
239 not designate that global for the purposes of this function.)
240
241 The global designated by <i>global</i> must be in a different
242 compartment than this `Debugger` instance itself. If adding the
243 designated global's compartment would create a cycle of debugger and
244 debuggee compartments, this method throws an error.
245
246 This method returns the [`Debugger.Object`][object] instance whose referent is
247 the designated global object.
248
249 The `Debugger` instance does not hold a strong reference to its
250 debuggee globals: if a debuggee global is not otherwise reachable, then
251 it is dropped from the `Debugger`'s set of debuggees. (Naturally, the
252 [`Debugger.Object`][object] instance this method returns does hold a strong
253 reference to the added global.)
254
255 <code>removeDebuggee(<i>global</i>)</code>
256 : Remove the global object designated by <i>global</i> from this
257 `Debugger` instance's set of debuggees. Return `undefined`.
258
259 This method interprets <i>global</i> using the same rules that
260 [`addDebuggee`][add] does.
261
262 <code>hasDebuggee(<i>global</i>)</code>
263 : Return `true` if the global object designated by <i>global</i> is a
264 debuggee of this `Debugger` instance.
265
266 This method interprets <i>global</i> using the same rules that
267 [`addDebuggee`][add] does.
268
269 `getDebuggees()`
270 : Return an array of distinct [`Debugger.Object`][object] instances whose referents
271 are all the global objects this `Debugger` instance is debugging.
272
273 Since `Debugger` instances don't hold strong references to their
274 debuggee globals, if a debuggee global is otherwise unreachable, it may
275 be dropped at any moment from the array this method returns.
276
277 `getNewestFrame()`
278 : Return a [`Debugger.Frame`][frame] instance referring to the youngest
279 [visible frame][vf] currently on the calling thread's stack, or `null`
280 if there are no visible frames on the stack.
281
282 <code>findSources([<i>query</i>]) <i>(not yet implemented)</i></code>
283 : Return an array of all [`Debugger.Source`][source] instances matching
284 <i>query</i>. Each source appears only once in the array. <i>Query</i>
285 is an object whose properties restrict which sources are returned; a
286 source must meet all the criteria given by <i>query</i> to be returned.
287 If <i>query</i> is omitted, we return all sources of all debuggee
288 scripts.
289
290 <i>Query</i> may have the following properties:
291
292 `url`
293 : The source's `url` property must be equal to this value.
294
295 `global`
296 : The source must have been evaluated in the scope of the given global
297 object. If this property's value is a [`Debugger.Object`][object] instance
298 belonging to this `Debugger` instance, then its referent is used. If the
299 object is not a global object, then the global in whose scope it was
300 allocated is used.
301
302 Note that the result may include sources that can no longer ever be
303 used by the debuggee: say, eval code that has finished running, or
304 source for unreachable functions. Whether such sources appear can be
305 affected by the garbage collector's behavior, so this function's result
306 is not entirely deterministic.
307
308 <code>findScripts([<i>query</i>])</code>
309 : Return an array of [`Debugger.Script`][script] instances for all debuggee scripts
310 matching <i>query</i>. Each instance appears only once in the array.
311 <i>Query</i> is an object whose properties restrict which scripts are
312 returned; a script must meet all the criteria given by <i>query</i> to
313 be returned. If <i>query</i> is omitted, we return the [`Debugger.Script`][script]
314 instances for all debuggee scripts.
315
316 <i>Query</i> may have the following properties:
317
318 `url`
319 : The script's `url` property must be equal to this value.
320
321 `source` <i>(not yet implemented)</i>
322 : The script's `source` property must be equal to this value.
323
324 `line`
325 : The script must at least partially cover the given source line. If this
326 property is present, the `url` property must be present as well.
327
328 `column`
329 : The script must include given column on the line given by the `line`
330 property. If this property is present, the `url` and `line` properties
331 must both be present as well.
332
333 `innermost`
334 : If this property is present and true, the script must be the innermost
335 script covering the given source location; scripts of enclosing code are
336 omitted.
337
338 `global`
339 : The script must be in the scope of the given global object. If this
340 property's value is a [`Debugger.Object`][object] instance belonging to this
341 `Debugger` instance, then its referent is used. If the object is not a
342 global object, then the global in whose scope it was allocated is used.
343
344 All properties of <i>query</i> are optional. Passing an empty object
345 returns all debuggee code scripts.
346
347 Note that the result may include [`Debugger.Script`][script] instances for
348 scripts that can no longer ever be used by the debuggee, say, those for
349 eval code that has finished running, or unreachable functions. Whether
350 such scripts appear can be affected by the garbage collector's
351 behavior, so this function's behavior is not entirely deterministic.
352
353 <code>clearBreakpoint(<i>handler</i>)</code>
354 : Remove all breakpoints set in this `Debugger` instance that use
355 <i>handler</i> as their handler. Note that, if breakpoints using other
356 handler objects are set at the same location(s) as <i>handler</i>, they
357 remain in place.
358
359 `clearAllBreakpoints()`
360 : Remove all breakpoints set using this `Debugger` instance.
361
362 `clearAllWatchpoints()` <i>(future plan)</i>
363 : Clear all watchpoints owned by this `Debugger` instance.
364
365 `findAllGlobals()`
366 : Return an array of [`Debugger.Object`][object] instances referring to all the
367 global objects present in this JavaScript instance. The application may
368 provide details about what kind of globals they are via the
369 [`Debugger.Object`][object] instances' `hostAnnotations` accessors.
370
371 The results of this call can be affected in non-deterministic ways by
372 the details of the JavaScript implementation. The array may include
373 [`Debugger.Object`][object] instances referring to global objects that are not
374 actually reachable by the debuggee or any other code in the system.
375 (Naturally, once the function has returned, the array's
376 [`Debugger.Object`][object] instances strongly reference the globals they refer
377 to.)
378
379 This handler method is only available to debuggers running in privileged
380 code ("chrome", in Firefox). Most functions provided by this `Debugger`
381 API observe activity in only those globals that are reachable by the
382 API's user, thus imposing capability-based restrictions on a
383 `Debugger`'s reach. However, `findAllGlobals` allows the API user to
384 find all global objects anywhere within the JavaScript system (the
385 "JSRuntime", in SpiderMonkey terms), thereby escaping the
386 capability-based limits. For this reason, `findAllGlobals` is only
387 available to privileged code.
388
389 <code>makeGlobalObjectReference(<i>global</i>)</code>
390 : Return the [`Debugger.Object`][object] whose referent is the global object
391 designated by <i>global</i>, without adding the designated global as a
392 debuggee. If <i>global</i> does not designate a global object, throw a
393 `TypeError`. Determine which global is designated by <i>global</i>
394 using the same rules as [`Debugger.prototype.addDebuggee`][add].
395

mercurial