DevTools/Features/Debugger: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
(Lexical Environment notes)
No edit summary
 
(126 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.


=== Protocol Transports ===
{| class="fullwidth-table"
* 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.
| style="font-weight: bold; background: #DDD;" | Description
* Need to figure out transport between chrome/content for e10s (See inter-process dispatch, below).
| style="font-weight: bold; background: #DDD;" | Area
* WebSockets (not needed for an initial implementation).
| 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 Handler Thread ===
=== Property Viewer ===
* 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 ===
* A simple property viewer, limited to viewing frame arguments for now.
* Including maintenance of the actor tree.


=== Client API ===
{| class="fullwidth-table"
* With appropriate client-side transport support.
|-
| 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.
|}


=== Debugging compartments ===
=== Source Viewer ===
* The debugger must be in a separate compartment from the debuggee, some sort of sandbox/new global-and-compartment for hosting a given thread's debugging actors.
* 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.


== Browser Protocol Integration ==
=== Execution ===
* 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


Firefox-specific integration of the remote protocol.
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


=== Root Actor ===
=== Frame Tree Support ===
=== Content Tab Contexts ===
* Debug.prototype.{add,remove}Debuggee() - jorendorff
* Will need to maintain a list of compartments needing debugging for the document tree loaded in the tab.
* Frame tree support in the tab actors.
* 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 ===
=== Environment/Property Viewer ===
* For debugging firefox.


=== WebWorker/ChromeWorker ===
* JSD2 support
* 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?
** Debug.Frame.prototype.environment - jorendorff
** Debug.Environment.prototype.{type,outerEnvironment,object, boundIdentifiers,getVariableDescriptor,findBinding} - jorendorff


== Stack Traces ==
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.
=== JSD2 support ===
* [[Debug_Object#Debug.Frame]]
* Mostly (?) implemented in jsdbg2 branch.


=== Remote Protocol Support ===
=== Source Selector ===
* [[Remote_Debugging_Protocol#Listing_Stack_Frames]]
* Incomplete.


=== UI Notes: Other Debuggers ===
* JSD2 support
** newScript hook
** 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.


* Firebug
* UI support:  dropdown of available scripts, triggering loads in the source viewer.
** 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
=== Breakpoints ===
** Stack frame shows function name/source/line
** Scope variables/environment in a different pane (see Environments)
** Selecting stack frame moves source view


=== UI Plan ===
* JSD2 support.
* Protocol-side breakpoints will set physical breakpoints at each script (including newly-added scripts)
* Need to work out breakpoint persistence across reloads (needs to be done early enough to catch scripts run during the load).
* Set breakpoints in the source gutter
* Set breakpoints from a command line (?)
* Disable/Enable/Delete breakpoints


=== More Milestones ===


== Lexical Environments ==
In no particular order...
=== JSD2 ===
* https://wiki.mozilla.org/Debug_Object#Debug.Environment
* Incomplete?


=== Remote Protocol Support ===
* Web Worker debugging (might not be needed for an initial release, but would be really nice)
* https://wiki.mozilla.org/Remote_Debugging_Protocol#Lexical_Environments
* Chrome debugging (probably not be needed for an initial release)
* Incomplete.


=== UI Notes: Other Debuggers ===
=== Floating Tasks ===
* Firebug:
** XXX: I couldn't find where/if firebug exposes lexical scopes.


* Chrome:
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.
** Scope chain exposed as a list, property viewers for each scope.


=== UI Plan ===


{| 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]]

Latest revision as of 13:40, 30 August 2012

Please use "Edit with form" above to edit this page.

Status

Debugger
Stage Complete
Status In progress
Release target Firefox 15
Health OK
Status note `

{{#set:Feature name=Debugger

|Feature stage=Complete |Feature status=In progress |Feature version=Firefox 15 |Feature health=OK |Feature status note=` }}

Team

Product manager Kevin Dangoor
Directly Responsible Individual Rob Campbell
Lead engineer Panos Astithas
Security lead Mark Goodwin
Privacy lead `
Localization lead `
Accessibility lead `
QA lead Ioana Budnar
UX lead Stephen Horlander
Product marketing lead `
Operations lead `
Additional members Jason Orendorff, Jim Blandy, Victor Porof, Mihai Sucan

{{#set:Feature product manager=Kevin Dangoor

|Feature feature manager=Rob Campbell |Feature lead engineer=Panos Astithas |Feature security lead=Mark Goodwin |Feature privacy lead=` |Feature localization lead=` |Feature accessibility lead=` |Feature qa lead=Ioana Budnar |Feature ux lead=Stephen Horlander |Feature product marketing lead=` |Feature operations lead=` |Feature additional members=Jason Orendorff, Jim Blandy, Victor Porof, Mihai Sucan }}

Open issues/risks

`

Stage 1: Definition

1. Feature overview

New JavaScript debugger.

2. Users & use cases

JavaScript developers

3. Dependencies

`

4. Requirements

`

Non-goals

`

Stage 2: Design

5. Functional specification

`

6. User experience design

`

Stage 3: Planning

7. Implementation plan

`

8. Reviews

Security review

`

Privacy review

`

Localization review

`

Accessibility

`

Quality Assurance review

`

Operations review

`

Stage 4: Development

9. Implementation

`

Stage 5: Release

10. Landing criteria

` {{#set:Feature open issues and risks=` |Feature overview=New JavaScript debugger. |Feature users and use cases=JavaScript developers |Feature dependencies=` |Feature requirements=` |Feature non-goals=` |Feature functional spec=` |Feature ux design=` |Feature implementation plan=` |Feature security review=` |Feature privacy review=` |Feature localization review=` |Feature accessibility review=` |Feature qa review=` |Feature operations review=` |Feature implementation notes=` |Feature landing criteria=` }}

Feature details

Priority P1
Rank 6
Theme / Goal `
Roadmap Developer Tools
Secondary roadmap `
Feature list Desktop
Project `
Engineering team DevTools

{{#set:Feature priority=P1

|Feature rank=6 |Feature theme=` |Feature roadmap=Developer Tools |Feature secondary roadmap=` |Feature list=Desktop |Feature project=` |Feature engineering team=DevTools }}

Team status notes

  status notes
Products ` `
Engineering ` `
Security sec-review-complete Notes
Privacy ` `
Localization ` `
Accessibility ` `
Quality assurance work in progress Test Plan
User experience ` `
Product marketing ` `
Operations ` `

{{#set:Feature products status=`

|Feature products notes=` |Feature engineering status=` |Feature engineering notes=` |Feature security status=sec-review-complete |Feature security health=OK |Feature security notes=Notes |Feature privacy status=` |Feature privacy notes=` |Feature localization status=` |Feature localization notes=` |Feature accessibility status=` |Feature accessibility notes=` |Feature qa status=work in progress |Feature qa notes=Test Plan |Feature ux status=` |Feature ux notes=` |Feature product marketing status=` |Feature product marketing notes=` |Feature operations status=` |Feature operations notes=` }}


Designs

Planning

What follows is some plan-related sketching, please update appropriately. List of milestones/sprints is roughly in order.

Bootstrapping/Stack Traces

  • 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.
Description Area Bug Owner Best Likely Worst 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

Property Viewer

  • A simple property viewer, limited to viewing frame arguments for now.
Description Area Bug Owner Best Likely Worst 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.

Source Viewer

  • 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.

Execution

  • 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

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

Frame Tree Support

  • Debug.prototype.{add,remove}Debuggee() - jorendorff
  • Frame tree support in the tab actors.

Environment/Property Viewer

  • JSD2 support
    • Debug.Frame.prototype.environment - jorendorff
    • Debug.Environment.prototype.{type,outerEnvironment,object, boundIdentifiers,getVariableDescriptor,findBinding} - jorendorff

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.

Source Selector

  • JSD2 support
    • newScript hook
    • 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.
  • UI support: dropdown of available scripts, triggering loads in the source viewer.

Breakpoints

  • JSD2 support.
  • Protocol-side breakpoints will set physical breakpoints at each script (including newly-added scripts)
  • Need to work out breakpoint persistence across reloads (needs to be done early enough to catch scripts run during the load).
  • Set breakpoints in the source gutter
  • Set breakpoints from a command line (?)
  • Disable/Enable/Delete breakpoints

More Milestones

In no particular order...

  • Web Worker debugging (might not be needed for an initial release, but would be really nice)
  • Chrome debugging (probably not be needed for an initial release)

Floating Tasks

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.


Description Area Bug Owner Best Likely Worst 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