Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / doc / devguide / devcycle / debugging.rst
1 .. _devcycle-debugging:
2
3 #########
4 Debugging
5 #########
6
7 This document describes tools and techniques you can use to debug, monitor,
8 and measure your application's performance.
9
10 .. contents:: Table Of Contents
11   :local:
12   :backlinks: none
13   :depth: 3
14
15 Diagnostic information
16 ======================
17
18 Viewing process statistics with the task manager
19 ------------------------------------------------
20
21 You can use Chrome's Task Manager to display information about a Native Client
22 application:
23
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.
29
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.
39
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.
46
47 Controlling the level of Native Client error and warning messages
48 -----------------------------------------------------------------
49
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>`_:
54
55 * NACL_PLUGIN_DEBUG=1
56 * NACL_SRPC_DEBUG=[1-255] (use a higher number for more verbose debug output)
57 * NACLVERBOSITY=[1-255]
58
59 Basic debugging
60 ===============
61
62 Writing messages to the JavaScript console
63 ------------------------------------------
64
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.
71
72 Debugging with printf
73 ---------------------
74
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:
77
78 .. naclcode::
79
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   }
87
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.
90
91 Redirecting output to log files
92 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
93
94 You can redirect stdout and stderr to output files by setting these environment variables:
95
96 * ``NACL_EXE_STDOUT=c:\nacl_stdout.log``
97 * ``NACL_EXE_STDERR=c:\nacl_stderr.log``
98
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:
103
104 * ``NACLLOG=c:\nacl.log``
105
106 .. Note::
107   :class: note
108
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.
113
114 Redirecting output to the JavaScript console
115 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
116
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:
121
122 #. Set the NACL_EXE_STDOUT and NACL_EXE_STDERR environment variables as
123    follows:
124
125    * NACL_EXE_STDOUT=DEBUG_ONLY:dev://postmessage
126    * NACL_EXE_STDERR=DEBUG_ONLY:dev://postmessage
127
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.
131
132 #. Register a JavaScript handler to receive messages from your Native Client
133    module:
134
135    .. naclcode::
136
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>
146
147 #. Implement a simple JavaScript handler that logs the messages it receives to
148    the JavaScript console:
149
150    .. naclcode::
151
152      function handleMessage(message_event) {
153        console.log(message_event.data);
154      }
155
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.
160
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).
168
169 Logging calls to Pepper interfaces
170 ----------------------------------
171
172 You can log all Pepper calls your module makes by passing the following flags
173 to Chrome on startup::
174
175   --vmodule=ppb*=4 --enable-logging=stderr
176
177
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.
182
183 .. _visual_studio:
184
185 Debugging with Visual Studio
186 ----------------------------
187
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.
195
196 .. _using_gdb:
197
198 Debugging with nacl-gdb
199 -----------------------
200
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``).
207
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.
212
213 .. _debugging_pnacl_pexes:
214
215 Debugging PNaCl pexes (with Pepper 35+)
216 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
217
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.
226
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.
233
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).
240
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:
243
244 .. naclcode::
245
246   {
247     "program": {
248       "portable": {
249         "pnacl-translate": {
250           "url": "release_version.pexe",
251           "optlevel": 2
252         },
253         "pnacl-debug": {
254           "url": "debug_version.bc",
255           "optlevel": 0
256         }
257       }
258     }
259   }
260
261 Copy the ``debug_version.bc`` and ``nmf`` files to the location that
262 your local web server serves files from.
263
264 When you run Chrome with ``--enable-nacl-debug``, Chrome will translate
265 and run the ``debug_version.bc`` instead of ``release_version.pexe``.
266 Once the debug version is loaded, you are ready to :ref:`run nacl-gdb
267 <running_nacl_gdb>`
268
269 Whether you publish the NMF file containing the debug URL to the release
270 web server, is up to you. One reason to avoid publishing the debug URL
271 is that it is only guaranteed to work for the Chrome version that matches
272 the SDK version. Developers who may have left the ``--enable-nacl-debug``
273 flag turned on may end up loading the debug copy of your application
274 (which may or may not work, depending on their version of Chrome).
275
276
277 Debugging PNaCl pexes (with older Pepper toolchains)
278 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
279
280 If you want to use GDB to debug a program that is compiled with the PNaCl
281 toolchain, you must convert the ``pexe`` file to a ``nexe``.  (You can skip
282 this step if you are using the GCC toolchain, or if you are using
283 pepper 35 or later.)
284
285 * Firstly, make sure you are passing the ``-g`` :ref:`compile option
286   <compile_flags>` to ``pnacl-clang`` to enable generating debugging info.
287   You might also want to omit ``-O2`` from the compile-time and link-time
288   options.
289
290 * Secondly, use ``pnacl-translate`` to convert your ``pexe`` to one or more
291   ``nexe`` files.  For example:
292
293   .. naclcode::
294     :prettyprint: 0
295
296     <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^
297       --allow-llvm-bitcode-input hello_world.pexe -arch x86-32 -o hello_world_x86_32.nexe
298     <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^
299       --allow-llvm-bitcode-input hello_world.pexe -arch x86-64 -o hello_world_x86_64.nexe
300
301   For this, use the non-finalized ``pexe`` file produced by
302   ``pnacl-clang``, not the ``pexe`` file produced by ``pnacl-finalize``.
303   The latter ``pexe`` has debugging info stripped out.  The option
304   ``--allow-llvm-bitcode-input`` tells ``pnacl-translate`` to accept a
305   non-finalized ``pexe``.
306
307 * Replace the ``nmf`` :ref:`manifest file <manifest_file>` that points to
308   your ``pexe`` file with one that points to the ``nexe`` files.  For the
309   example ``nexe`` filenames above, the new ``nmf`` file would contain:
310
311   .. naclcode::
312     :prettyprint: 0
313
314     {
315       "program": {
316         "x86-32": {"url": "hello_world_x86_32.nexe"},
317         "x86-64": {"url": "hello_world_x86_64.nexe"},
318       }
319     }
320
321 * Change the ``<embed>`` HTML element to use
322   ``type="application/x-nacl"`` rather than
323   ``type="application/x-pnacl"``.
324
325 * Copy the ``nexe`` and ``nmf`` files to the location that your local web
326   server serves files from.
327
328 .. Note::
329   :class: note
330
331   **Note:** If you know whether Chrome is using the x86-32 or x86-64
332   version of the NaCl sandbox on your system, you can translate the
333   ``pexe`` once to a single x86-32 or x86-64 ``nexe``.  Otherwise, you
334   might find it easier to translate the ``pexe`` to both ``nexe``
335   formats as described above.
336
337 .. _running_nacl_gdb:
338
339 Running nacl-gdb
340 ~~~~~~~~~~~~~~~~
341
342 Before you start using nacl-gdb, make sure you can :doc:`build <building>` your
343 module and :doc:`run <running>` your application normally. This will verify
344 that you have created all the required :doc:`application parts
345 <../coding/application-structure>` (.html, .nmf, and .nexe files, shared
346 libraries, etc.), that your server can access those resources, and that you've
347 configured Chrome correctly to run your application.  The instructions below
348 assume that you are using a :ref:`local server <web_server>` to run your
349 application; one benefit of doing it this way is that you can check the web
350 server output to confirm that your application is loading the correct
351 resources. However, some people prefer to run their application as an unpacked
352 extension, as described in :doc:`Running Native Client Applications <running>`.
353
354 Follow the instructions below to debug your module with nacl-gdb:
355
356 #. Compile your module with the ``-g`` flag so that your .nexe retains symbols
357    and other debugging information (see the :ref:`recommended compile flags
358    <compile_flags>`).
359 #. Launch a local web server (e.g., the :ref:`web server <web_server>` included
360    in the SDK).
361 #. Launch Chrome with these three required flags: ``--enable-nacl --enable-nacl-debug --no-sandbox``.
362
363    You may also want to use some of the optional flags listed below. A typical
364    command looks like this::
365
366      chrome --enable-nacl --enable-nacl-debug --no-sandbox --disable-hang-monitor localhost:5103
367
368    **Required flags:**
369
370    ``--enable-nacl``
371      Enables Native Client for all applications, including those that are
372      launched outside the Chrome Web Store.
373
374    ``--enable-nacl-debug``
375      Turns on the Native Client debug stub, opens TCP port 4014, and pauses
376      Chrome to let the debugger connect.
377
378    ``--no-sandbox``
379      Turns off the Chrome sandbox (not the Native Client sandbox). This enables
380      the stdout and stderr streams, and lets the debugger connect.
381
382    **Optional flags:**
383
384    ``--disable-hang-monitor``
385      Prevents Chrome from displaying a warning when a tab is unresponsive.
386
387    ``--user-data-dir=<directory>``
388      Specifies the `user data directory
389      <http://www.chromium.org/user-experience/user-data-directory>`_ from which
390      Chrome should load its state.  You can specify a different user data
391      directory so that changes you make to Chrome in your debugging session do
392      not affect your personal Chrome data (history, cookies, bookmarks, themes,
393      and settings).
394
395    ``--nacl-debug-mask=<nmf_url_mask1,nmf_url_mask2,...>``
396      Specifies a set of debug mask patterns. This allows you to selectively
397      choose to debug certain applications and not debug others. For example, if
398      you only want to debug the NMF files for your applications at
399      ``https://example.com/app``, and no other NaCl applications found on the
400      web, specify ``--nacl-debug-mask=https://example.com/app/*.nmf``.  This
401      helps prevent accidentally debugging other NaCl applications if you like
402      to leave the ``--enable-nacl-debug`` flag turned on.  The pattern language
403      for the mask follows `chrome extension match patterns
404      </extensions/match_patterns>`_.  The pattern set can be inverted by
405      prefixing the pattern set with the ``!`` character.
406
407    ``<URL>``
408      Specifies the URL Chrome should open when it launches. The local server
409      that comes with the SDK listens on port 5103 by default, so the URL when
410      you're debugging is typically ``localhost:5103`` (assuming that your
411      application's page is called index.html and that you run the local server
412      in the directory where that page is located).
413
414 #. Navigate to your application's page in Chrome. (You don't need to do this if
415    you specified a URL when you launched Chrome in the previous step.) Chrome
416    will start loading the application, then pause and wait until you start
417    nacl-gdb and run the ``continue`` command.
418
419 #. Go to the directory with your source code, and run nacl-gdb from there. For
420    example::
421
422      cd <NACL_SDK_ROOT>/examples/hello_world_gles
423      <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb
424
425    The debugger will start and show you a gdb prompt::
426
427      (gdb)
428
429 #. For debugging PNaCl pexes run the following gdb command lines
430    (skip to the next item if you are using NaCl instead of PNaCl)::
431
432      (gdb) target remote localhost:4014
433      (gdb) remote get nexe <path-to-save-translated-nexe-with-debug-info>
434      (gdb) file <path-to-save-translated-nexe-with-debug-info>
435      (gdb) remote get irt <path-to-save-NaCl-integrated-runtime>
436      (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime>
437
438 #. For NaCl nexes, run the following commands from the gdb command line::
439
440      (gdb) target remote localhost:4014
441      (gdb) nacl-manifest <path-to-your-.nmf-file>
442      (gdb) remote get irt <path-to-save-NaCl-integrated-runtime>
443      (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime>
444
445 #. The command used for PNaCl and NaCl are described below:
446
447    ``target remote localhost:4014``
448      Tells the debugger how to connect to the debug stub in the Native Client
449      application loader. This connection occurs through TCP port 4014 (note
450      that this port is distinct from the port which the local web server uses
451      to listen for incoming requests, typically port 5103). If you are
452      debugging multiple applications at the same time, the loader may choose
453      a port that is different from the default 4014 port. See the Chrome
454      task manager for the debug port.
455
456    ``remote get nexe <path>``
457      This saves the application's main executable (nexe) to ``<path>``.
458      For PNaCl, this provides a convenient way to access the nexe that is
459      a **result** of translating your pexe. This can then be loaded with
460      the ``file <path>`` command.
461
462    ``nacl-manifest <path>``
463      For NaCl (not PNaCl), this tells the debugger where to find your
464      application's executable (.nexe) files. The application's manifest
465      (.nmf) file lists your application's executable files, as well as any
466      libraries that are linked with the application dynamically.
467
468    ``remote get irt <path>``
469      This saves the Native Client Integrated Runtime (IRT). Normally,
470      the IRT is located in the same directory as the Chrome executable,
471      or in a subdirectory named after the Chrome version. For example, if
472      you're running Chrome canary on Windows, the path to the IRT typically
473      looks something like ``C:/Users/<username>/AppData/Local/Google/Chrome
474      SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe``.
475      The ``remote get irt <path>`` saves that to the current working
476      directory so that you do not need to find where exactly the IRT
477      is stored alongside Chrome.
478
479    ``nacl-irt <path>``
480      Tells the debugger where to find the Native Client Integrated Runtime
481      (IRT). ``<path>`` can either be the location of the copy saved by
482      ``remote get irt <path>`` or the copy that is installed alongside Chrome.
483
484    A couple of notes on how to specify path names in the nacl-gdb commands
485    above:
486
487    * You can use a forward slash to separate directories on Linux, Mac, and
488      Windows. If you use a backslash to separate directories on Windows, you
489      must escape the backslash by using a double backslash "\\" between
490      directories.
491    * If any directories in the path have spaces in their name, you must put
492      quotation marks around the path.
493
494    As an example, here is a what these nacl-gdb commands might look like on
495    Windows::
496
497      target remote localhost:4014
498      nacl-manifest "C:/<NACL_SDK_ROOT>/examples/hello_world_gles/newlib/Debug/hello_world_gles.nmf"
499      nacl-irt "C:/Users/<username>/AppData/Local/Google/Chrome SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe"
500
501    To save yourself some typing, you can put put these nacl-gdb commands in a
502    script file, and execute the file when you run nacl-gdb, like so::
503
504      <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb -x <nacl-script-file>
505
506    If nacl-gdb connects successfully to Chrome, it displays a message such as
507    the one below, followed by a gdb prompt::
508
509      0x000000000fc00200 in _start ()
510      (gdb)
511
512    If nacl-gdb can't connect to Chrome, it displays a message such as
513    "``localhost:4014: A connection attempt failed``" or "``localhost:4014:
514    Connection timed out.``" If you see a message like that, make sure that you
515    have launched a web server, launched Chrome, and navigated to your
516    application's page before starting nacl-gdb.
517
518 Once nacl-gdb connects to Chrome, you can run standard gdb commands to execute
519 your module and inspect its state. Some commonly used commands are listed
520 below.
521
522 ``break <location>``
523   set a breakpoint at <location>, e.g.::
524
525     break hello_world.cc:79
526     break hello_world::HelloWorldInstance::HandleMessage
527     break Render
528
529 ``continue``
530   resume normal execution of the program
531
532 ``next``
533   execute the next source line, stepping over functions
534
535 ``step``
536   execute the next source line, stepping into functions
537
538 ``print <expression>``
539   print the value of <expression> (e.g., variables)
540
541 ``backtrace``
542   print a stack backtrace
543
544 ``info breakpoints``
545   print a table of all breakpoints
546
547 ``delete <breakpoint>``
548   delete the specified breakpoint (you can use the breakpoint number displayed
549   by the info command)
550
551 ``help <command>``
552   print documentation for the specified gdb <command>
553
554 ``quit``
555   quit gdb
556
557 See the `gdb documentation
558 <http://sourceware.org/gdb/current/onlinedocs/gdb/#toc_Top>`_ for a
559 comprehensive list of gdb commands. Note that you can abbreviate most commands
560 to just their first letter (``b`` for break, ``c`` for continue, and so on).
561
562 To interrupt execution of your module, press <Ctrl-c>. When you're done
563 debugging, close the Chrome window and type ``q`` to quit gdb.
564
565 Debugging with other tools
566 ==========================
567
568 If you cannot use the :ref:`Visual Studio add-in <visual_studio>`, or you want
569 to use a debugger other than nacl-gdb, you must manually build your module as a
570 Pepper plugin (sometimes referred to as a "`trusted
571 <http://www.chromium.org/nativeclient/getting-started/getting-started-background-and-basics#TOC-Trusted-vs-Untrusted>`_"
572 or "in-process" plugin).  Pepper plugins (.DLL files on Windows; .so files on
573 Linux; .bundle files on Mac) are loaded directly in either the Chrome renderer
574 process or a separate plugin process, rather than in Native Client. Building a
575 module as a trusted Pepper plugin allows you to use standard debuggers and
576 development tools on your system, but when you're finished developing the
577 plugin, you need to port it to Native Client (i.e., build the module with one
578 of the toolchains in the NaCl SDK so that the module runs in Native Client).
579 For details on this advanced development technique, see `Debugging a Trusted
580 Plugin
581 <http://www.chromium.org/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin>`_.
582 Note that starting with the ``pepper_22`` bundle, the NaCl SDK for Windows
583 includes pre-built libraries and library source code, making it much easier to
584 build a module into a .DLL.
585
586 Open source profiling tools
587 ---------------------------
588
589 For the brave-hearted there are open source tools at `Chromium.org
590 <http://www.chromium.org/nativeclient>`_ that describe how to do profiling on
591 `64-bit Windows
592 <https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/profiling-nacl-apps-on-64-bit-windows>`_
593 and `Linux
594 <http://www.chromium.org/nativeclient/how-tos/limited-profiling-with-oprofile-on-x86-64>`_
595 machines.
596
597
598 .. |menu-icon| image:: /images/menu-icon.png
599 .. |puzzle| image:: /images/puzzle.png