[SyncFS] Build indexes from FileTracker entries on disk.
[chromium-blink-merge.git] / native_client_sdk / src / doc / devguide / devcycle / debugging.rst
blob974b1e7deef5a546df19ae23352605e38a14cb63
1 .. _devcycle-debugging:
3 #########
4 Debugging
5 #########
7 This document describes tools and techniques you can use to debug, monitor,
8 and measure your application's performance.
10 .. contents:: Table Of Contents
11   :local:
12   :backlinks: none
13   :depth: 3
15 Diagnostic information
16 ======================
18 Viewing process statistics with the task manager
19 ------------------------------------------------
21 You can use Chrome's Task Manager to display information about a Native Client
22 application:
24 #. Open the Task Manager by clicking the menu icon |menu-icon| and choosing
25    **Tools > Task manager**.
26 #. When the Task Manager window appears, verify that the columns displaying
27    memory information are visible. If they are not, right click in the header
28    row and select the memory items from the popup menu that appears.
30 A browser window running a Native Client application will have at least two
31 processes associated with it: a process for the app's top level (the render
32 process managing the page including its HTML and any JavaScript) and one or
33 more processes for each instance of a Native Client module embedded in the page
34 (each process running native code from one nexe file). The top-level process
35 appears with the application's icon and begins with the text "App:". A Native
36 Client process appears with a Chrome extension icon (a jigsaw puzzle piece
37 |puzzle|) and begins with the text "Native Client module" followed by the URL
38 of its manifest file.
40 From the Task Manager you can view the changing memory allocations of all the
41 processes associated with a Native Client application. Each process has its own
42 memory footprint. You can also see the rendering rate displayed as frames per
43 second (FPS). Note that the computation of render frames can be performed in
44 any process, but the rendering itself is always done in the top level
45 application process, so look for the rendering rate there.
47 Controlling the level of Native Client error and warning messages
48 -----------------------------------------------------------------
50 Native Client prints warning and error messages to stdout and stderr. You can
51 increase the amount of Native Client's diagnostic output by setting the
52 following `environment variables
53 <http://en.wikipedia.org/wiki/Environment_variable>`_:
55 * NACL_PLUGIN_DEBUG=1
56 * NACL_SRPC_DEBUG=[1-255] (use a higher number for more verbose debug output)
57 * NACLVERBOSITY=[1-255]
59 Basic debugging
60 ===============
62 Writing messages to the JavaScript console
63 ------------------------------------------
65 You can send messages from your C/C++ code to JavaScript using the PostMessage
66 call in the :doc:`Pepper messaging system <../coding/message-system>`. When the
67 JavaScript code receives a message, its message event handler can call
68 `console.log() <https://developer.mozilla.org/en/DOM/console.log>`_ to write
69 the message to the JavaScript `console </devtools/docs/console-api>`_ in
70 Chrome's Developer Tools.
72 Debugging with printf
73 ---------------------
75 Your C/C++ code can perform inline printf debugging to stdout and stderr by
76 calling fprintf() directly, or by using cover functions like these:
78 .. naclcode::
80   #include <stdio.h>
81   void logmsg(const char* pMsg){
82     fprintf(stdout,"logmsg: %s\n",pMsg);
83   }
84   void errormsg(const char* pMsg){
85     fprintf(stderr,"logerr: %s\n",pMsg);
86   }
88 By default stdout and stderr will appear in Chrome's stdout and stderr stream
89 but they can also be redirected as described below.
91 Redirecting output to log files
92 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94 You can redirect stdout and stderr to output files by setting these environment variables:
96 * ``NACL_EXE_STDOUT=c:\nacl_stdout.log``
97 * ``NACL_EXE_STDERR=c:\nacl_stderr.log``
99 There is another variable, ``NACLLOG``, that you can use to redirect Native
100 Client's internally-generated messages. This variable is set to stderr by
101 default; you can redirect these messages to an output file by setting the
102 variable as follows:
104 * ``NACLLOG=c:\nacl.log``
106 .. Note::
107   :class: note
109   **Note:** If you set the NACL_EXE_STDOUT, NACL_EXE_STDERR, or NACLLOG
110   variables to redirect output to a file, you must run Chrome with the
111   ``--no-sandbox`` flag.  You must also be careful that each variable points to
112   a different file.
114 Redirecting output to the JavaScript console
115 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117 You can also cause output from printf statements in your C/C++ code to be
118 relayed to the JavaScript side of your application through the Pepper messaging
119 system, where you can then write the output to the JavaScript console. Follow
120 these steps:
122 #. Set the NACL_EXE_STDOUT and NACL_EXE_STDERR environment variables as
123    follows:
125    * NACL_EXE_STDOUT=DEBUG_ONLY:dev://postmessage
126    * NACL_EXE_STDERR=DEBUG_ONLY:dev://postmessage
128    These settings tell Native Client to use PostMessage() to send output that
129    your Native Client module writes to stdout and stderr to the JavaScript side
130    of your application.
132 #. Register a JavaScript handler to receive messages from your Native Client
133    module:
135    .. naclcode::
137      <div id="nacl_container">
138        <script type="text/javascript">
139          var container = document.getElementById('nacl_container');
140          container.addEventListener('message', handleMessage, true);
141        </script>
142        <embed id="nacl_module"
143               src="my_application.nmf"
144               type="application/x-nacl" />
145      </div>
147 #. Implement a simple JavaScript handler that logs the messages it receives to
148    the JavaScript console:
150    .. naclcode::
152      function handleMessage(message_event) {
153        console.log(message_event.data);
154      }
156    This handler works in the simple case where the only messages your Native
157    Client module sends to JavaScript are messages with the output from stdout
158    and stderr. If your Native Client module also sends other messages to
159    JavaScript, your handler will need to be more complex.
161    Once you've implemented a message handler and set up the environment
162    variables as described above, you can check the JavaScript console to see
163    output that your Native Client module prints to stdout and stderr. Keep in
164    mind that your module makes a call to PostMessage() every time it flushes
165    stdout or stderr.  Your application's performance will degrade considerably
166    if your module prints and flushes frequently, or if it makes frequent Pepper
167    calls to begin with (e.g., to render).
169 Logging calls to Pepper interfaces
170 ----------------------------------
172 You can log all Pepper calls your module makes by passing the following flags
173 to Chrome on startup::
175   --vmodule=ppb*=4 --enable-logging=stderr
178 The ``vmodule`` flag tells Chrome to log all calls to C Pepper interfaces that
179 begin with "ppb" (that is, the interfaces that are implemented by the browser
180 and that your module calls). The ``enable-logging`` flag tells Chrome to log
181 the calls to stderr.
183 .. _visual_studio:
185 Debugging with Visual Studio
186 ----------------------------
188 If you develop on a Windows platform you can use the :doc:`Native Client Visual
189 Studio add-in <vs-addin>` to write and debug your code. The add-in defines new
190 project platforms that let you run your module in two different modes: As a
191 Pepper plugin and as a Native Client module. When running as a Pepper plugin
192 you can use the built-in Visual Studio debugger. When running as a Native
193 Client module Visual Studio will launch an instance of nacl-gdb for you and
194 link it to the running code.
196 .. _using_gdb:
198 Debugging with nacl-gdb
199 -----------------------
201 The Native Client SDK includes a command-line debugger that you can use to
202 debug Native Client modules. The debugger is based on the GNU debugger `gdb
203 <http://www.gnu.org/software/gdb/>`_, and is located at
204 ``toolchain/<platform>_x86_newlib/bin/x86_64-nacl-gdb`` (where *<platform>*
205 is the platform of your development machine: ``win``, ``mac``, or
206 ``linux``).
208 Note that this same copy of GDB can be used to debug any NaCl program,
209 whether built using newlib or glibc for x86-32, x86-64 or ARM.  In the SDK,
210 ``i686-nacl-gdb`` is an alias for ``x86_64-nacl-gdb``, and the ``newlib``
211 and ``glibc`` toolchains both contain the same version of GDB.
213 .. _debugging_pnacl_pexes:
215 Debugging PNaCl pexes (with Pepper 35+)
216 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
218 If you want to use GDB to debug a program that is compiled with the PNaCl
219 toolchain, you must have a copy of the pexe from **before** running
220 ``pnacl-finalize``. The ``pnacl-finalize`` tool converts LLVM bitcode
221 to the stable PNaCl bitcode format, but it also strips out debug
222 metadata, which we need for debugging. In this section we'll give the
223 LLVM bitcode file a ``.bc`` file extension, and the PNaCl bitcode file
224 a ``.pexe`` file extension. The actual extension should not matter, but
225 it helps distinguish between the two types of files.
227 **Note** unlike the finalized copy of the pexe, the non-finalized debug copy
228 is not considered stable. This means that a debug copy of the PNaCl
229 application created by a Pepper N SDK is only guaranteed to run
230 with a matching Chrome version N. If the version of the debug bitcode pexe
231 does not match that of Chrome then the translation process may fail, and
232 you will see and error message in the JavaScript console.
234 Also, make sure you are passing the ``-g`` :ref:`compile option
235 <compile_flags>` to ``pnacl-clang`` to enable generating debugging info.
236 You might also want to omit ``-O2`` from the compile-time and link-time
237 options, otherwise GDB not might be able to print variables' values when
238 debugging (this is more of a problem with the PNaCl/LLVM toolchain than
239 with GCC).
241 Once you have built a non-stable debug copy of the pexe, list the URL of
242 that copy in your application's manifest file:
244 .. naclcode::
246   {
247     "program": {
248       "pnacl-translate": {
249         "url": "release_version.pexe",
250         "optlevel": 2
251       },
252       "pnacl-debug": {
253         "url": "debug_version.bc",
254         "optlevel": 0
255       }
256     }
257   }
259 Copy the ``debug_version.bc`` and ``nmf`` files to the location that
260 your local web server serves files from.
262 When you run Chrome with ``--enable-nacl-debug``, Chrome will translate
263 and run the ``debug_version.bc`` instead of ``release_version.pexe``.
264 Once the debug version is loaded, you are ready to :ref:`run nacl-gdb
265 <running_nacl_gdb>`
267 Whether you publish the NMF file containing the debug URL to the release
268 web server, is up to you. One reason to avoid publishing the debug URL
269 is that it is only guaranteed to work for the Chrome version that matches
270 the SDK version. Developers who may have left the ``--enable-nacl-debug``
271 flag turned on may end up loading the debug copy of your application
272 (which may or may not work, depending on their version of Chrome).
275 Debugging PNaCl pexes (with older Pepper toolchains)
276 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
278 If you want to use GDB to debug a program that is compiled with the PNaCl
279 toolchain, you must convert the ``pexe`` file to a ``nexe``.  (You can skip
280 this step if you are using the GCC toolchain, or if you are using
281 pepper 35 or later.)
283 * Firstly, make sure you are passing the ``-g`` :ref:`compile option
284   <compile_flags>` to ``pnacl-clang`` to enable generating debugging info.
285   You might also want to omit ``-O2`` from the compile-time and link-time
286   options.
288 * Secondly, use ``pnacl-translate`` to convert your ``pexe`` to one or more
289   ``nexe`` files.  For example:
291   .. naclcode::
292     :prettyprint: 0
294     <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^
295       --allow-llvm-bitcode-input hello_world.pexe -arch x86-32 -o hello_world_x86_32.nexe
296     <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^
297       --allow-llvm-bitcode-input hello_world.pexe -arch x86-64 -o hello_world_x86_64.nexe
299   For this, use the non-finalized ``pexe`` file produced by
300   ``pnacl-clang``, not the ``pexe`` file produced by ``pnacl-finalize``.
301   The latter ``pexe`` has debugging info stripped out.  The option
302   ``--allow-llvm-bitcode-input`` tells ``pnacl-translate`` to accept a
303   non-finalized ``pexe``.
305 * Replace the ``nmf`` :ref:`manifest file <manifest_file>` that points to
306   your ``pexe`` file with one that points to the ``nexe`` files.  For the
307   example ``nexe`` filenames above, the new ``nmf`` file would contain:
309   .. naclcode::
310     :prettyprint: 0
312     {
313       "program": {
314         "x86-32": {"url": "hello_world_x86_32.nexe"},
315         "x86-64": {"url": "hello_world_x86_64.nexe"},
316       }
317     }
319 * Change the ``<embed>`` HTML element to use
320   ``type="application/x-nacl"`` rather than
321   ``type="application/x-pnacl"``.
323 * Copy the ``nexe`` and ``nmf`` files to the location that your local web
324   server serves files from.
326 .. Note::
327   :class: note
329   **Note:** If you know whether Chrome is using the x86-32 or x86-64
330   version of the NaCl sandbox on your system, you can translate the
331   ``pexe`` once to a single x86-32 or x86-64 ``nexe``.  Otherwise, you
332   might find it easier to translate the ``pexe`` to both ``nexe``
333   formats as described above.
335 .. _running_nacl_gdb:
337 Running nacl-gdb
338 ~~~~~~~~~~~~~~~~
340 Before you start using nacl-gdb, make sure you can :doc:`build <building>` your
341 module and :doc:`run <running>` your application normally. This will verify
342 that you have created all the required :doc:`application parts
343 <../coding/application-structure>` (.html, .nmf, and .nexe files, shared
344 libraries, etc.), that your server can access those resources, and that you've
345 configured Chrome correctly to run your application.  The instructions below
346 assume that you are using a :ref:`local server <web_server>` to run your
347 application; one benefit of doing it this way is that you can check the web
348 server output to confirm that your application is loading the correct
349 resources. However, some people prefer to run their application as an unpacked
350 extension, as described in :doc:`Running Native Client Applications <running>`.
352 Follow the instructions below to debug your module with nacl-gdb:
354 #. Compile your module with the ``-g`` flag so that your .nexe retains symbols
355    and other debugging information (see the :ref:`recommended compile flags
356    <compile_flags>`).
357 #. Launch a local web server (e.g., the :ref:`web server <web_server>` included
358    in the SDK).
359 #. Launch Chrome with these three required flags: ``--enable-nacl --enable-nacl-debug --no-sandbox``.
361    You may also want to use some of the optional flags listed below. A typical
362    command looks like this::
364      chrome --enable-nacl --enable-nacl-debug --no-sandbox --disable-hang-monitor localhost:5103
366    **Required flags:**
368    ``--enable-nacl``
369      Enables Native Client for all applications, including those that are
370      launched outside the Chrome Web Store.
372    ``--enable-nacl-debug``
373      Turns on the Native Client debug stub, opens TCP port 4014, and pauses
374      Chrome to let the debugger connect.
376    ``--no-sandbox``
377      Turns off the Chrome sandbox (not the Native Client sandbox). This enables
378      the stdout and stderr streams, and lets the debugger connect.
380    **Optional flags:**
382    ``--disable-hang-monitor``
383      Prevents Chrome from displaying a warning when a tab is unresponsive.
385    ``--user-data-dir=<directory>``
386      Specifies the `user data directory
387      <http://www.chromium.org/user-experience/user-data-directory>`_ from which
388      Chrome should load its state.  You can specify a different user data
389      directory so that changes you make to Chrome in your debugging session do
390      not affect your personal Chrome data (history, cookies, bookmarks, themes,
391      and settings).
393    ``--nacl-debug-mask=<nmf_url_mask1,nmf_url_mask2,...>``
394      Specifies a set of debug mask patterns. This allows you to selectively
395      choose to debug certain applications and not debug others. For example, if
396      you only want to debug the NMF files for your applications at
397      ``https://example.com/app``, and no other NaCl applications found on the
398      web, specify ``--nacl-debug-mask=https://example.com/app/*.nmf``.  This
399      helps prevent accidentally debugging other NaCl applications if you like
400      to leave the ``--enable-nacl-debug`` flag turned on.  The pattern language
401      for the mask follows `chrome extension match patterns
402      </extensions/match_patterns>`_.  The pattern set can be inverted by
403      prefixing the pattern set with the ``!`` character.
405    ``<URL>``
406      Specifies the URL Chrome should open when it launches. The local server
407      that comes with the SDK listens on port 5103 by default, so the URL when
408      you're debugging is typically ``localhost:5103`` (assuming that your
409      application's page is called index.html and that you run the local server
410      in the directory where that page is located).
412 #. Navigate to your application's page in Chrome. (You don't need to do this if
413    you specified a URL when you launched Chrome in the previous step.) Chrome
414    will start loading the application, then pause and wait until you start
415    nacl-gdb and run the ``continue`` command.
417 #. Go to the directory with your source code, and run nacl-gdb from there. For
418    example::
420      cd <NACL_SDK_ROOT>/examples/hello_world_gles
421      <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb
423    The debugger will start and show you a gdb prompt::
425      (gdb)
427 #. For debugging PNaCl pexes run the following gdb command lines
428    (skip to the next item if you are using NaCl instead of PNaCl)::
430      (gdb) target remote localhost:4014
431      (gdb) remote get nexe <path-to-save-translated-nexe-with-debug-info>
432      (gdb) file <path-to-save-translated-nexe-with-debug-info>
433      (gdb) remote get irt <path-to-save-NaCl-integrated-runtime>
434      (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime>
436 #. For NaCl nexes, run the following commands from the gdb command line::
438      (gdb) target remote localhost:4014
439      (gdb) nacl-manifest <path-to-your-.nmf-file>
440      (gdb) remote get irt <path-to-save-NaCl-integrated-runtime>
441      (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime>
443 #. The command used for PNaCl and NaCl are described below:
445    ``target remote localhost:4014``
446      Tells the debugger how to connect to the debug stub in the Native Client
447      application loader. This connection occurs through TCP port 4014 (note
448      that this port is distinct from the port which the local web server uses
449      to listen for incoming requests, typically port 5103). If you are
450      debugging multiple applications at the same time, the loader may choose
451      a port that is different from the default 4014 port. See the Chrome
452      task manager for the debug port.
454    ``remote get nexe <path>``
455      This saves the application's main executable (nexe) to ``<path>``.
456      For PNaCl, this provides a convenient way to access the nexe that is
457      a **result** of translating your pexe. This can then be loaded with
458      the ``file <path>`` command.
460    ``nacl-manifest <path>``
461      For NaCl (not PNaCl), this tells the debugger where to find your
462      application's executable (.nexe) files. The application's manifest
463      (.nmf) file lists your application's executable files, as well as any
464      libraries that are linked with the application dynamically.
466    ``remote get irt <path>``
467      This saves the Native Client Integrated Runtime (IRT). Normally,
468      the IRT is located in the same directory as the Chrome executable,
469      or in a subdirectory named after the Chrome version. For example, if
470      you're running Chrome canary on Windows, the path to the IRT typically
471      looks something like ``C:/Users/<username>/AppData/Local/Google/Chrome
472      SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe``.
473      The ``remote get irt <path>`` saves that to the current working
474      directory so that you do not need to find where exactly the IRT
475      is stored alongside Chrome.
477    ``nacl-irt <path>``
478      Tells the debugger where to find the Native Client Integrated Runtime
479      (IRT). ``<path>`` can either be the location of the copy saved by
480      ``remote get irt <path>`` or the copy that is installed alongside Chrome.
482    A couple of notes on how to specify path names in the nacl-gdb commands
483    above:
485    * You can use a forward slash to separate directories on Linux, Mac, and
486      Windows. If you use a backslash to separate directories on Windows, you
487      must escape the backslash by using a double backslash "\\" between
488      directories.
489    * If any directories in the path have spaces in their name, you must put
490      quotation marks around the path.
492    As an example, here is a what these nacl-gdb commands might look like on
493    Windows::
495      target remote localhost:4014
496      nacl-manifest "C:/<NACL_SDK_ROOT>/examples/hello_world_gles/newlib/Debug/hello_world_gles.nmf"
497      nacl-irt "C:/Users/<username>/AppData/Local/Google/Chrome SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe"
499    To save yourself some typing, you can put put these nacl-gdb commands in a
500    script file, and execute the file when you run nacl-gdb, like so::
502      <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb -x <nacl-script-file>
504    If nacl-gdb connects successfully to Chrome, it displays a message such as
505    the one below, followed by a gdb prompt::
507      0x000000000fc00200 in _start ()
508      (gdb)
510    If nacl-gdb can't connect to Chrome, it displays a message such as
511    "``localhost:4014: A connection attempt failed``" or "``localhost:4014:
512    Connection timed out.``" If you see a message like that, make sure that you
513    have launched a web server, launched Chrome, and navigated to your
514    application's page before starting nacl-gdb.
516 Once nacl-gdb connects to Chrome, you can run standard gdb commands to execute
517 your module and inspect its state. Some commonly used commands are listed
518 below.
520 ``break <location>``
521   set a breakpoint at <location>, e.g.::
523     break hello_world.cc:79
524     break hello_world::HelloWorldInstance::HandleMessage
525     break Render
527 ``continue``
528   resume normal execution of the program
530 ``next``
531   execute the next source line, stepping over functions
533 ``step``
534   execute the next source line, stepping into functions
536 ``print <expression>``
537   print the value of <expression> (e.g., variables)
539 ``backtrace``
540   print a stack backtrace
542 ``info breakpoints``
543   print a table of all breakpoints
545 ``delete <breakpoint>``
546   delete the specified breakpoint (you can use the breakpoint number displayed
547   by the info command)
549 ``help <command>``
550   print documentation for the specified gdb <command>
552 ``quit``
553   quit gdb
555 See the `gdb documentation
556 <http://sourceware.org/gdb/current/onlinedocs/gdb/#toc_Top>`_ for a
557 comprehensive list of gdb commands. Note that you can abbreviate most commands
558 to just their first letter (``b`` for break, ``c`` for continue, and so on).
560 To interrupt execution of your module, press <Ctrl-c>. When you're done
561 debugging, close the Chrome window and type ``q`` to quit gdb.
563 Debugging with other tools
564 ==========================
566 If you cannot use the :ref:`Visual Studio add-in <visual_studio>`, or you want
567 to use a debugger other than nacl-gdb, you must manually build your module as a
568 Pepper plugin (sometimes referred to as a "`trusted
569 <http://www.chromium.org/nativeclient/getting-started/getting-started-background-and-basics#TOC-Trusted-vs-Untrusted>`_"
570 or "in-process" plugin).  Pepper plugins (.DLL files on Windows; .so files on
571 Linux; .bundle files on Mac) are loaded directly in either the Chrome renderer
572 process or a separate plugin process, rather than in Native Client. Building a
573 module as a trusted Pepper plugin allows you to use standard debuggers and
574 development tools on your system, but when you're finished developing the
575 plugin, you need to port it to Native Client (i.e., build the module with one
576 of the toolchains in the NaCl SDK so that the module runs in Native Client).
577 For details on this advanced development technique, see `Debugging a Trusted
578 Plugin
579 <http://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin>`_.
580 Note that starting with the ``pepper_22`` bundle, the NaCl SDK for Windows
581 includes pre-built libraries and library source code, making it much easier to
582 build a module into a .DLL.
584 Open source profiling tools
585 ---------------------------
587 For the brave-hearted there are open source tools at `Chromium.org
588 <http://www.chromium.org/nativeclient>`_ that describe how to do profiling on
589 `64-bit Windows
590 <https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/profiling-nacl-apps-on-64-bit-windows>`_
591 and `Linux
592 <http://www.chromium.org/nativeclient/how-tos/limited-profiling-with-oprofile-on-x86-64>`_
593 machines.
596 .. |menu-icon| image:: /images/menu-icon.png
597 .. |puzzle| image:: /images/puzzle.png