DevTools/Features/Debugger: Difference between revisions

no edit summary
No edit summary
 
(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]]
canmove, Confirmed users, Bureaucrats and Sysops emeriti
1,093

edits