{
  "source": "doc/api/debugger.md",
  "introduced_in": "v0.9.12",
  "stability": 2,
  "stabilityText": "Stable",
  "miscs": [
    {
      "textRaw": "Debugger",
      "name": "Debugger",
      "introduced_in": "v0.9.12",
      "stability": 2,
      "stabilityText": "Stable",
      "type": "misc",
      "desc": "<p>Node.js includes an out-of-process debugging utility accessible via a\n<a href=\"#debugger_v8_inspector_integration_for_node_js\">V8 Inspector</a> and built-in debugging client. To use it, start Node.js\nwith the <code>inspect</code> argument followed by the path to the script to debug; a prompt\nwill be displayed indicating successful launch of the debugger:</p>\n<pre><code class=\"lang-txt\">$ node inspect myscript.js\n&lt; Debugger listening on ws://127.0.0.1:9229/80e7a814-7cd3-49fb-921a-2e02228cd5ba\n&lt; For help see https://nodejs.org/en/docs/inspector\n&lt; Debugger attached.\nBreak on start in myscript.js:1\n&gt; 1 (function (exports, require, module, __filename, __dirname) { global.x = 5;\n  2 setTimeout(() =&gt; {\n  3   console.log(&#39;world&#39;);\ndebug&gt;\n</code></pre>\n<p>Node.js&#39;s debugger client is not a full-featured debugger, but simple step and\ninspection are possible.</p>\n<p>Inserting the statement <code>debugger;</code> into the source code of a script will\nenable a breakpoint at that position in the code:</p>\n<!-- eslint-disable no-debugger -->\n<pre><code class=\"lang-js\">// myscript.js\nglobal.x = 5;\nsetTimeout(() =&gt; {\n  debugger;\n  console.log(&#39;world&#39;);\n}, 1000);\nconsole.log(&#39;hello&#39;);\n</code></pre>\n<p>Once the debugger is run, a breakpoint will occur at line 3:</p>\n<pre><code class=\"lang-txt\">$ node inspect myscript.js\n&lt; Debugger listening on ws://127.0.0.1:9229/80e7a814-7cd3-49fb-921a-2e02228cd5ba\n&lt; For help see https://nodejs.org/en/docs/inspector\n&lt; Debugger attached.\nBreak on start in myscript.js:1\n&gt; 1 (function (exports, require, module, __filename, __dirname) { global.x = 5;\n  2 setTimeout(() =&gt; {\n  3   debugger;\ndebug&gt; cont\n&lt; hello\nbreak in myscript.js:3\n  1 (function (exports, require, module, __filename, __dirname) { global.x = 5;\n  2 setTimeout(() =&gt; {\n&gt; 3   debugger;\n  4   console.log(&#39;world&#39;);\n  5 }, 1000);\ndebug&gt; next\nbreak in myscript.js:4\n  2 setTimeout(() =&gt; {\n  3   debugger;\n&gt; 4   console.log(&#39;world&#39;);\n  5 }, 1000);\n  6 console.log(&#39;hello&#39;);\ndebug&gt; repl\nPress Ctrl + C to leave debug repl\n&gt; x\n5\n&gt; 2 + 2\n4\ndebug&gt; next\n&lt; world\nbreak in myscript.js:5\n  3   debugger;\n  4   console.log(&#39;world&#39;);\n&gt; 5 }, 1000);\n  6 console.log(&#39;hello&#39;);\n  7\ndebug&gt; .exit\n</code></pre>\n<p>The <code>repl</code> command allows code to be evaluated remotely. The <code>next</code> command\nsteps to the next line. Type <code>help</code> to see what other commands are available.</p>\n<p>Pressing <code>enter</code> without typing a command will repeat the previous debugger\ncommand.</p>\n",
      "miscs": [
        {
          "textRaw": "Watchers",
          "name": "watchers",
          "desc": "<p>It is possible to watch expression and variable values while debugging. On\nevery breakpoint, each expression from the watchers list will be evaluated\nin the current context and displayed immediately before the breakpoint&#39;s\nsource code listing.</p>\n<p>To begin watching an expression, type <code>watch(&#39;my_expression&#39;)</code>. The command\n<code>watchers</code> will print the active watchers. To remove a watcher, type\n<code>unwatch(&#39;my_expression&#39;)</code>.</p>\n",
          "type": "misc",
          "displayName": "Watchers"
        },
        {
          "textRaw": "Command reference",
          "name": "command_reference",
          "modules": [
            {
              "textRaw": "Stepping",
              "name": "Stepping",
              "desc": "<ul>\n<li><code>cont</code>, <code>c</code> - Continue execution</li>\n<li><code>next</code>, <code>n</code> - Step next</li>\n<li><code>step</code>, <code>s</code> - Step in</li>\n<li><code>out</code>, <code>o</code> - Step out</li>\n<li><code>pause</code> - Pause running code (like pause button in Developer Tools)</li>\n</ul>\n",
              "type": "module",
              "displayName": "Breakpoints"
            },
            {
              "textRaw": "Breakpoints",
              "name": "breakpoints",
              "desc": "<ul>\n<li><code>setBreakpoint()</code>, <code>sb()</code> - Set breakpoint on current line</li>\n<li><code>setBreakpoint(line)</code>, <code>sb(line)</code> - Set breakpoint on specific line</li>\n<li><code>setBreakpoint(&#39;fn()&#39;)</code>, <code>sb(...)</code> - Set breakpoint on a first statement in\nfunctions body</li>\n<li><code>setBreakpoint(&#39;script.js&#39;, 1)</code>, <code>sb(...)</code> - Set breakpoint on first line of\nscript.js</li>\n<li><code>clearBreakpoint(&#39;script.js&#39;, 1)</code>, <code>cb(...)</code> - Clear breakpoint in script.js\non line 1</li>\n</ul>\n<p>It is also possible to set a breakpoint in a file (module) that\nis not loaded yet:</p>\n<pre><code class=\"lang-txt\">$ node inspect main.js\n&lt; Debugger listening on ws://127.0.0.1:9229/4e3db158-9791-4274-8909-914f7facf3bd\n&lt; For help see https://nodejs.org/en/docs/inspector\n&lt; Debugger attached.\nBreak on start in main.js:1\n&gt; 1 (function (exports, require, module, __filename, __dirname) { const mod = require(&#39;./mod.js&#39;);\n  2 mod.hello();\n  3 mod.hello();\ndebug&gt; setBreakpoint(&#39;mod.js&#39;, 22)\nWarning: script &#39;mod.js&#39; was not loaded yet.\ndebug&gt; c\nbreak in mod.js:22\n 20 // USE OR OTHER DEALINGS IN THE SOFTWARE.\n 21\n&gt;22 exports.hello = function() {\n 23   return &#39;hello from module&#39;;\n 24 };\ndebug&gt;\n</code></pre>\n",
              "type": "module",
              "displayName": "Breakpoints"
            },
            {
              "textRaw": "Execution control",
              "name": "Execution control",
              "desc": "<ul>\n<li><code>run</code> - Run script (automatically runs on debugger&#39;s start)</li>\n<li><code>restart</code> - Restart script</li>\n<li><code>kill</code> - Kill script</li>\n</ul>\n",
              "type": "module",
              "displayName": "Various"
            },
            {
              "textRaw": "Various",
              "name": "various",
              "desc": "<ul>\n<li><code>scripts</code> - List all loaded scripts</li>\n<li><code>version</code> - Display V8&#39;s version</li>\n</ul>\n",
              "type": "module",
              "displayName": "Various"
            }
          ],
          "type": "misc",
          "displayName": "Command reference"
        },
        {
          "textRaw": "Advanced Usage",
          "name": "advanced_usage",
          "properties": [
            {
              "textRaw": "V8 Inspector Integration for Node.js",
              "name": "js",
              "desc": "<p>V8 Inspector integration allows attaching Chrome DevTools to Node.js\ninstances for debugging and profiling. It uses the <a href=\"https://chromedevtools.github.io/debugger-protocol-viewer/\">Chrome Debugging Protocol</a>.</p>\n<p>V8 Inspector can be enabled by passing the <code>--inspect</code> flag when starting a\nNode.js application. It is also possible to supply a custom port with that flag,\ne.g. <code>--inspect=9222</code> will accept DevTools connections on port 9222.</p>\n<p>To break on the first line of the application code, pass the <code>--inspect-brk</code>\nflag instead of <code>--inspect</code>.</p>\n<pre><code class=\"lang-txt\">$ node --inspect index.js\nDebugger listening on 127.0.0.1:9229.\nTo start debugging, open the following URL in Chrome:\n    chrome-devtools://devtools/bundled/inspector.html?experiments=true&amp;v8only=true&amp;ws=127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29\n</code></pre>\n<p>(In the example above, the UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29\nat the end of the URL is generated on the fly, it varies in different\ndebugging sessions.)</p>\n"
            }
          ],
          "type": "misc",
          "displayName": "Advanced Usage"
        }
      ]
    }
  ]
}
