mozilla

比较版本

Venkman精髓

更改版本

修订版 255375:

由 Andyyard 在 进行的修订 255375

修订版 227397:

由 Andyyard 在 进行的修订 227397

标题:
Venkman精髓
Venkman精髓
网址缩略名:
Venkman精髓
Venkman精髓
标签:
Venkman, Tools, "Developing Mozilla"
内容:

修订版 255375
修订版 227397
t7    <p>t
8      Start with <a href="cn/Venkman">Venkman</a> Information.
9    </p>
10    <p>
11      Notes on Venkman source code. As with any complex applicati
>on, aspects of the design may not be clear for new readers of the 
> source. These notes are written by such readers: as you learn pl 
>ease correct any errors. 
12    </p>
13    <h3 id="Questions" name="Questions">
14      Questions
15    </h3>
16    <p>
17      <i>Why can't breakpoints be set on some source lines some o
>f the time?</i> 
18    </p>
19    <p>
20      Sometimes the source has small ticks in the margin for ever
>y executable line in my JavaScript. Sometimes these ticks are mis 
>sing on some or all lines of a file. Only lines with tick marks s 
>eem to break point properly. 
21    </p>
22    <dl>
23      <dd>
24        Venkman asks the JS engine which lines are executable. It
> will mark these with a "tick" as you call it. If the file is not 
> currently loaded, the JS engine doesn't know anything about the  
>file. You can still set breakpoints, but they will be future brea 
>kpoints, which will be "real" breakpoints when/if the file is loa 
>ded (note that this may never happen!). Note also that this is ju 
>st my knowledge of Venkman, which is quite limited. You would be  
>better off asking Silver (James Ross). <a href="User:GijsKruitbos 
>ch">GijsKruitbosch</a> 05:41, 7 March 2007 (PST) 
25      </dd>
26    </dl>
27    <h3 id="Sourceextensions.2Fvenkman.2Fresources.2Fcontent.2Fve
>nkman-debugger.jsvenkman-debugger.js" name="Sourceextensions.2Fve 
>nkman.2Fresources.2Fcontent.2Fvenkman-debugger.jsvenkman-debugger 
>.js"> 
28      {{ Source("extensions/venkman/resources/content/venkman-deb
>ugger.js", "venkman-debugger.js") }} 
29    </h3>
30    <p>
31      Sets hooks in to the jsdIDebuggerService. initDebugger().
32    </p>
33    <h4 id="ScriptManager" name="ScriptManager">
34      ScriptManager
35    </h4>
36    <p>
37      In <code>initDebugger()</code> the previous loaded scripts 
>are passed to an <code>onScriptCreated()</code> method which bind 
>s them to a ScriptManager. There is one ScriptManager per url (we 
>b page). This method is set into <a class="external" href="http:/ 
>/www.xulplanet.com/references/xpcomref/ifaces/jsdIScriptHook.html 
>">jsdIScriptHook.</a>onScriptCreated 
38    </p>
39    <h3 id="Sourceextensions.2Fvenkman.2Fresources.2Fcontent.2Fve
>nkman-views.jsvenkman-views.js" name="Sourceextensions.2Fvenkman. 
>2Fresources.2Fcontent.2Fvenkman-views.jsvenkman-views.js"> 
40      {{ Source("extensions/venkman/resources/content/venkman-vie
>ws.js", "venkman-views.js") }} 
41    </h3>
42    <p>
43      Views are the panels shown within the venkman window. For e
>xample, the "Open Windows" view shows the browser's windows. 
44    </p>
45    <h3 id="Sourceextensions.2Fvenkman.2Fresources.2Fcontent.2Fve
>nkman-records.jsvenkman-records.js" name="Sourceextensions.2Fvenk 
>man.2Fresources.2Fcontent.2Fvenkman-records.jsvenkman-records.js" 
>> 
46      {{ Source("extensions/venkman/resources/content/venkman-rec
>ords.js", "venkman-records.js") }} 
47    </h3>
48    <p>
49      A "record" seems to be data underlying a view. For example,
> <code>FrameRecord</code> represents a JavaScript stack frame. 
50    </p>
51    <h3 id="venkman-msg.js" name="venkman-msg.js">
52      venkman-msg.js
53    </h3>
54    <p>
55      Localization code, reads venkman.properties from a subdirec
>tory of "locale" and injects variables. Things like msg.alert def 
>ine variables MSG_ALERT. 
56    </p>
57    <h3 id="venkman-utils.js" name="venkman-utils.js">
58      venkman-utils.js
59    </h3>
60    <p>
61      Defines the dd debug dump and friends
62    </p>
63    <h4 id="WindowRecord" name="WindowRecord">
64      WindowRecord
65    </h4>
66    <p>
67      Representation of the open windows.
68    </p>
69    <ul>
70      <li>
71        <code>FileContainerRecord</code> - List of script tags fo
>und in the parent record's <code>window.document</code> property. 
72        <ul>
73          <li>To obtain the antecedent files: <code>doc.getElemen
>tsByTagName("script");</code> 
74          </li>
75          <li>then extract the URLs from the <code>src</code> att
>ributes. 
76          </li>
77        </ul>
78      </li>
79    </ul>
80    <h4 id="ScriptWrapper" name="ScriptWrapper">
81      ScriptWrapper
82    </h4>
83    <p>
84      <a class="external" href="http://article.gmane.org/gmane.co
>mp.mozilla.devel.jsdebugger/140/match=feature+request">newsgroup, 
> 2002, rgrinda</a> 
85    </p>
86    <p>
87      Here is a bit more information about how Venkman tracks fil
>es and functions... 
88    </p>
89    <p>
90      A scriptWrapper is a pure JS object defined only inside Ven
>kman. As you pointed out, there is a 1:1 relationship between scr 
>iptWrappers and functions. scriptWrapper has-a jsdScript property 
>, which is an object which supports the jsdIScript interface. jsd 
>IScript is a lower level access to the function than the scriptWr 
>apper. In order to set a breakpoint in a particular function, you 
>'ll want to call scriptWrapper.setBreakpoint(pc{{ mediawiki.exter 
>nal(', parentBP') }}); where |pc| is the program counter location 
> to set the breakpoint, and |parentBP| is an optional "future bre 
>akpoint" object to use as the parent for this breakpoint. If you  
>set the breakpoint right from the jsdScript instead, you wouldn't 
> see it in the Venkman UI, and you might confuse Venkman when the 
> actual breakpoint was hit and it couldn't find a matching breakp 
>oint object. 
91    </p>
92    <p>
93      You can see the prototype for this object at <a class=" ext
>ernal" href="http://lxr.mozilla.org/mozilla/source/extensions/ven 
>kman/resources/content/venkman-debugger.js#914" rel="freelink">ht 
>tp://lxr.mozilla.org/mozilla/sourc...ebugger.js#914</a> 
94    </p>
95    <p>
96      scriptWrapper.jsdScript is the reference to the jsdIScript 
>object for the function. 
97    </p>
98    <p>
99      sourceContext is the 5 lines of source text before the last
> instance of the word "function" on the line where this function  
>starts. (not in 2006, seems to be computed on the fly in getSourc 
>eContext()). 
100    </p>
101    <p>
102      The full text of the file can be found in an array located 
>at scriptWrapper.scriptInstance.sourceText.lines. This array is 0 
> based, of course. 
103    </p>
104    <p>
105      The starting line of the function is scriptWrapper.jsdScrip
>t.baseLineNumber (one based). 
106    </p>
107    <p>
108      The total length of the function is scriptWrapper.jsdScript
>.lineExtent. 
109    </p>
110    <p>
111      If you want to get at the pretty printed source text, inste
>ad of the actual source text, use scriptWrapper.jsdScript.functio 
>nSource. 
112    </p>
113    <h4 id="ScriptInstance" name="ScriptInstance">
114      ScriptInstance
115    </h4>
116    <p>
117      All scriptWrappers are parented by a single scriptInstance,
> which holds all of the scriptWrappers for a particular URL. From 
> here, you can set and clear breakpoints by line number (instead  
>of by program counter), locate a scriptWrapper for a given line n 
>umber, and do a few other useful things. scriptInstance.functions 
> is a hash of all of the functions in the script instance, keyed  
>by the tag property of the jsdScript. scriptInstance.topLevel is  
>the top-level script for the instance. 
118    </p>
119    <h4 id="ScriptManager_2" name="ScriptManager_2">
120      ScriptManager
121    </h4>
122    <p>
123      Sometimes the same URL is loaded more than once in the brow
>ser. To deal with this, all scriptInstances are parented by a sin 
>gle scriptManager. A scriptManager keeps all of the loaded instan 
>ces of a particular URL in the scriptManager.instances array, in  
>the order that they were loaded. From here, you can set and clear 
> breakpoints in all instances. scriptManager.transients is a hash 
> of all of the "transient" scripts from this URL, where a transie 
>nt script is something compiled as a the result of an eval, setTi 
>meout, or setInterval. 
124    </p>
125    <p>
126      Try starting up Venkman and type "/watch-expr client.script
>Managers", make sure to turn on "Include Functions". This tree sh 
>ould give you a pretty good idea of how it all fits together. 
127    </p>

返回历史