<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="/lib/xsl/devedge-1.00/article_en.xsl"?>
<nde:article 
  url="/viewsource/2002/venkman/01/" 
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:nde="http://devedge.netscape.com/2002/de" 
  xmlns:ent="http://devedge.netscape.com/2003/ent"
  xml:lang="en">

  <nde:header>

    <nde:title>
      Venkman, the new JavaScript Debugger for Netscape 7.x
    </nde:title>

    <nde:category>
      Article
    </nde:category>

    <nde:pubdate year="2002" month="10" day="04"/>

    <nde:summary>
      Get an introduction to Venkman, the cross-platform JavaScript debugger
      for Netscape 7.x and Mozilla
    </nde:summary>
    
    <nde:channels>
      <nde:channel id="viewsource"/>
      <nde:channel id="javascript"/>
      <nde:channel id="ns-7" />
   </nde:channels>
    
    <nde:keywords>
      javascript, debugger, dhtml, netscape, gecko
    </nde:keywords>
    
    <nde:authlist>
      <nde:author>
        <nde:authname>Ian Oeschger, Robert Ginda</nde:authname>
        <nde:authaffil>Netscape Communications</nde:authaffil>
      </nde:author>
    </nde:authlist>
    <nde:translations>
      <nde:trans url="/viewsource/2002/venkman/01/index_ja.html">Japanese</nde:trans>
    </nde:translations>

  </nde:header>

  <nde:head>
    <style type="text/css">
      .chunk { border: 10px; padding: 40px; border: 1px solid lightgray; }
      .what {
              margin-left: 10px;
              font-size: larger;
              font-weight: bold;
          }

      .why {
              margin-left: 25px;
          }

      .left-floating-figure {
              float: left;
              margin: 10px 10px 10px 10px;
              text-align: center;
              font-size: small;
              font-weight: bold;
          }
      .floating-figure {
              float: right;
              margin: 10px 10px 10px 10px;
              text-align: center; 
              font-size: small;
              font-weight: bold;
          }

      .figure-table {
              font-size: smaller;
              border: 1px solid;
      }
    </style>
  </nde:head>

  <nde:content>

<p>A powerful new tool is available for web developers in Netscape
7.x. The JavaScript debugger, also called <i>Venkman</i>, has been a
part of the Mozilla browser and the community of web and script
developers there for some time. This article provides an overview and
some practical examples of using the JavaScript debugger in web
applications and web page scripting. This introduction is the first in
a series of DevEdge articles on Venkman and JavaScript debugging. Even
if you are already using Venkman, the features, procedures, and tips
described here will make you a more confident web developer and
debugger.</p>

<p>Venkman is both a graphic and a console debugger. Features such as
breakpoint management, call stack inspection, and variable/object
inspection are available from the user interface <i>and</i> from
console commands, letting you work in the way you are most accustomed
to. The interactive console also allows for execution of arbitrary
JavaScript code. Venkman's keyboard shortcuts are the same as leading
visual debugging environments, and gdb users should be familiar with
Venkman's <tt>break</tt>, <tt>step</tt>, <tt>next</tt>,
<tt>finish</tt>, <tt>frame</tt>, and <tt>where</tt> commands.
</p>

<p>On Windows, the JavaScript debugger compares favorably with Visual
Interdev and other large web development tools. On other platforms,
including Mac OS and Unix, it is alone in offering this degree of
flexibility, depth, and power in a visual debugging environment.
</p>

<h2>Starting the Debugger</h2>

<p>The JavaScript Debugger is automatically pre-installed in Mozilla
1.0 but must be installed in Netscape 7.x and other Netscape
Gecko-based browsers. Fortunately, the XPInstall technology makes it
possible to install new browser modules and other applications in
Netscape 7.x with simple hyperlinks.
</p>

<p>If you don't already have Venkman or would like to upgrade, you can
easily get the latest version from the<a
href="http://www.hacksrus.com/~ginda/venkman/">Venkman Development
Page</a>. The installation process is two steps. First, from within
the browser you want to host the debugger application, visit the
Venkman Development Page and click on the "install" link for the most
recent version. When the download is complete, restart your browser
(some Windows users may also need to restart their computer as
well). You can then access the debugger via a new, dynamically created
menuitem in the Tools menu of that browser, or else restart the
browser with a special debugger option.
</p>

<p>
  To see which version of Venkman you have, type
  <b>/version</b> in the Interactive Session view.  
  For more information about the latest improvements and versions, see the 
  <a href="http://www.hacksrus.com/~ginda/venkman/">Venkman Development Page</a>.
</p>

<p>There are two ways to start the debugger:
</p>
<ul><li>From the browser, you can
start it by selecting JavaScript Debugger from the <b>Tools->Web
Development</b> menu.
</li>

<li>You can also start the browser with the <tt>-venkman</tt> command line option,
which launches Venkman initially instead of a browser front end. Other
programs, such as the mail client or web browser can then be started
from Venkman's Window menu:
<blockquote>
<pre>
mozilla -venkman</pre>
</blockquote>
</li>
</ul>

<p>(Note that Venkman displays usage data when it starts up: "Recorded
local startup X, global YYY." This data comes from a counter built in
to the application. For more information about this counter and the
data, see <a
href="http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html#2.2">Item
2.2</a> in the Venkman FAQ.)
</p>


<blockquote>
  <img src="venkman_start.gif"/> <br />
  <b><small>Figure 1. The JavaScript Debugger</small></b>  
</blockquote>

<p>When you first start Venkman, the basic views are arranged as in
the screenshot above<ent:mdash/>though you can customize the layout and
presence of the different views however you want, as we describe in
the <a href="#customize">View Customization</a> section below. The
scripts that have been loaded by the JavaScript engine appear in the
Loaded Scripts window (for more information about how scripts are
loaded and accessed in Venkman, see "<a href="#loading">Loading
Scripts into the Debugger</a>").
</p>

<p>The menubar, toolbar, and all of the views can be collapsed or hidden,
giving you a lot of control over the debugging environment. The <a
href="#sourceview">Source Code</a> view is empty until you select a
script, and the <a href="#interactive">Interactive Session window</a>
starts up with basic startup information.
</p>

<span class="left-floating-figure">
  <img src="venk_view.gif" border="1" />
      <br /><b><small>Figure 2. View Controls</small></b>
</span>
<p><ent:nbsp/>
</p>



<p>Each of the views has a <i>label</i>, a <i>float button</i> that lets you
display the view in its own window, and a <i>close button</i> that
puts the view away until you want to display it again, as seen in
Figure 2.</p>


<p>The following section describes these views and
their use within the interface as a whole.
</p>
<p><ent:nbsp/>
</p>
<p><ent:nbsp/>
</p>

<a name="toolbar"></a>
<h3>Toolbar</h3>

<blockquote>
<img src="vk_toolbar.gif" /><br />
<small><b>Figure 3. The Venkman Toolbar</b></small>
</blockquote>

<p>The Toolbar is located at the top of the debugger. The Toolbar
contains icons for Stop, Continue, Step Over, Step Into, Step Out,
Profile, and Pretty Print commands. These commands should be self
explanatory, with the possible exception of Stop, which causes the
debugger to stop <i>when the next line of JavaScript is executed</i>,
and the Profile button, which can be used to measure execution times
for your scripts. When you enable profiling by clicking this button, a
green checkmark appears next to the button and profile data for every
function is collected, and can be saved by choosing <b>Save Profile
Data As...</b> from the Profile menu.
</p>

<p>Also note that when you are currently executing JavaScript and click
the Stop button, the JavaScript stops immediately. If you are not
running JavaScript and click the Stop button, it will display "...",
as in the figure below, to indicate that the debugger will stop at the
next instruction, but doesn't have anywhere to stop yet.
</p>

<blockquote>
<img src="stop-checked.png" /><br />
<b><small>Figure 4.<br /> Stop Button Waiting for Execution</small></b>
</blockquote>

<p>This quick stop mode reflects a common scenario in JavaScript
debugging, which is to inspect and debug scripts while they are
running, as on a page where elements are moved around dynamically with
DHTML. You can also use commands available in the Debug menu and from
the console to stop at errors or at exceptions.
</p>

<p>The Continue button to the right of the Stop button dismisses the
Stop mode and specifies that scripts should be executed normally,
without pausing as each statement is executed. 
</p>

<p>The Pretty Print button toggles Pretty Print mode. While in Pretty
Print mode, the contents of the source view will contain the
decompiled source text for the selected function. This is the same
text you would get from the <b>toSource</b> method of the <b>Function</b>
prototype. If the source text you are debugging is poorly formatted,
Pretty Print can help make it easier to read by inserting line breaks
and whitespace in appropriate places.
</p>

<p>When Pretty Print is enabled you will see a green check mark on the
toolbar button, and the menu item will be checked as well.
</p>

      <a name="script-view"></a>
    <h3>The Loaded Scripts View</h3>

    <blockquote>
      <img src="vk_scripts.gif" /><br />
	        <small><b>Figure 5. The Loaded Scripts View<br />
		      Active files and functions</b></small>
   </blockquote>

    <p>
      The <i>Loaded Scripts View</i> is in the top left portion of the window.
      When a file is loaded by the browser it will appear in this
      view, and when unloaded it will be removed.
      Files are listed in alphabetical order, grouped by file type.
      File names are displayed after a color coded, single letter icon
      representing the file extension.
      Figure 6 shows the table of icon and
      file types.
      At the time if this writing, the order and grouping of file names
      cannot be changed.
</p>
    <p>
      The
      ``special'' function name <tt>__toplevel__</tt> is displayed for
      scripts that are not part of an actual function.
      Clicking on a file name brings you to the top of that file, while
      clicking on a function name brings you to the start of that function.
</p>
      <blockquote>
        <table class="figure-table">
          <tr>
            <th>Icon</th><th>File type</th>
          </tr>
          <tr>
            <td><img src="file-js.png" /></td> <td>.js</td>
          </tr>
          <tr>
            <td><img src="file-html.png" /></td> <td>.html, .htm</td>
          </tr>
          <tr>
            <td><img src="file-xul.png" /></td> <td>.xul</td>
          </tr>
          <tr>
            <td><img src="file-xml.png" /></td> <td>.xml</td>
          </tr>
          <tr>
            <td><img src="file-unknown.png" /></td> <td>All other files</td>
          </tr>
          <tr>
            <td><img src="file-function.png" /></td> <td>JavaScript function</td>
          </tr>
        </table>
        <small><b>Figure 6<br />
        Icons in the Script View</b></small>
      </blockquote>
    <p>
      The <b>Line</b> column in this view displays the line number that this
      function starts on.  The column
      picker for this view (the <img src="colpicker.gif" /> box on the top
      right) can be used to display a <b>Length</b> column.  This column
      displays the size of functions, in lines.  Both the Line and Length
      column are blank for file names.
</p>
    <p>
      If a function has a breakpoint in it, a small red dot will show up
      in the function icon, as well as the parent's file icon.
</p>


    <h3>The Local Variables View</h3>
    
    
    <p>
The <i>Local Variables view</i> is on the left portion of the window,
  at the bottom. When the debugger is stopped, the Local
  Variables view displays values for the current function.
  The <tt>scope</tt> object holds all arguments and local variables, and the
  <tt>this</tt> object holds the value of the this keyword.
</p>

<blockquote>
  <img src="vk_vars.gif" /><br />
        <small><b>Figure 7. The Local Variables View</b></small>
 </blockquote>
    
      <span class="left-floating-figure">
        <table class="figure-table">
          <tr><td>e</td><td>Enumerable property</td></tr>
          <tr><td>r</td><td>Read Only property</td></tr>
          <tr><td>p</td><td>Permanent (cannot be <tt>delete</tt>d)</td></tr>
          <tr><td>A</td><td>Alias to another property</td></tr>
          <tr><td>a</td><td>Argument to a function</td></tr>
          <tr><td>v</td><td>Declared with <tt>var</tt></td></tr>
        </table>
        <small><b>Figure 8. <br />
        Property flags</b></small>
      </span>
    <p>
      Properties of both <tt>scope</tt> and <tt>this</tt> objects are
      listed alphabetically, grouped by data type.  Figure 9 shows which icons
      represent which data types.
</p>
    <p>
  Properties which are of the type <tt>Object</tt> are displayed with
  the name of their constructor function in curly braces as their
  value.  You can locate the source code of the constructor by
  selecting "Find Constructor" from the property's context menu.
  You can find the place where the object was instantiated with
  the "Find Creator" command. By default, properties of type
<tt>function</tt> are not displayed, in
  order to conserve space in the view.  If you would like to have
  functions displayed, check the "Include Functions" menu item
  in the view's context menu.  You may need to close and re-open
  any objects you had open to see the change.
</p>

  <p>Properties that show up in a bold grey font are defined on
  an object from the prototype chain, and not on the actual object
  you are inspecting.  If you would like to inspect the object's
  prototype and parent chains, check the "Include ECMA Properties"
  menu item in the view's context menu. If a property shows up in a
bold red font, an exception occurred
  when Venkman tried to read the value.  The exception object
  will appear as the value of the property.
</p>

  <p>
      The column
      picker for this view (the <img src="colpicker.gif" /> box on the top
      right) can be used to display <b>Type</b> and <b>Flags</b> columns.  The
      Type column contains a textual description of the type of the object.
      Flags lists one or more applicable flags for this object.  Flags are
      shown enumerated in Figure 8.
</p>
      <blockquote>
        <table class="figure-table">
          <tr>
            <th>Icon</th>
            <th>Data Type</th>
            <th>Icon</th>
            <th>Data Type</th>
          </tr>
          <tr>
            <td><img src="watch-void.png" alt="X" title="X" /></td>
            <td>Void (undefined) value</td>
            <td><img src="watch-null.png" alt="null" title="null" /></td>
            <td>Null value</td>
          </tr>
          <tr>
            <td><img src="watch-bool.png" alt="t/f" title="t/f" /></td>
            <td>Boolean value</td>
            <td><img src="watch-string.png" alt="`'" title="`'" /></td>
            <td>String value</td>
          </tr>
          <tr>
            <td><img src="watch-int.png" alt="#" title="#" /></td>
            <td>Integer value</td>
            <td><img src="watch-double.png" alt="##" title="##" /></td>
            <td>Double value</td>
          </tr>
          <tr>
            <td><img src="watch-object.png" alr="*" title="*" /></td>
            <td>Object value</td>
            <td><img src="watch-function.png" alr="f" title="f" /></td>
            <td>Function value</td>
          </tr>
        </table>
        <small><b>Figure 9. Type Icons</b></small>
      </blockquote>
    <p>
      If an item visible in the Local Variables View is modified via the Interactive Session View the
      modification will be immediately reflected in the Local Variable View.
</p>
    <p>
      At the time of this writing, the Local Variables View's default sort order and
      grouping are not adjustable.
</p>

    <h3>The Call Stack View</h3>
    <span class="floating-figure">
      <img src="vk_stack.gif" /><br />
      <small><b>Figure 10. The Call Stack View</b></small>
    </span>
    <p>
      The <i>Call Stack View</i> is on the left portion of the
      window by default, at the
      bottom. When the debugger is stopped, the Call
  Stack View displays the list of active functions. The function
  at the top of the Call Stack View is the one in which the debugger
  stopped, the function below it is the caller, below that is the
  caller's caller, and so on. These items are referred to as stack
  frames.
</p>

  <p>
  Double-clicking on a stack frame will change the "current" frame.
  This will cause the source of function to be displayed in the
  Source Code view, the Local Variables view will change to display
  variables local to the selected stack frame, and script evaluated
  in the Interactive Session view will be relative to the selected
  frame.
</p>

  <p>
  If you would like to copy the current call stack to the clipboard,
  select "Dump Stack to Interactive Session" from the context menu,
  or type <b>/where</b> in the Interactive Session view.  You may then
  copy the text from the Interactive Session view.
</p>

  <p>
  If you would like to keep Venkman from stopping in a particular
  stack frame in the future, check "Don't Debug" from the stack
  frame's context menu.
</p>

<a name="sourceview"></a>
<h3>Source Code View</h3>

    <span class="floating-figure">
      <img src="vk_source.gif" /><br />
      <small><b>Figure 11. The Source Code View<br />
      Source code, line numbers, and breakpoints</b></small>
    </span>

<p>The Source Code View is a read-only file viewer. Files and specific
functions within them can be displayed by selecting the appropriate
file or function name in the Script View.
</p>

<p>When script execution is interrupted by the debugger, the line of
the file where the interruption occurred is automatically displayed in
the Source Code View. The line in question will be highlighted in yellow to
make it easy to spot.
</p>

<p>Clicking in the left margin of this view will set a breakpoint at
that line. If the breakpoint is successfully set, the margin will show
the letter "B" on a red background, and both the Loaded Scripts View and Interactive Session View will provide
feedback. The breakpoint can be cleared by clicking in the margin
again (on the letter "B"). Breakpoints cannot be set on lines which
do not contain executable code, such as blank and comment lines. For
these lines, the Interactive Session View will display an error message explaining
why the breakpoint could not be set.
</p>

<p>Breakpoints can also be set and cleared from the Interactive Session View, with
the break and fbreak commands. The break command takes a file pattern
and line number. Any loaded file which matches the file pattern, and
contains an executable line at the requested line number will have a
breakpoint set. If no loaded files match the file pattern or line
number, an error message is printed to the console and the command
fails. The fbreak command is identical, with the exception that if no
files match the pattern or line, a "future breakpoint" is
recorded. The next time a file is loaded that matches the pattern and
line, a breakpoint will be set. In this way, fbreak allows one to set
breakpoints in files that are not yet loaded, as well as set
breakpoints that are triggered when a file is loaded.
</p>

<h3>The Interactive Session View</h3>

<span class="floating-figure">
  <img src="venkman-console.gif" /><br />
      <small><b>Figure 12. The Interactive Session View<br />
 Command line interface to the debugger</b></small>
</span>

<p>Another basic view in Venkman is the actual Interactive Session View, which
allows you to interact with the debugger from a command line. 
</p>

<p>Commands are entered in the text box, and responses are appended to the
  end of the output.  Type commands in the input area (the text box)
  to list all of the commands available. The <tt>/help</tt> command can be used
  to get additional information about a specific command. You can 
  type <tt>/help next</tt>, for example, to see how to use the next command.
</p>

  <p>The input area supports command history and tab-completion for
  command names. Command history remembers the last 20 commands
  entered. The up and down arrows can be used to revisit these
  previous commands. Tab completion allows the user to type the first
  portion of a command, and press tab twice to see possible
  completions. If only one command matches, it will be auto-completed
  on the first tab.
</p>



<h2>View Customization</h2>

<p>Venkman offers nearly complete control over the arrangement and
display of views within the application. The debugger is built on top
of an application framework that allows you to drag and drop, resize,
and toggle all the available views, and even to create new views or
modules for the debugger if you choose<ent:mdash/>though this latter is an
advanced topic and a subject for a future article.
</p>

<p>To remove a view from Venkman, simply click the Close button at the
top right of that view. When the view again becomes
necessary<ent:mdash/>for example, when you open a source file from the
Loaded Scripts view and want to view the source<ent:mdash/>the view
reappears where it was last positioned. To make a view reappear
explicitly, select it from the <b>View->Show/Hide</b> menu of the
debugger. You can also make views float in their own separate
windows. To make a view float, click the float button in the upper
left of that view.
</p>

<p>You can access any of the basic views from the <b>Show/Hide</b>
submenu of the <b>View</b> menu. The list displayed there includes all
of the basic views in Venkman. As you change which views are displayed
and where in the UI they appear, your preferences are stored and
persisted across sessions.
</p>

<a name="loading"></a>
<h2>Loading Scripts into the Debugger</h2>

<p>Whether or not you start Venkman first or the browser component,
when the Mozilla suite starts up, the JavaScript engine begins to
keep track of and compile all the scripts that are loaded in web pages and in the
various Mozilla user interfaces themselves. The engine tells Venkman
about the scripts it knows about, and those scripts are loaded into
the "Loaded Scripts" view in the debugger.
</p>

<p>If you want to load new scripts in<ent:mdash/>say from a web page you
are trying to troubleshoot<ent:mdash/>you can do so by simply opening that
web page <i>in the regular browser window</i>, at which point the
compiler gets the JavaScript source and populates the Loaded Scripts
window with the new entry.
</p>

<p>Using <b>File->Open</b> from Venkman will open a local file in the
debugger, and using <b>File->Open Web Location</b> will open and display the entire
HTML contents of the requested page. Probably, neither of these is
what you really want. Since the JavaScript engine automatically
populates the Loaded Scripts list in the debugger with JavaScript it
executes as the browser opens web pages, it's usually enough simply to
<i>browse</i> the sites whose scripts you are interested in debugging.
</p>

<a name="walkthrough"></a>
<h2>Debugging Basics</h2>

<p>This section provides a brief example of a debugging session in
order to familiarize you with some of the basic commands and
operations of the debugger. 
</p>

    <p class="what">
      1. Start Venkman
</p>
    <p class="why">
      Note: At one point, the debugger needed to be started <i>before</i> the
      scripts it was going to debug. This limitation is fixed, and now
      the JavaScript compiler makes all the scripts you access via the
      browser available to the debugger. See <i><a
      href="#loading">Loading Scripts in the Debugger</a></i> for more
      information about finding and loading scripts in Venkman.
</p>

    <p class="what">
      2. Launch a browser window and go to <a href="http://wp.netscape.com/fishcam/dhtmltank.html">http://wp.netscape.com/fishcam/dhtmltank.html</a>.
</p>
    <p class="why">
      Note that the debugger contains a Window menu like other major
      components in the application suite. From this menu, you can
      access the browser, mail, and other applications.
</p>

    <p class="what">
      3. Type "/break Animator-0.03 121" in the debugger.
</p>

    <p class="why">
      The console command "/break" is used to set and list breakpoints.  The 
      first parameter is the file name that contains the JavaScript you
      want to break at.  The second parameter is the line number.  You
      don't need to specify the entire file name.  In this example, we
      are setting a breakpoint in the <tt>pause</tt> function called
when the browser
      starts the DHTML fishcam window.
</p>
    <p class="why">
      Alternately, you can select Animator-0.03.js from the Loaded Scripts view,
      locate the <tt>pause</tt> function at line 119, and click in the
      left margin. Setting breakpoints
      in this manner is equivalent to using the <b>/break</b> command in the
      console. In either case, a red breakpoint icon appears in the
      Source Code view.

      <span class="floating-figure">
        <a href="venkman-20021001.gif"><img border="0" src="venkman-small.gif" /></a><br />
        <small><b>Figure 13. (from Step 5)<br />
        Stopped at a breakpoint</b></small>
      </span>
</p>

    <p class="what">
4. Type "/break" in the debugger.
</p>
    <p class="why">
If you don't provide arguments to the <b>/break</b> command, all
breakpoints are listed in the Interactive Session view.
</p>

    <p class="what">
5. On the fishcam page, press the pause link.
</p>
    <p class="why">
You should hit the breakpoint you just set in Step 3.  
</p>

    <p class="why">
In the interactive session, context: becomes
Animator-0.03.js and the scope is the pause function.  There will also
be "stopped for breakpoint" in red in the interactive session, along
with the file name, line number, and snippet source code from where it
stopped.
</p>

    <p class="what">
6. In the interactive session's input field, enter "this.fPaused"
</p>

    <p class="why">
Venkman evaluates the expression, giving you [boolean] <tt>false</tt> back.
Press Step Into to follow the steps until you have finished debugging the function,
and the fishes have paused.
</p>

    <p class="why">
In addition to Step In, which will execute a single line of JavaScript
and stop, Step Over can be used to step over a impending function call,
and return control to the debugger when the call returns.  Step Out
executes until the current function call exits.
</p>

    <p class="what">
7. Click the pause link again on the fishcam page to resume the demo.
</p>

    <p class="why">
This starts the DHTML down the other codepath in <tt>start()</tt> and makes the fishes start swimming again.
</p>

<p>
As you can see, this is a very modest introduction to the
functionality of the JavaScript debugger and the complexity that
scripts can have. But the steps described here can give you a basic
feel for the debugger if you haven't already had some
experience using it, and they provide the basis for the more
interesting and practical examples in the articles that follow this
one.
</p>

<p>The best way to get to know Venkman, of course, is to play around
with it<ent:mdash/>to set it up in the way that makes the most sense to
you, to try loading scripts and setting breakpoints, evaluating
expressions in the Interactive Session View, watching the values of variables as
they change when scripts are executed, getting profile data.
</p>

<h2>Resources</h2>

<p>See the following links for more information about Venkman:
</p>
<ul>
<li>Venkman Homepage: <a href="http://www.mozilla.org/projects/venkman/">http://www.mozilla.org/projects/venkman/</a>
</li>

<li>Venkman Development Page: <a href="http://www.hacksrus.com/~ginda/venkman/">http://www.hacksrus.com/~ginda/venkman/</a>
</li>

<li>Screenshots: <a href="http://www.hacksrus.com/~ginda/venkman/screenshots/?M=D">http://www.hacksrus.com/~ginda/venkman/screenshots/?M=D</a>
</li>

<li>FAQ: <a href="http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html">http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html</a>
</li>

<li>Newsgroup: netscape.public.mozilla.jsdebugger<br />
Newsgroup FAQ entry: <a href="http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html#ng">http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html#ng</a>
</li>

<li>IRC: irc://irc.mozilla.org/venkman<br />
IRC FAQ entry: <a href="http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html#irc">http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html#irc</a>
</li>
</ul>
  </nde:content>

  <nde:related area="nde">
    <!--
    <nde:item url="/viewsource/2003/venkman/01/">Using Breakpoints in Venkman</nde:item>
    -->
    <nde:item url="/central/javascript">JavaScript Central</nde:item>
    <nde:item url="/viewsource/2003/mozilla-webdev/">Using Mozilla in Testing and Debugging Web Sites</nde:item>
    <nde:item url="/library/releases/netscape-7/">Other Articles about Netscape 7</nde:item>
  </nde:related>
  
  <nde:related area="ext">
    <nde:item url="http://www.mozilla.org/projects/venkman/">Venkman JavaScript Debugger</nde:item>
    <nde:item url="http://www.hacksrus.com/~ginda/venkman/">Venkman Development Page</nde:item>
    <nde:item url="http://www.hacksrus.com/~ginda/venkman/screenshots/?M=D">Venkman Screenshots</nde:item>
    <nde:item url="http://www.hacksrus.com/~ginda/venkman/faq/venkman-faq.html">Venkman FAQ</nde:item>
    <nde:item url="http://mozilla.org/projects/inspector/">Mozilla's DOM Inspector</nde:item>
  </nde:related>

</nde:article>
