Index: native_client_sdk/src/doc/devguide/devcycle/debugging.rst |
diff --git a/native_client_sdk/src/doc/devguide/devcycle/debugging.rst b/native_client_sdk/src/doc/devguide/devcycle/debugging.rst |
index a0ad4821e91d56dc4cbc936266bd25ee347af53b..c46e40046874846bf9d6394e1423a2979b181dcc 100644 |
--- a/native_client_sdk/src/doc/devguide/devcycle/debugging.rst |
+++ b/native_client_sdk/src/doc/devguide/devcycle/debugging.rst |
@@ -214,19 +214,75 @@ whether built using newlib or glibc for x86-32, x86-64 or ARM. In the SDK, |
``i686-nacl-gdb`` is an alias for ``x86_64-nacl-gdb``, and the ``newlib`` |
and ``glibc`` toolchains both contain the same version of GDB. |
-Debugging PNaCl pexes |
-~~~~~~~~~~~~~~~~~~~~~ |
+Debugging PNaCl pexes (with Pepper 35+) |
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
+ |
+If you want to use GDB to debug a program that is compiled with the PNaCl |
+toolchain, you must have a copy of the pexe from **before** running |
+``pnacl-finalize``. The ``pnacl-finalize`` tool converts LLVM bitcode |
+to the stable PNaCl bitcode format, but it also strips out debug |
+metadata, which we need for debugging. |
+ |
+**Note** unlike the finalized copy of the pexe, the non-finalized debug copy |
+is not considered stable. This means that a debug copy of the PNaCl |
+application created by a Pepper N SDK is only guaranteed to run |
+with a matching Chrome version N. If the version of the debug bitcode pexe |
+does not match that of Chrome then the translation process may fail, and |
+you will see and error message in the JavaScript console. |
+ |
+Also, make sure you are passing the ``-g`` :ref:`compile option |
+<compile_flags>` to ``pnacl-clang`` to enable generating debugging info. |
+You might also want to omit ``-O2`` from the compile-time and link-time |
+options, otherwise GDB not might be able to print variables' values when |
+debugging (this is more of a problem with the PNaCl/LLVM toolchain than |
+with GCC). |
+ |
+Once you have built a non-stable debug copy of the pexe, list the URL of |
+that copy in your application's manifest file: |
+ |
+.. naclcode:: |
+ |
+ { |
+ "program": { |
+ "pnacl-translate": { |
+ "url": "release_version.pexe", |
+ "optlevel": 2 |
+ }, |
+ "pnacl-debug": { |
+ "url": "debug_version.bc", |
+ "optlevel": 0 |
+ } |
+ } |
+ } |
+ |
+Copy the ``debug_version.bc`` and ``nmf`` files to the location that |
+your local web server serves files from. |
+ |
+When you run Chrome with ``--enable-nacl-debug``, Chrome will translate |
+and run the ``debug_version.bc`` instead of ``release_version.pexe``. |
+Once the debug version is loaded, you are ready to :ref:`run nacl-gdb |
+<running_nacl_gdb>` |
+ |
+Whether you publish the NMF file containing the debug URL to the release |
+web server, is up to you. One reason to avoid publishing the debug URL |
+is that it is only guaranteed to work for the Chrome version that matches |
+the SDK version. Developers who may have left the ``--enable-nacl-debug`` |
+flag turned on may end up loading the debug copy of your application |
+(which may or may not work, depending on their version of Chrome). |
+ |
+ |
+Debugging PNaCl pexes (with older Pepper toolchains) |
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
If you want to use GDB to debug a program that is compiled with the PNaCl |
toolchain, you must convert the ``pexe`` file to a ``nexe``. (You can skip |
-this step if you are using the GCC toolchain.) |
+this step if you are using the GCC toolchain, or if you are using |
+pepper 35 or later.) |
* Firstly, make sure you are passing the ``-g`` :ref:`compile option |
<compile_flags>` to ``pnacl-clang`` to enable generating debugging info. |
You might also want to omit ``-O2`` from the compile-time and link-time |
- options, otherwise GDB not might be able to print variables' values when |
- debugging (this is more of a problem with the PNaCl/LLVM toolchain than |
- with GCC). |
+ options. |
* Secondly, use ``pnacl-translate`` to convert your ``pexe`` to one or more |
``nexe`` files. For example: |
@@ -275,6 +331,8 @@ this step if you are using the GCC toolchain.) |
might find it easier to translate the ``pexe`` to both ``nexe`` |
formats as described above. |
+.. _running_nacl_gdb: |
+ |
Running nacl-gdb |
~~~~~~~~~~~~~~~~ |
@@ -331,6 +389,19 @@ Follow the instructions below to debug your module with nacl-gdb: |
not affect your personal Chrome data (history, cookies, bookmarks, themes, |
and settings). |
+ ``--nacl-debug-mask=<nmf_url_mask1,nmf_url_mask2,...>`` |
+ Specifies a set of debug mask patterns. This allows you to selectively |
+ choose to debug certain applications and not debug others. For example, |
+ if you only want to debug the NMF files for your applications at |
+ ``https://example.com/app``, and no other NaCl applications found |
+ on the web, specify ``--nacl-debug-mask=https://example.com/app/*.nmf``. |
+ This helps prevent accidentally debugging other NaCl applications if |
+ you like to leave the ``--enable-nacl-debug`` flag turned on. |
+ The pattern language for the mask follows `chrome extension match patterns |
+ <http://developer.chrome.com/extensions/match_patterns>`_. |
+ The pattern set can be inverted by prefixing the pattern set with |
+ the ``!`` character. |
+ |
``<URL>`` |
Specifies the URL Chrome should open when it launches. The local server |
that comes with the SDK listens on port 5103 by default, so the URL when |
@@ -353,33 +424,60 @@ Follow the instructions below to debug your module with nacl-gdb: |
(gdb) |
-#. Run the following three commands from the gdb command line:: |
+#. For debugging PNaCl pexes run the following gdb command lines |
+ (skip to the next item if you are using NaCl instead of PNaCl):: |
- (gdb) nacl-manifest <path-to-your-.nmf-file> |
- (gdb) nacl-irt <path-to-Chrome-NaCl-integrated-runtime> |
(gdb) target remote localhost:4014 |
+ (gdb) remote get nexe <path-to-save-translated-nexe-with-debug-info> |
+ (gdb) file <path-to-save-translated-nexe-with-debug-info> |
+ (gdb) remote get irt <path-to-save-NaCl-integrated-runtime> |
+ (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime> |
- These commands are described below: |
+#. For NaCl nexes, run the following commands from the gdb command line:: |
- ``nacl-manifest <path>`` |
- Tells the debugger about your Native Client application by pointing it to |
- the application's manifest (.nmf) file. The manifest file lists your |
- application's executable (.nexe) files, as well as any libraries that are |
- linked with the application dynamically. |
+ (gdb) target remote localhost:4014 |
+ (gdb) nacl-manifest <path-to-your-.nmf-file> |
+ (gdb) remote get irt <path-to-save-NaCl-integrated-runtime> |
+ (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime> |
- ``nacl-irt <path>`` |
- Tells the debugger where to find the Native Client Integrated Runtime |
- (IRT). The IRT is located in the same directory as the Chrome executable, |
- or in a subdirectory named after the Chrome version. For example, if |
- you're running Chrome canary on Windows, the path to the IRT typically |
- looks something like ``C:/Users/<username>/AppData/Local/Google/Chrome |
- SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe``. |
+#. The command used for PNaCl and NaCl are described below: |
``target remote localhost:4014`` |
Tells the debugger how to connect to the debug stub in the Native Client |
application loader. This connection occurs through TCP port 4014 (note |
that this port is distinct from the port which the local web server uses |
- to listen for incoming requests, typically port 5103). |
+ to listen for incoming requests, typically port 5103). If you are |
+ debugging multiple applications at the same time, the loader may choose |
+ a port that is different from the default 4014 port. See the Chrome |
+ task manager for the debug port. |
+ |
+ ``remote get nexe <path>`` |
+ This saves the application's main executable (nexe) to ``<path>``. |
+ For PNaCl, this provides a convenient way to access the nexe that is |
+ a **result** of translating your pexe. This can then be loaded with |
+ the ``file <path>`` command. |
+ |
+ ``nacl-manifest <path>`` |
+ For NaCl (not PNaCl), this tells the debugger where to find your |
+ application's executable (.nexe) files. The application's manifest |
+ (.nmf) file lists your application's executable files, as well as any |
+ libraries that are linked with the application dynamically. |
+ |
+ ``remote get irt <path>`` |
+ This saves the Native Client Integrated Runtime (IRT). Normally, |
+ the IRT is located in the same directory as the Chrome executable, |
+ or in a subdirectory named after the Chrome version. For example, if |
+ you're running Chrome canary on Windows, the path to the IRT typically |
+ looks something like ``C:/Users/<username>/AppData/Local/Google/Chrome |
+ SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe``. |
+ The ``remote get irt <path>`` saves that to the current working |
+ directory so that you do not need to find where exactly the IRT |
+ is stored alongside Chrome. |
+ |
+ ``nacl-irt <path>`` |
+ Tells the debugger where to find the Native Client Integrated Runtime |
+ (IRT). ``<path>`` can either be the location of the copy saved by |
+ ``remote get irt <path>`` or the copy that is installed alongside Chrome. |
A couple of notes on how to specify path names in the nacl-gdb commands |
above: |
@@ -394,9 +492,9 @@ Follow the instructions below to debug your module with nacl-gdb: |
As an example, here is a what these nacl-gdb commands might look like on |
Windows:: |
+ target remote localhost:4014 |
nacl-manifest "C:/<NACL_SDK_ROOT>/examples/hello_world_gles/newlib/Debug/hello_world_gles.nmf" |
nacl-irt "C:/Users/<username>/AppData/Local/Google/Chrome SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe" |
- target remote localhost:4014 |
To save yourself some typing, you can put put these nacl-gdb commands in a |
script file, and execute the file when you run nacl-gdb, like so:: |