|
|
(110 intermediate revisions by 9 users not shown) |
Line 1: |
Line 1: |
| {| class="fullwidth-table" | | {{FeatureStatus |
| |- | | |Feature name=Debugger |
| | style="font-weight: bold; background: #DDD;" | Feature | | |Feature stage=Complete |
| | style="font-weight: bold; background: #DDD;" | Status | | |Feature status=In progress |
| | style="font-weight: bold; background: #DDD;" | ETA | | |Feature version=Firefox 15 |
| | style="font-weight: bold; background: #DDD;" | Owner | | |Feature health=OK |
| |- | | }} |
| <section begin="status" />
| | {{FeatureTeam |
| | [[DevTools/Features/Debugger]] | | |Feature product manager=Kevin Dangoor |
| | {{StatusHealthy|status=planning}} | | |Feature feature manager=Rob Campbell |
| | YYYY-MM-DD | | |Feature lead engineer=Panos Astithas |
| | Kevin Dangoor | | |Feature security lead=Mark Goodwin |
| <section end="status" />
| | |Feature qa lead=Ioana Budnar |
| |-
| | |Feature ux lead=Stephen Horlander |
| |}
| | |Feature additional members=Jason Orendorff, Jim Blandy, Victor Porof, Mihai Sucan |
| | | }} |
| == Summary == | | {{FeaturePageBody |
| | | |Feature overview=New JavaScript debugger. |
| Initial take on an integrated JavaScript debugger for Firefox.
| | |Feature users and use cases=JavaScript developers |
| | | }} |
| == Team ==
| | {{FeatureInfo |
| | | |Feature priority=P1 |
| Have some thoughts on what you want out of a debugger? Inspiration on how to do it? Join us on #devtools on irc.mozilla.org
| | |Feature rank=6 |
| | | |Feature roadmap=Developer Tools |
| | | |Feature list=Desktop |
| * '''Feature Manager''': Kevin Dangoor (irc: kdangoor)
| | |Feature engineering team=DevTools |
| * '''Lead Developer''': Dave Camp (irc: dcamp)
| | }} |
| * '''Product Manager''': Kevin Dangoor (irc: kdangoor)
| | {{FeatureTeamStatus |
| * '''QA''': TBD
| | |Feature security status=sec-review-complete |
| * '''UX''': TBD
| | |Feature security health=OK |
| * '''Security''': TBD
| | |Feature security notes=[[Security/Reviews/Firefox/RemoteDebug|Notes]] |
| | | |Feature qa status=work in progress |
| | | |Feature qa notes=[https://wiki.mozilla.org/index.php?title=DevTools/Features/Debugger/TestPlan Test Plan] |
| == Release Requirements == | | }} |
| | |
| TBD
| |
| | |
| == Next Steps ==
| |
| | |
| * scope out the project
| |
| | |
| == Related Bugs & Dependencies ==
| |
| | |
| See the [http://mozilla.github.com/devtools/2011/status.html#debugger status page] for the bug list and current status.
| |
| | |
| == Designs == | | == Designs == |
| | | * [[JSInspector]] |
| TBD
| | * [[Remote_Debugging_Protocol]] |
| | * [[DevTools/Features/Debugger/Notes]] has further implementation notes. |
|
| |
|
| == Planning == | | == Planning == |
|
| |
|
| What follows is some plan-related sketching, please update appropriately. | | What follows is some plan-related sketching, please update appropriately. List of milestones/sprints is roughly in order. |
|
| |
|
| == Basic Protocol Support == | | === Bootstrapping/Stack Traces === |
|
| |
|
| Basic implementation of the [[Remote Debugging Protocol]].
| | * Working remote protocol, exposing stack frames with JSD2. |
| | * Relying on debugger statement, no breakpoints. |
| | * Only "continue" after stopping in debugger. |
| | * UI shell in firefox |
| | * UI for stack traces (without arguments) |
| | * No iframe support just yet. |
|
| |
|
| None of this is implemented yet.
| | {| class="fullwidth-table" |
| | |- |
| | | style="font-weight: bold; background: #DDD;" | Description |
| | | style="font-weight: bold; background: #DDD;" | Area |
| | | style="font-weight: bold; background: #DDD;" | Bug |
| | | style="font-weight: bold; background: #DDD;" | Owner |
| | | style="font-weight: bold; background: #DDD;" | Best |
| | | style="font-weight: bold; background: #DDD;" | Likely |
| | | style="font-weight: bold; background: #DDD;" | Worst |
| | | style="font-weight: bold; background: #DDD;" | Status |
| | |- |
| | | Debugging global/Root actor registration/Socket Listener |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | 2d |
| | | 3d |
| | | 5d |
| | | In remote-debug. |
| | |- |
| | | Browser root actor/tab actors (not as thread-like actors) |
| | | Browser Proto |
| | | |
| | | dcamp |
| | | 2d |
| | | 2d |
| | | 4d |
| | | In remote-debug. |
| | |- |
| | | Protocol handler thread (socket transport) |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | ? |
| | | ? |
| | | ? |
| | | Put off for now. |
| | |- |
| | | Debug Object creation and debuggerHook |
| | | JSD2 |
| | | |
| | | jorendorff |
| | | 1d |
| | | 1d |
| | | 2d |
| | | In jsdb2 |
| | |- |
| | | Debug Object loader |
| | | JSD2ish |
| | | |
| | | dcamp |
| | | |
| | | |
| | | |
| | | In remote-debug |
| | |- |
| | | Debug Object support for frame inspection |
| | | JSD2 |
| | | |
| | | jorendorff |
| | | |
| | | |
| | | |
| | | type, this, older, live, callee, generator, arguments complete. |
| | |- |
| | | Debug Object support for the toplevel globals in tab actor - debuggerHook spawning a nested event loop. |
| | | Browser Proto |
| | | |
| | | dcamp |
| | | 2d |
| | | 2d |
| | | 4d |
| | | In remote-debug |
| | |- |
| | | New execution model specification in the remote protocol |
| | | Remote Proto |
| | | |
| | | jimb |
| | | |
| | | |
| | | |
| | | Complete |
| | |- |
| | | debuggerHook and "continue" exposed over remote protocol as specified. |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | 3d |
| | | 3d |
| | | 5d |
| | | In remote-debug. |
| | |- |
| | | Client JS API (socket transport) |
| | | UI Shell |
| | | |
| | | dcamp |
| | | 1d |
| | | 2d |
| | | 3d |
| | | In remote-debug. |
| | |- |
| | | HTML UI shell per tab, in its own window |
| | | UI Shell |
| | | |
| | | dcamp |
| | | 2d |
| | | 2d |
| | | 5d |
| | | In remote-debug |
| | |- |
| | | UI responding to pauses (from debugger keyword) |
| | | Execution Handling |
| | | |
| | | dcamp |
| | | 2d |
| | | 2d |
| | | 4d |
| | | In remote-debug |
| | |- |
| | | HTML Stack frame viewer (no locals/environment yet, just |
| | | Execution Handling |
| | | |
| | | dcamp |
| | | 2d |
| | | 3d |
| | | 5d |
| | | In patch queue |
| | |} |
|
| |
|
| === Protocol Transports === | | === Property Viewer === |
| * Simple TCP socket protocol - Needed for remote debugging.
| |
| * Shouldn't need sockets for in-process debugging, can probably just post events directly to/from the handler thread.
| |
| * Need to figure out transport between chrome/content for e10s (See inter-process dispatch, below).
| |
| ** Content processes will need their own root actor that can enumerate/dispatch to tabs hosted in their process.
| |
| ** Presumably needs to use different APIs to list active tabs than we use in the chrome process (needs investigation).
| |
| ** Ask content processes to start up debugging host (chrome process will have UI cues, will probably just forward those to content processes over messageManager).
| |
| * WebSockets (not needed for an initial implementation).
| |
| * How do we represent the actor tree across multiple connections
| |
| ** Each connection is going to get its own debugger global/compartment in each thread.
| |
|
| |
|
| === Protocol Handler Thread ===
| | * A simple property viewer, limited to viewing frame arguments for now. |
| * Handles incoming protocol requests on a thread, needed to interrupt running script on other threads. | |
| * Will handle transport IO as needed (for socket/websocket/etc transports).
| |
| * Handle inter-thread dispatching
| |
| ** Dispatching incoming protocol messages to actors on the proper thread.
| |
| ** An actor's parent or child might be on a different thread (for example when a browser tab actor might have a WebWorker actor as a child). Releasing a parent actor needs to release children, including on the other threads.
| |
| * Handle inter-process dispatching
| |
| ** Similar issues to inter-thread dispatch, but communicating to content processes using the debugging protocol.
| |
|
| |
|
| === Actor registration API === | | {| class="fullwidth-table" |
| * Including maintenance of the actor tree.
| | |- |
| | | style="font-weight: bold; background: #DDD;" | Description |
| | | style="font-weight: bold; background: #DDD;" | Area |
| | | style="font-weight: bold; background: #DDD;" | Bug |
| | | style="font-weight: bold; background: #DDD;" | Owner |
| | | style="font-weight: bold; background: #DDD;" | Best |
| | | style="font-weight: bold; background: #DDD;" | Likely |
| | | style="font-weight: bold; background: #DDD;" | Worst |
| | | style="font-weight: bold; background: #DDD;" | Status |
| | |- |
| | | Debug.Object.prototype.{proto, class, isFunction, name, getOwnPropertyDescriptor, getOwnPropertyNames} |
| | | JSD2 |
| | | |
| | | jorendorff/jimb |
| | | |
| | | |
| | | |
| | | |
| | |- |
| | | Primitive data grips for frame arguments |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | 1d |
| | | 1d |
| | | 2d |
| | | In remote-debug |
| | |- |
| | | Pause-lifetime object grips |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | 1d |
| | | 1d |
| | | 2d |
| | | In remote-debug |
| | |- |
| | | Thread-lifetime grip promotion |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | 1d |
| | | 2d |
| | | 4d |
| | | In remote-debug |
| | |- |
| | | Object grip enumeration |
| | | Remote Proto |
| | | |
| | | dcamp |
| | | 1d |
| | | 2d |
| | | 4d |
| | | Waiting on jsd2 |
| | |- |
| | | Property UI design |
| | | UI |
| | | |
| | | past/dcamp |
| | | 1d |
| | | 1d |
| | | 2d |
| | | |
| | |- |
| | | Property Inspector UI |
| | | UI |
| | | |
| | | past |
| | | ? |
| | | ? |
| | | ? |
| | | Split up as needed. |
| | |} |
|
| |
|
| === Client API === | | === Source Viewer === |
| * With appropriate client-side transport support. | | * Enough to visualize current line/stack frames/etc. |
| | ** Debug.Script.prototype.{url,startLine,length,getAllOffsets,getLineOffsets,getOffsetLine} - jorendorff |
| | ** Debug.Frame.prototype.{callee,script,offset} - jorendorff |
| | * No source list yet, will only reflect sources handed to it in pause states. |
| | * Can use normal view source/firebug method (loading from necko preferring the cache) for getting static script sources (in-document <script> etc). |
| | * Needs the engine to provide sources for exotic script sources (eval/appendNode/etc.) |
| | * Very simple source viewer, improving the source viewer can happen outside the critical path. |
|
| |
|
| === Debugging compartments === | | === Execution === |
| * The debugger must be in a separate compartment from the debuggee, some sort of sandbox/new global-and-compartment for hosting a given connection's debugging actors on a thread. | | * throw hook (Debug.hooks.throw) - jorendorff - Done. |
| | * error hook (Debug.hooks.error) - jorendorff |
| | * resume (resumption values) - jorendorff - Done. |
| | * work out low-level stepping support with the JM team - jorendorff/jimb |
| | * implement Debug object stepping support (Debug.hooks.interrupt, Debug.Script.prototype.singleStepMode, etc.) - jorendorff |
| | * step into/step out/finish - dcamp |
|
| |
|
| == Browser Protocol Integration ==
| | In this timeframe, we also want to be able to: |
| | * Show native calls on the stack - jorendorff, luke |
| | * Show debugger frames on the stack - jorendorff |
|
| |
|
| Firefox-specific integration of the remote protocol.
| | === Frame Tree Support === |
| | * Debug.prototype.{add,remove}Debuggee() - jorendorff |
| | * Frame tree support in the tab actors. |
|
| |
|
| === Root Actor === | | === Environment/Property Viewer === |
| === Content Tab Contexts ===
| |
| * Will need to maintain a list of compartments needing debugging for the document tree loaded in the tab.
| |
| * Manage lifetimes and notifications related to navigation.
| |
| * Tabs exposed as a thread-like actor (or maybe with an immediate child for the main thread running in that tab?)
| |
|
| |
|
| === Chrome Context ===
| | * JSD2 support |
| * For debugging firefox. | | ** Debug.Frame.prototype.environment - jorendorff |
| | ** Debug.Environment.prototype.{type,outerEnvironment,object, boundIdentifiers,getVariableDescriptor,findBinding} - jorendorff |
|
| |
|
| === WebWorker/ChromeWorker ===
| | By the time this milestone is complete, we'll have a somewhat competent debugger if you're willing to use debugger; statements instead of breakpoints. |
| * Related to inter-thread dispatch above. Likely to require some platform work on webworkers to get them to load the debug protocol implementation on startup?
| |
|
| |
|
| == UI Shell == | | === Source Selector === |
|
| |
|
| * For basic debugging, want a single debugger UI per tab | | * JSD2 support |
| ** Docked | | ** newScript hook |
| ** Separate Window | | ** enumerate scripts? Maybe not - since we need currently need to reload anyway to recompile scripts for debugging, might be ok to always just watch the newScript hook. |
| | * Protocol support |
| | ** new script notification. |
|
| |
|
| * Unconnected debugging shell for connecting to remote debugging targets | | * UI support: dropdown of available scripts, triggering loads in the source viewer. |
| ** Always separate window.
| |
|
| |
|
| * Shell for debugging chrome.
| | === Breakpoints === |
|
| |
|
| * Until we get some spidermonkey improvements, we're going to need a reload to debug correctly | | * JSD2 support. |
| ** XXX jimb/jorendorff: please review this claim. | | * Protocol-side breakpoints will set physical breakpoints at each script (including newly-added scripts) |
| ** Ability to recompile scripts with debug support. | | * Need to work out breakpoint persistence across reloads (needs to be done early enough to catch scripts run during the load). |
| ** Firebug currently needs to observe creation to infer information (see elsewhere about script information) | | * Set breakpoints in the source gutter |
| ** Debugger UI per tab, either docked or separate window | | * Set breakpoints from a command line (?) |
| | * Disable/Enable/Delete breakpoints |
|
| |
|
| * Connection management.
| | === More Milestones === |
|
| |
|
| == Stack Traces ==
| | In no particular order... |
| === JSD2 support ===
| |
| * [[Debug_Object#Debug.Frame]]
| |
| * Mostly (?) implemented in jsdbg2 branch.
| |
|
| |
|
| === Remote Protocol Support ===
| | * Web Worker debugging (might not be needed for an initial release, but would be really nice) |
| * [[Remote_Debugging_Protocol#Listing_Stack_Frames]] | | * Chrome debugging (probably not be needed for an initial release) |
| * Not implemented. | |
|
| |
|
| === UI === | | === Floating Tasks === |
|
| |
|
| * Not implemented.
| | Here are a few tasks that I haven't slotted into any specific milestone, and could be tackled separately alongside the other milestones. At least some of these would block a final release of a capable debugger. |
|
| |
|
| === UI Notes: Other Debuggers ===
| |
|
| |
| Firebug
| |
| * Stack frame shows function name/source/line num, args
| |
| * Expand frames to view function args
| |
| * Selecting stack frame moves source view
| |
| * Right-clicking stack frames allowed viewing properties of function objects in the DOM tab.
| |
| * Breadcrumb view of the stack in the source view.
| |
|
| |
| Chrome
| |
| * Stack frame shows function name/source/line
| |
| * Scope variables/environment in a different pane (see Environments)
| |
| * Selecting stack frame moves source view
| |
|
| |
| == Lexical Environments ==
| |
| === JSD2 ===
| |
|
| |
| * [[Debug_Object#Debug.Environment]]
| |
| * Not implemented.
| |
|
| |
| === Remote Protocol Support ===
| |
| * [[Remote_Debugging_Protocol#Lexical_Environments]]
| |
| * Not implemented.
| |
|
| |
| === UI ===
| |
|
| |
| * Not implemented.
| |
|
| |
| === UI Notes: Other Debuggers ===
| |
| Firebug:
| |
| * XXX: I couldn't find where/if firebug exposes lexical scopes.
| |
|
| |
| Chrome:
| |
| * Scope chain exposed as a list, property viewers for each scope.
| |
|
| |
| == Execution Control ==
| |
|
| |
| === JSD2 ===
| |
| * [[Debug_Object#Resumption_Values]]
| |
| * [[Debug_Object#Debug.Script]] (specifically "singleStepMode")
| |
| * Not implemented?
| |
|
| |
| === Remote Protocol Support ===
| |
| * [[Remote_Debugging_Protocol#Interacting_with_Thread-Like_Actors]]
| |
| * jimb mentioned on irc being unhappy with the pause/resume protocol, may need another spec iteration.
| |
| * Not implemented.
| |
|
| |
| === Implementation Notes ===
| |
|
| |
| (this is a mess, ignore for now).
| |
|
| |
| Pause Reasons:
| |
| * stepped
| |
| * pre-call
| |
| * pre-return
| |
| * pre-eval?
| |
|
| |
| Breaking on exception:
| |
| * pre-throw/caught/uncaught
| |
|
| |
| === UI ===
| |
| Not implemented.
| |
|
| |
| === UI Notes ===
| |
|
| |
| Chrome
| |
| * Allows toggling of throw/caught/uncaught pause reasons during execution.
| |
| * Pause/Continue/Step Over/Step Into/Step Out (finish)
| |
|
| |
| Firebug
| |
| * Has Rerun/Continue/Step Into/Step Over/Step Out (finish)
| |
| * Calls pause Break-on-next (makes a bit more sense when spinning the event loop, and it can't actually pause?).
| |
|
| |
| == Breakpoints ==
| |
|
| |
| === JSD2 ===
| |
| * [[Debug_Object#The_Debug_Object]]
| |
| * setBreakpoint/clearBreakpoint/clearAllBreakpoints
| |
| * Not implemented.
| |
|
| |
| === Protocol Support ===
| |
| * [[Remote_Debugging_Protocol#Breakpoints]]
| |
| * Not implemented.
| |
| * Looks like the protocol implementation will need to refcount breakpoints on the debug object (which has one-breakpoint-per-line) to support multiple breakpoints on a given line (potentially with different conditions).
| |
| * The protocol will also aggregate breakpoints on multiple scripts (for example, if the same script is loaded twice, there might be two scripts covering the same source location) for a given breakpoint actor.
| |
| * Protocol should be extended with breakpoint conditions?
| |
|
| |
| === UI ===
| |
| Not implemented.
| |
|
| |
| === UI Notes ===
| |
| XXX
| |
|
| |
| == Watchpoints ==
| |
|
| |
| No thoughts yet.
| |
|
| |
| == Source List ==
| |
|
| |
| https://bugzilla.mozilla.org/show_bug.cgi?id=637572
| |
| * This bug is important for proper handling of eval/event handlers/etc. Important early on, script loaders are common practice.
| |
| * Need to resource fixing this bug asap.
| |
|
| |
| Firebug does a lot a crazy stuff to get scripts right for all origins (inline, eval, document.write, dom-appended script tags, etc). We'd prefer to avoid this with 637572, and we might be weaker than firebug with the more exotic sources in the meantime. XXX: Need to figure out exactly how much weaker.
| |
|
| |
| Script sources:
| |
|
| |
| * Static/inline scripts
| |
| ** Pretty well-understood
| |
| * Eval
| |
| * Event handlers
| |
| * document.write script tags
| |
| ** Can mess with line numbers.
| |
| * DOM injection of script tags/innerHTML
| |
|
| |
| === JSD2 support ===
| |
|
| |
| * [[Debug_Object#Debug.Script]]
| |
| * [[Debug_Object#Debugging_hooks]] - newScript, specifically.
| |
| * Not implemented.
| |
|
| |
| === Protocol Support ===
| |
|
| |
| * [[Debug_Object#Debugging_hooks]]
| |
| * Not implemented.
| |
|
| |
| === UI ===
| |
| === UI Notes ===
| |
|
| |
| Chrome:
| |
| * Eval's show up in the source list as "(program)"
| |
| * Static sources are listed by basename (no disambiguation).
| |
| * Maintains a back-forward list for the source viewer.
| |
|
| |
| Firebug:
| |
| * Shows evals
| |
| ** Given a name based on parent url (foo.html/eval/seq/1)
| |
| * Event handlers
| |
| ** Don't seem to show up unless you actually cause execution to stop in them (afaict)?
| |
| ** Given a name based on its parent url (foo.html/event/seq/1)
| |
| * Static source listed by basename with path headers for disambiguation.
| |
| * Maintains back-forward list for the source viewer.
| |
|
| |
| == Source Viewer ==
| |
|
| |
| === JSD2 Support ===
| |
| * Would be nice to have originalSource support in spidermonkey/JSD2, but none is currently specced/planned.
| |
|
| |
| === Protocol Support ===
| |
| * In the meantime, we can do protocol-side with necko (like firebug does currently).
| |
| * For the in-process content case, might want shortcut using the protocol.
| |
| * This needs spec thought.
| |
|
| |
| === UI ===
| |
|
| |
| === UI Notes ===
| |
| Chrome:
| |
| * Line numbers/breakpoints/current line in gutter.
| |
| * Syntax highlighting
| |
| * Left-click in gutter sets/unsets breakpoint
| |
| * Right-click in gutter brings up a context menu with:
| |
| ** Continue to here
| |
| ** Add/Remove Breakpoint
| |
| ** Add Conditional Breakpoint
| |
| ** Disable Breakpoint
| |
|
| |
| Firebug:
| |
| * Line numbers/breakpoints/current line in gutter.
| |
| * Line numbers seem to be colored by executability.
| |
| * No syntax highlighting
| |
| * Left-click in gutter sets/unsets breakpoint.
| |
| * Right-click in gutter sets conditional breakpoint.
| |
|
| |
|
| | {| class="fullwidth-table" |
| | |- |
| | | style="font-weight: bold; background: #DDD;" | Description |
| | | style="font-weight: bold; background: #DDD;" | Area |
| | | style="font-weight: bold; background: #DDD;" | Bug |
| | | style="font-weight: bold; background: #DDD;" | Owner |
| | | style="font-weight: bold; background: #DDD;" | Best |
| | | style="font-weight: bold; background: #DDD;" | Likely |
| | | style="font-weight: bold; background: #DDD;" | Worst |
| | | style="font-weight: bold; background: #DDD;" | Status |
| | |- |
| | | E10S content process support |
| | | Remote Proto |
| | | |
| | | dcamp? |
| | | 1w |
| | | 3w |
| | | 2w |
| | | |
| | |- |
| | | Improved script origin information |
| | | JSD2 |
| | | {{bug|637572}} |
| | | jimb |
| | | |
| | | |
| | | |
| | | |
| | |- |
| | | Waive slow script dialog (jorendorff was seeing them after resuming) |
| | | JSD2 |
| | | |
| | | |
| | | |
| | | |
| | | |
| | |- |
| | | Improve source viewer (after basic source viewer is added) |
| | | Firefox UI |
| | | |
| | | No Owner |
| | | |
| | | |
| | | |
| | | |
| | |} |
| __NOTOC__ | | __NOTOC__ |
|
| |
| [[Category:Features]]
| |
| [[Category:Firefox]]
| |