Add a Notification Settings Button to all web notifications behind the web platform...
[chromium-blink-merge.git] / native_client_sdk / doc_generated / devguide / devcycle / debugging.html
blob300dffc9031e767ff279344e7a2c917897899b8f
1 {{+bindTo:partials.standard_nacl_article}}
3 <section id="debugging">
4 <span id="devcycle-debugging"></span><h1 id="debugging"><span id="devcycle-debugging"></span>Debugging</h1>
5 <p>This document describes tools and techniques you can use to debug, monitor,
6 and measure your application&#8217;s performance.</p>
7 <div class="contents local" id="table-of-contents" style="display: none">
8 <p class="topic-title first">Table Of Contents</p>
9 <ul class="small-gap">
10 <li><p class="first"><a class="reference internal" href="#diagnostic-information" id="id2">Diagnostic information</a></p>
11 <ul class="small-gap">
12 <li><a class="reference internal" href="#viewing-process-statistics-with-the-task-manager" id="id3">Viewing process statistics with the task manager</a></li>
13 <li><a class="reference internal" href="#controlling-the-level-of-native-client-error-and-warning-messages" id="id4">Controlling the level of Native Client error and warning messages</a></li>
14 </ul>
15 </li>
16 <li><p class="first"><a class="reference internal" href="#basic-debugging" id="id5">Basic debugging</a></p>
17 <ul class="small-gap">
18 <li><a class="reference internal" href="#writing-messages-to-the-javascript-console" id="id6">Writing messages to the JavaScript console</a></li>
19 <li><a class="reference internal" href="#debugging-with-printf" id="id7">Debugging with printf</a></li>
20 <li><p class="first"><a class="reference internal" href="#using-chrome-s-stdout-and-stderr-streams" id="id8">Using Chrome&#8217;s stdout and stderr Streams</a></p>
21 <ul class="small-gap">
22 <li><a class="reference internal" href="#redirecting-output-to-log-files" id="id9">Redirecting output to log files</a></li>
23 </ul>
24 </li>
25 <li><a class="reference internal" href="#logging-calls-to-pepper-interfaces" id="id10">Logging calls to Pepper interfaces</a></li>
26 <li><a class="reference internal" href="#debugging-with-visual-studio" id="id11">Debugging with Visual Studio</a></li>
27 <li><p class="first"><a class="reference internal" href="#debugging-with-nacl-gdb" id="id12">Debugging with nacl-gdb</a></p>
28 <ul class="small-gap">
29 <li><a class="reference internal" href="#debugging-pnacl-pexes-pepper-35-or-later" id="id13">Debugging PNaCl pexes (Pepper 35 or later)</a></li>
30 <li><a class="reference internal" href="#debugging-pnacl-pexes-with-older-pepper-toolchains" id="id14">Debugging PNaCl pexes (with older Pepper toolchains)</a></li>
31 <li><a class="reference internal" href="#running-nacl-gdb" id="id15">Running nacl-gdb</a></li>
32 </ul>
33 </li>
34 </ul>
35 </li>
36 <li><a class="reference internal" href="#debugging-with-other-tools" id="id16">Debugging with other tools</a></li>
37 </ul>
39 </div><h2 id="diagnostic-information">Diagnostic information</h2>
40 <h3 id="viewing-process-statistics-with-the-task-manager">Viewing process statistics with the task manager</h3>
41 <p>You can use Chrome&#8217;s Task Manager to display information about a Native Client
42 application:</p>
43 <ol class="arabic simple">
44 <li>Open the Task Manager by clicking the menu icon <img alt="menu-icon" src="/native-client/images/menu-icon.png" /> and choosing
45 <strong>Tools &gt; Task manager</strong>.</li>
46 <li>When the Task Manager window appears, verify that the columns displaying
47 memory information are visible. If they are not, right click in the header
48 row and select the memory items from the popup menu that appears.</li>
49 </ol>
50 <p>A browser window running a Native Client application has at least two processes
51 associated with it: a process for the app&#8217;s top level (the render process
52 managing the page including its HTML and JavaScript) and one or more
53 processes for each instance of a Native Client module embedded in the page
54 (each process running native code from one nexe or pexe file). The top-level
55 process appears with the application&#8217;s icon and begins with the text &#8220;Tab:&#8221;.
56 A Native Client process appears with a Chrome extension icon (a jigsaw puzzle
57 piece <img alt="puzzle" src="/native-client/images/puzzle.png" />) and begins with the text &#8220;Native Client module:&#8221; followed by the
58 URL of its manifest file.</p>
59 <p>From the Task Manager you can view the changing memory allocations of all the
60 processes associated with a Native Client application. Each process has its own
61 memory footprint. You can also see the rendering rate displayed as frames per
62 second (FPS). Note that the computation of render frames can be performed in
63 any process, but the rendering itself is always done in the top level
64 application process, so look for the rendering rate there.</p>
65 <h3 id="controlling-the-level-of-native-client-error-and-warning-messages">Controlling the level of Native Client error and warning messages</h3>
66 <p>Native Client prints warning and error messages to stdout and stderr. You can
67 increase the amount of Native Client&#8217;s diagnostic output by setting the
68 following <a class="reference external" href="http://en.wikipedia.org/wiki/Environment_variable">environment variables</a>:</p>
69 <ul class="small-gap">
70 <li><code>NACL_PLUGIN_DEBUG=1</code></li>
71 <li><code>NACL_SRPC_DEBUG=[1-255]</code> (use a higher number for more verbose debug
72 output)</li>
73 <li><code>NACLVERBOSITY=[1-255]</code></li>
74 </ul>
75 <h2 id="basic-debugging">Basic debugging</h2>
76 <h3 id="writing-messages-to-the-javascript-console">Writing messages to the JavaScript console</h3>
77 <p>You can send messages from your C/C++ code to JavaScript using the
78 <code>PostMessage()</code> call in the <a class="reference internal" href="/native-client/devguide/coding/message-system.html"><em>Pepper messaging system</em></a>. When the JavaScript code receives a message, its
79 message event handler can call <a class="reference external" href="https://developer.mozilla.org/en/DOM/console.log">console.log()</a> to write the message to the
80 JavaScript <a class="reference external" href="/devtools/docs/console-api">console</a> in Chrome&#8217;s Developer Tools.</p>
81 <h3 id="debugging-with-printf">Debugging with printf</h3>
82 <p>Your C/C++ code can perform inline printf debugging to stdout and stderr by
83 calling fprintf() directly, or by using cover functions like these:</p>
84 <pre class="prettyprint">
85 #include &lt;stdio.h&gt;
86 void logmsg(const char* pMsg){
87 fprintf(stdout,&quot;logmsg: %s\n&quot;,pMsg);
89 void errormsg(const char* pMsg){
90 fprintf(stderr,&quot;logerr: %s\n&quot;,pMsg);
92 </pre>
93 <h3 id="using-chrome-s-stdout-and-stderr-streams"><span id="using-chromes-stdout-and-stderr"></span>Using Chrome&#8217;s stdout and stderr Streams</h3>
94 <p>By default stdout and stderr will appear in Chrome&#8217;s stdout and stderr stream
95 but they can also be redirected to log files. (See the next section.) On Mac and
96 Linux, launching Chrome from a terminal makes stderr and stdout appear in that
97 terminal. If you launch Chrome this way, be sure it doesn&#8217;t attach to an existing
98 instance. One simple way to do this is to pass a new directory to chrome as your
99 user data directory (<code>chrome --user-data-dir=&lt;newdir&gt;</code>).</p>
100 <h4 id="redirecting-output-to-log-files"><span id="redirecting-output-to-log"></span>Redirecting output to log files</h4>
101 <p>You can redirect stdout and stderr to output files by setting these environment
102 variables:</p>
103 <ul class="small-gap">
104 <li><code>NACL_EXE_STDOUT=c:\nacl_stdout.log</code></li>
105 <li><code>NACL_EXE_STDERR=c:\nacl_stderr.log</code></li>
106 </ul>
107 <p>There is another variable, <code>NACLLOG</code>, that you can use to redirect Native
108 Client&#8217;s internally-generated messages. This variable is set to stderr by
109 default; you can redirect these messages to an output file by setting the
110 variable as follows:</p>
111 <ul class="small-gap">
112 <li><code>NACLLOG=c:\nacl.log</code></li>
113 </ul>
114 <aside class="note">
115 <strong>Note:</strong> If you set the <code>NACL_EXE_STDOUT</code>, <code>NACL_EXE_STDERR</code>, or
116 <code>NACLLOG</code> variables to redirect output to a file, you must run Chrome with
117 the <code>--no-sandbox</code> flag. You must also be careful that each variable points
118 to a different file.
119 </aside>
120 <h3 id="logging-calls-to-pepper-interfaces">Logging calls to Pepper interfaces</h3>
121 <p>You can log all Pepper calls your module makes by passing the following flags
122 to Chrome on startup:</p>
123 <pre class="prettyprint">
124 --vmodule=ppb*=4 --enable-logging=stderr
125 </pre>
126 <p>The <code>vmodule</code> flag tells Chrome to log all calls to C Pepper interfaces that
127 begin with &#8220;ppb&#8221; (that is, the interfaces that are implemented by the browser
128 and that your module calls). The <code>enable-logging</code> flag tells Chrome to log
129 the calls to stderr.</p>
130 <h3 id="debugging-with-visual-studio"><span id="visual-studio"></span>Debugging with Visual Studio</h3>
131 <p>If you develop on a Windows platform you can use the <a class="reference internal" href="/native-client/devguide/devcycle/vs-addin.html"><em>Native Client Visual
132 Studio add-in</em></a> to write and debug your code. The add-in defines new
133 project platforms that let you run your module in two different modes: As a
134 Pepper plugin and as a Native Client module. When running as a Pepper plugin
135 you can use the built-in Visual Studio debugger. When running as a Native
136 Client module Visual Studio will launch an instance of nacl-gdb for you and
137 link it to the running code.</p>
138 <h3 id="debugging-with-nacl-gdb"><span id="using-gdb"></span>Debugging with nacl-gdb</h3>
139 <p>The Native Client SDK includes a command-line debugger that you can use to
140 debug Native Client modules. The debugger is based on the GNU debugger <a class="reference external" href="http://www.gnu.org/software/gdb/">gdb</a>, and is located at
141 <code>pepper_&lt;version&gt;/toolchain/&lt;platform&gt;_x86_newlib/bin/x86_64-nacl-gdb</code> (where
142 <em>&lt;platform&gt;</em> is the platform of your development machine: <code>win</code>, <code>mac</code>, or
143 <code>linux</code>).</p>
144 <p>Note that this same copy of GDB can be used to debug any NaCl program,
145 whether built using newlib or glibc for x86-32, x86-64 or ARM. In the SDK,
146 <code>i686-nacl-gdb</code> is an alias for <code>x86_64-nacl-gdb</code>, and the <code>newlib</code>
147 and <code>glibc</code> toolchains both contain the same version of GDB.</p>
148 <h4 id="debugging-pnacl-pexes-pepper-35-or-later"><span id="debugging-pnacl-pexes"></span>Debugging PNaCl pexes (Pepper 35 or later)</h4>
149 <p>If you want to use GDB to debug a program that is compiled with the PNaCl
150 toolchain, you must have a copy of the pexe from <strong>before</strong> running
151 <code>pnacl-finalize</code>. The <code>pnacl-finalize</code> tool converts LLVM bitcode
152 to the stable PNaCl bitcode format, but it also strips out debug
153 metadata, which we need for debugging. In this section we&#8217;ll give the
154 LLVM bitcode file a <code>.bc</code> file extension, and the PNaCl bitcode file
155 a <code>.pexe</code> file extension. The actual extension should not matter, but
156 it helps distinguish between the two types of files.</p>
157 <p><strong>Note</strong> unlike the finalized copy of the pexe, the non-finalized debug copy
158 is not considered stable. This means that a debug copy of the PNaCl
159 application created by a Pepper N SDK is only guaranteed to run
160 with a matching Chrome version N. If the version of the debug bitcode pexe
161 does not match that of Chrome then the translation process may fail, and
162 you will see an error message in the JavaScript console.</p>
163 <p>Also, make sure you are passing the <code>-g</code> <a class="reference internal" href="/native-client/devguide/devcycle/building.html#compile-flags"><em>compile option</em></a>
164 to <code>pnacl-clang</code> to enable generating debugging info. You might also want to
165 omit <code>-O2</code> from the compile-time and link-time options, otherwise GDB not
166 might be able to print variables&#8217; values when debugging (this is more of a
167 problem with the PNaCl/LLVM toolchain than with GCC).</p>
168 <p>Once you have built a non-stable debug copy of the pexe, list the URL of
169 that copy in your application&#8217;s manifest file:</p>
170 <pre class="prettyprint">
172 &quot;program&quot;: {
173 &quot;portable&quot;: {
174 &quot;pnacl-translate&quot;: {
175 &quot;url&quot;: &quot;release_version.pexe&quot;,
176 &quot;optlevel&quot;: 2
178 &quot;pnacl-debug&quot;: {
179 &quot;url&quot;: &quot;debug_version.bc&quot;,
180 &quot;optlevel&quot;: 0
185 </pre>
186 <p>Copy the <code>debug_version.bc</code> and <code>nmf</code> files to the location that
187 your local web server serves files from.</p>
188 <p>When you run Chrome with <code>--enable-nacl-debug</code>, Chrome will translate
189 and run the <code>debug_version.bc</code> instead of <code>release_version.pexe</code>.
190 Once the debug version is loaded, you are ready to <a class="reference internal" href="#running-nacl-gdb"><em>run nacl-gdb</em></a></p>
191 <p>Whether you publish the NMF file containing the debug URL to the
192 release web server, is up to you. One reason to avoid publishing the
193 debug URL is that it is only guaranteed to work for the Chrome version
194 that matches the SDK version. Developers who may have left the
195 <code>--enable-nacl-debug</code> flag turned on may end up loading the debug
196 copy of your application (which may or may not work, depending on
197 their version of Chrome).</p>
198 <h4 id="debugging-pnacl-pexes-with-older-pepper-toolchains"><span id="debugging-pexes-via-nexes"></span>Debugging PNaCl pexes (with older Pepper toolchains)</h4>
199 <p>If you want to use GDB to debug a program that is compiled with the PNaCl
200 toolchain, you must convert the <code>pexe</code> file to a <code>nexe</code>. (You can skip
201 this step if you are using the GCC toolchain, or if you are using
202 pepper 35 or later.)</p>
203 <ul class="small-gap">
204 <li>Firstly, make sure you are passing the <code>-g</code> <a class="reference internal" href="/native-client/devguide/devcycle/building.html#compile-flags"><em>compile option</em></a> to <code>pnacl-clang</code> to enable generating debugging info.
205 You might also want to omit <code>-O2</code> from the compile-time and link-time
206 options.</li>
207 <li><p class="first">Secondly, use <code>pnacl-translate</code> to convert your <code>pexe</code> to one or more</p>
208 <p><code>nexe</code> files. For example:</p>
209 <pre>
210 nacl_sdk/pepper_&lt;version&gt;/toolchain/win_pnacl/bin/pnacl-translate \
211 --allow-llvm-bitcode-input hello_world.pexe -arch x86-32 \
212 -o hello_world_x86_32.nexe
213 nacl_sdk/pepper_&lt;version&gt;/toolchain/win_pnacl/bin/pnacl-translate \
214 --allow-llvm-bitcode-input hello_world.pexe -arch x86-64 \
215 -o hello_world_x86_64.nexe
216 </pre>
217 <p>For this, use the non-finalized <code>pexe</code> file produced by
218 <code>pnacl-clang</code>, not the <code>pexe</code> file produced by <code>pnacl-finalize</code>.
219 The latter <code>pexe</code> has debugging info stripped out. The option
220 <code>--allow-llvm-bitcode-input</code> tells <code>pnacl-translate</code> to accept a
221 non-finalized <code>pexe</code>.</p>
222 </li>
223 <li><p class="first">Replace the <code>nmf</code> <a class="reference internal" href="/native-client/devguide/coding/application-structure.html#manifest-file"><em>manifest file</em></a> that points to
224 your <code>pexe</code> file with one that points to the <code>nexe</code> files. For the
225 example <code>nexe</code> filenames above, the new <code>nmf</code> file would contain:</p>
226 <pre>
228 &quot;program&quot;: {
229 &quot;x86-32&quot;: {&quot;url&quot;: &quot;hello_world_x86_32.nexe&quot;},
230 &quot;x86-64&quot;: {&quot;url&quot;: &quot;hello_world_x86_64.nexe&quot;},
233 </pre>
234 </li>
235 <li>Change the <code>&lt;embed&gt;</code> HTML element to use
236 <code>type=&quot;application/x-nacl&quot;</code> rather than
237 <code>type=&quot;application/x-pnacl&quot;</code>.</li>
238 <li>Copy the <code>nexe</code> and <code>nmf</code> files to the location that your local web
239 server serves files from.</li>
240 </ul>
241 <aside class="note">
242 <strong>Note:</strong> If you know whether Chrome is using the x86-32 or x86-64
243 version of the NaCl sandbox on your system, you can translate the
244 <code>pexe</code> once to a single x86-32 or x86-64 <code>nexe</code>. Otherwise, you
245 might find it easier to translate the <code>pexe</code> to both <code>nexe</code>
246 formats as described above.
247 </aside>
248 <h4 id="running-nacl-gdb"><span id="id1"></span>Running nacl-gdb</h4>
249 <p>Before you start using nacl-gdb, make sure you can <a class="reference internal" href="/native-client/devguide/devcycle/building.html"><em>build</em></a> your
250 module and <a class="reference internal" href="/native-client/devguide/devcycle/running.html"><em>run</em></a> your application normally. This will verify
251 that you have created all the required <a class="reference internal" href="/native-client/devguide/coding/application-structure.html"><em>application parts</em></a> (.html, .nmf, and .nexe files, shared
252 libraries, etc.), that your server can access those resources, and that you&#8217;ve
253 configured Chrome correctly to run your application. The instructions below
254 assume that you are using a <a class="reference internal" href="/native-client/devguide/devcycle/running.html#web-server"><em>local server</em></a> to run your
255 application; one benefit of doing it this way is that you can check the web
256 server output to confirm that your application is loading the correct
257 resources. However, some people prefer to run their application as an unpacked
258 extension, as described in <a class="reference internal" href="/native-client/devguide/devcycle/running.html"><em>Running Native Client Applications</em></a>.</p>
259 <p>Follow the instructions below to debug your module with nacl-gdb:</p>
260 <ol class="arabic">
261 <li><p class="first">Compile your module with the <code>-g</code> flag so that your .nexe retains symbols
262 and other debugging information (see the <a class="reference internal" href="/native-client/devguide/devcycle/building.html#compile-flags"><em>recommended compile flags</em></a>).</p>
263 </li>
264 <li><p class="first">Launch a local web server (e.g., the <a class="reference internal" href="/native-client/devguide/devcycle/running.html#web-server"><em>web server</em></a> included
265 in the SDK).</p>
266 </li>
267 <li><p class="first">Launch Chrome with these three required flags: <code>--enable-nacl --enable-nacl-debug --no-sandbox</code>.</p>
268 <p>You may also want to use some of the optional flags listed below. A typical
269 command looks like this:</p>
270 <pre class="prettyprint">
271 chrome --enable-nacl --enable-nacl-debug --no-sandbox --disable-hang-monitor localhost:5103
272 </pre>
273 <p><strong>Required flags:</strong></p>
274 <dl class="docutils">
275 <dt><code>--enable-nacl</code></dt>
276 <dd><p class="first last">Enables Native Client for all applications, including those that are
277 launched outside the Chrome Web Store.</p>
278 </dd>
279 <dt><code>--enable-nacl-debug</code></dt>
280 <dd><p class="first last">Turns on the Native Client debug stub, opens TCP port 4014, and pauses
281 Chrome to let the debugger connect.</p>
282 </dd>
283 <dt><code>--no-sandbox</code></dt>
284 <dd><p class="first last">Turns off the Chrome sandbox (not the Native Client sandbox). This enables
285 the stdout and stderr streams, and lets the debugger connect.</p>
286 </dd>
287 </dl>
288 <p><strong>Optional flags:</strong></p>
289 <dl class="docutils">
290 <dt><code>--disable-hang-monitor</code></dt>
291 <dd><p class="first last">Prevents Chrome from displaying a warning when a tab is unresponsive.</p>
292 </dd>
293 <dt><code>--user-data-dir=&lt;directory&gt;</code></dt>
294 <dd><p class="first last">Specifies the <a class="reference external" href="http://www.chromium.org/user-experience/user-data-directory">user data directory</a> from which
295 Chrome should load its state. You can specify a different user data
296 directory so that changes you make to Chrome in your debugging session do
297 not affect your personal Chrome data (history, cookies, bookmarks, themes,
298 and settings).</p>
299 </dd>
300 <dt><code>--nacl-debug-mask=&lt;nmf_url_mask1,nmf_url_mask2,...&gt;</code></dt>
301 <dd><p class="first last">Specifies a set of debug mask patterns. This allows you to selectively
302 choose to debug certain applications and not debug others. For example, if
303 you only want to debug the NMF files for your applications at
304 <code>https://example.com/app</code>, and no other NaCl applications found on the
305 web, specify <code>--nacl-debug-mask=https://example.com/app/*.nmf</code>. This
306 helps prevent accidentally debugging other NaCl applications if you like
307 to leave the <code>--enable-nacl-debug</code> flag turned on. The pattern language
308 for the mask follows <a class="reference external" href="/extensions/match_patterns">chrome extension match patterns</a>. The pattern set can be inverted by
309 prefixing the pattern set with the <code>!</code> character.</p>
310 </dd>
311 <dt><code>&lt;URL&gt;</code></dt>
312 <dd><p class="first last">Specifies the URL Chrome should open when it launches. The local server
313 that comes with the SDK listens on port 5103 by default, so the URL when
314 you&#8217;re debugging is typically <code>localhost:5103</code> (assuming that your
315 application&#8217;s page is called index.html and that you run the local server
316 in the directory where that page is located).</p>
317 </dd>
318 </dl>
319 </li>
320 <li><p class="first">Navigate to your application&#8217;s page in Chrome. (You don&#8217;t need to do this if
321 you specified a URL when you launched Chrome in the previous step.) Chrome
322 will start loading the application, then pause and wait until you start
323 nacl-gdb and run the <code>continue</code> command.</p>
324 </li>
325 <li><p class="first">Go to the directory with your source code, and run nacl-gdb from there. For
326 example:</p>
327 <pre class="prettyprint">
328 cd nacl_sdk/pepper_&lt;version&gt;/examples/demo/drive
329 nacl_sdk/pepper_&lt;version&gt;/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb
330 </pre>
331 <p>The debugger will start and show you a gdb prompt:</p>
332 <pre class="prettyprint">
333 (gdb)
334 </pre>
335 </li>
336 <li><p class="first">Run the debugging command lines.</p>
337 <p><strong>For PNaCl</strong>:</p>
338 <pre class="prettyprint">
339 (gdb) target remote localhost:4014
340 (gdb) remote get nexe &lt;path-to-save-translated-nexe-with-debug-info&gt;
341 (gdb) file &lt;path-to-save-translated-nexe-with-debug-info&gt;
342 (gdb) remote get irt &lt;path-to-save-NaCl-integrated-runtime&gt;
343 (gdb) nacl-irt &lt;path-to-saved-NaCl-integrated-runtime&gt;
344 </pre>
345 <p><strong>For NaCl</strong>:</p>
346 <pre class="prettyprint">
347 (gdb) target remote localhost:4014
348 (gdb) nacl-manifest &lt;path-to-your-.nmf-file&gt;
349 (gdb) remote get irt &lt;path-to-save-NaCl-integrated-runtime&gt;
350 (gdb) nacl-irt &lt;path-to-saved-NaCl-integrated-runtime&gt;
351 </pre>
352 </li>
353 <li><p class="first">The command used for PNaCl and NaCl are described below:</p>
354 <dl class="docutils">
355 <dt><code>target remote localhost:4014</code></dt>
356 <dd><p class="first last">Tells the debugger how to connect to the debug stub in the Native Client
357 application loader. This connection occurs through TCP port 4014 (note
358 that this port is distinct from the port which the local web server uses
359 to listen for incoming requests, typically port 5103). If you are
360 debugging multiple applications at the same time, the loader may choose
361 a port that is different from the default 4014 port. See the Chrome
362 task manager for the debug port.</p>
363 </dd>
364 <dt><code>remote get nexe &lt;path&gt;</code></dt>
365 <dd><p class="first last">This saves the application&#8217;s main executable (nexe) to <code>&lt;path&gt;</code>.
366 For PNaCl, this provides a convenient way to access the nexe that is
367 a <strong>result</strong> of translating your pexe. This can then be loaded with
368 the <code>file &lt;path&gt;</code> command.</p>
369 </dd>
370 <dt><code>nacl-manifest &lt;path&gt;</code></dt>
371 <dd><p class="first last">For NaCl (not PNaCl), this tells the debugger where to find your
372 application&#8217;s executable (.nexe) files. The application&#8217;s manifest
373 (.nmf) file lists your application&#8217;s executable files, as well as any
374 libraries that are linked with the application dynamically.</p>
375 </dd>
376 <dt><code>remote get irt &lt;path&gt;</code></dt>
377 <dd><p class="first last">This saves the Native Client Integrated Runtime (IRT). Normally,
378 the IRT is located in the same directory as the Chrome executable,
379 or in a subdirectory named after the Chrome version. For example, if
380 you&#8217;re running Chrome canary on Windows, the path to the IRT typically
381 looks something like <code>C:/Users/&lt;username&gt;/AppData/Local/Google/Chrome
382 SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe</code>.
383 The <code>remote get irt &lt;path&gt;</code> saves that to the current working
384 directory so that you do not need to find where exactly the IRT
385 is stored.</p>
386 </dd>
387 <dt><code>nacl-irt &lt;path&gt;</code></dt>
388 <dd><p class="first last">Tells the debugger where to find the Native Client Integrated Runtime
389 (IRT). <code>&lt;path&gt;</code> can either be the location of the copy saved by
390 <code>remote get irt &lt;path&gt;</code> or the copy that is installed alongside Chrome.</p>
391 </dd>
392 </dl>
393 <p>A couple of notes on how to specify path names in the nacl-gdb commands
394 above:</p>
395 <ul class="small-gap">
396 <li><p class="first">You can use a forward slash to separate directories on Linux, Mac, and
397 Windows. If you use a backslash to separate directories on Windows, you
398 must escape the backslash by using a double backslash &#8220;\&#8221; between
399 directories.</p>
400 </li>
401 <li><p class="first">If any directories in the path have spaces in their name, you must put
402 quotation marks around the path.</p>
403 </li>
404 </ul>
405 <p>As an example, here is a what these nacl-gdb commands might look like on
406 Windows:</p>
407 <pre class="prettyprint">
408 target remote localhost:4014
409 nacl-manifest &quot;C:/nacl_sdk/pepper_&lt;version&gt;/examples/hello_world_gles/newlib/Debug/hello_world_gles.nmf&quot;
410 nacl-irt &quot;C:/Users/&lt;username&gt;/AppData/Local/Google/Chrome SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe&quot;
411 </pre>
412 <p>To save yourself some typing, you can put put these nacl-gdb commands in a
413 script file, and execute the file when you run nacl-gdb, like so:</p>
414 <pre class="prettyprint">
415 nacl_sdk/pepper_&lt;version&gt;/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb -x &lt;nacl-script-file&gt;
416 </pre>
417 <p>If nacl-gdb connects successfully to Chrome, it displays a message such as
418 the one below, followed by a gdb prompt:</p>
419 <pre class="prettyprint">
420 0x000000000fc00200 in _start ()
421 (gdb)
422 </pre>
423 <p>If nacl-gdb can&#8217;t connect to Chrome, it displays a message such as
424 &#8220;<code>localhost:4014: A connection attempt failed</code>&#8221; or &#8220;<code>localhost:4014:
425 Connection timed out.</code>&#8221; If you see a message like that, make sure that you
426 have launched a web server, launched Chrome, and navigated to your
427 application&#8217;s page before starting nacl-gdb.</p>
428 </li>
429 </ol>
430 <p>Once nacl-gdb connects to Chrome, you can run standard gdb commands to execute
431 your module and inspect its state. Some commonly used commands are listed
432 below.</p>
433 <dl class="docutils">
434 <dt><code>break &lt;location&gt;</code></dt>
435 <dd><p class="first">set a breakpoint at &lt;location&gt;, e.g.:</p>
436 <pre class="last prettyprint">
437 break hello_world.cc:79
438 break hello_world::HelloWorldInstance::HandleMessage
439 break Render
440 </pre>
441 </dd>
442 <dt><code>continue</code></dt>
443 <dd>resume normal execution of the program</dd>
444 <dt><code>next</code></dt>
445 <dd>execute the next source line, stepping over functions</dd>
446 <dt><code>step</code></dt>
447 <dd>execute the next source line, stepping into functions</dd>
448 <dt><code>print &lt;expression&gt;</code></dt>
449 <dd>print the value of &lt;expression&gt; (e.g., variables)</dd>
450 <dt><code>backtrace</code></dt>
451 <dd>print a stack backtrace</dd>
452 <dt><code>info breakpoints</code></dt>
453 <dd>print a table of all breakpoints</dd>
454 <dt><code>delete &lt;breakpoint&gt;</code></dt>
455 <dd>delete the specified breakpoint (you can use the breakpoint number displayed
456 by the info command)</dd>
457 <dt><code>help &lt;command&gt;</code></dt>
458 <dd>print documentation for the specified gdb &lt;command&gt;</dd>
459 <dt><code>quit</code></dt>
460 <dd>quit gdb</dd>
461 </dl>
462 <p>See the <a class="reference external" href="http://sourceware.org/gdb/current/onlinedocs/gdb/#toc_Top">gdb documentation</a> for a
463 comprehensive list of gdb commands. Note that you can abbreviate most commands
464 to just their first letter (<code>b</code> for break, <code>c</code> for continue, and so on).</p>
465 <p>To interrupt execution of your module, press &lt;Ctrl-c&gt;. When you&#8217;re done
466 debugging, close the Chrome window and type <code>q</code> to quit gdb.</p>
467 <h2 id="debugging-with-other-tools">Debugging with other tools</h2>
468 <p>If you cannot use the <a class="reference internal" href="#visual-studio"><em>Visual Studio add-in</em></a>, or you want
469 to use a debugger other than nacl-gdb, you must manually build your module as a
470 Pepper plugin (sometimes referred to as a &#8220;<a class="reference external" href="http://www.chromium.org/nativeclient/getting-started/getting-started-background-and-basics#TOC-Trusted-vs-Untrusted">trusted</a>&#8221;
471 or &#8220;in-process&#8221; plugin). Pepper plugins (.DLL files on Windows; .so files on
472 Linux; .bundle files on Mac) are loaded directly in either the Chrome renderer
473 process or a separate plugin process, rather than in Native Client. Building a
474 module as a trusted Pepper plugin allows you to use standard debuggers and
475 development tools on your system, but when you&#8217;re finished developing the
476 plugin, you need to port it to Native Client (i.e., build the module with one of
477 the toolchains in the NaCl SDK so that the module runs in Native Client). For
478 details on this advanced development technique, see <a class="reference external" href="http://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin">Debugging a Trusted Plugin</a>.
479 Note that starting with the <code>pepper_22</code> bundle, the NaCl SDK for Windows
480 includes pre-built libraries and library source code, making it much easier to
481 build a module into a .DLL.</p>
482 </section>
484 {{/partials.standard_nacl_article}}