OLD | NEW |
1 .. _devcycle-debugging: | 1 .. _devcycle-debugging: |
2 | 2 |
3 ######### | 3 ######### |
4 Debugging | 4 Debugging |
5 ######### | 5 ######### |
6 | 6 |
7 This document describes tools and techniques you can use to debug, monitor, | 7 This document describes tools and techniques you can use to debug, monitor, |
8 and measure your application's performance. | 8 and measure your application's performance. |
9 | 9 |
10 .. contents:: Table Of Contents | 10 .. contents:: Table Of Contents |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 <http://www.gnu.org/software/gdb/>`_, and is located at | 207 <http://www.gnu.org/software/gdb/>`_, and is located at |
208 ``toolchain/<platform>_x86_newlib/bin/x86_64-nacl-gdb`` (where *<platform>* | 208 ``toolchain/<platform>_x86_newlib/bin/x86_64-nacl-gdb`` (where *<platform>* |
209 is the platform of your development machine: ``win``, ``mac``, or | 209 is the platform of your development machine: ``win``, ``mac``, or |
210 ``linux``). | 210 ``linux``). |
211 | 211 |
212 Note that this same copy of GDB can be used to debug any NaCl program, | 212 Note that this same copy of GDB can be used to debug any NaCl program, |
213 whether built using newlib or glibc for x86-32, x86-64 or ARM. In the SDK, | 213 whether built using newlib or glibc for x86-32, x86-64 or ARM. In the SDK, |
214 ``i686-nacl-gdb`` is an alias for ``x86_64-nacl-gdb``, and the ``newlib`` | 214 ``i686-nacl-gdb`` is an alias for ``x86_64-nacl-gdb``, and the ``newlib`` |
215 and ``glibc`` toolchains both contain the same version of GDB. | 215 and ``glibc`` toolchains both contain the same version of GDB. |
216 | 216 |
217 Debugging PNaCl pexes | 217 Debugging PNaCl pexes (with Pepper 35+) |
218 ~~~~~~~~~~~~~~~~~~~~~ | 218 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 219 |
| 220 If you want to use GDB to debug a program that is compiled with the PNaCl |
| 221 toolchain, you must have a copy of the pexe from **before** running |
| 222 ``pnacl-finalize``. The ``pnacl-finalize`` tool converts LLVM bitcode |
| 223 to the stable PNaCl bitcode format, but it also strips out debug |
| 224 metadata, which we need for debugging. |
| 225 |
| 226 **Note** unlike the finalized copy of the pexe, the non-finalized debug copy |
| 227 is not considered stable. This means that a debug copy of the PNaCl |
| 228 application created by a Pepper N SDK is only guaranteed to run |
| 229 with a matching Chrome version N. If the version of the debug bitcode pexe |
| 230 does not match that of Chrome then the translation process may fail, and |
| 231 you will see and error message in the JavaScript console. |
| 232 |
| 233 Also, make sure you are passing the ``-g`` :ref:`compile option |
| 234 <compile_flags>` to ``pnacl-clang`` to enable generating debugging info. |
| 235 You might also want to omit ``-O2`` from the compile-time and link-time |
| 236 options, otherwise GDB not might be able to print variables' values when |
| 237 debugging (this is more of a problem with the PNaCl/LLVM toolchain than |
| 238 with GCC). |
| 239 |
| 240 Once you have built a non-stable debug copy of the pexe, list the URL of |
| 241 that copy in your application's manifest file: |
| 242 |
| 243 .. naclcode:: |
| 244 |
| 245 { |
| 246 "program": { |
| 247 "pnacl-translate": { |
| 248 "url": "release_version.pexe", |
| 249 "optlevel": 2 |
| 250 }, |
| 251 "pnacl-debug": { |
| 252 "url": "debug_version.bc", |
| 253 "optlevel": 0 |
| 254 } |
| 255 } |
| 256 } |
| 257 |
| 258 Copy the ``debug_version.bc`` and ``nmf`` files to the location that |
| 259 your local web server serves files from. |
| 260 |
| 261 When you run Chrome with ``--enable-nacl-debug``, Chrome will translate |
| 262 and run the ``debug_version.bc`` instead of ``release_version.pexe``. |
| 263 Once the debug version is loaded, you are ready to :ref:`run nacl-gdb |
| 264 <running_nacl_gdb>` |
| 265 |
| 266 Whether you publish the NMF file containing the debug URL to the release |
| 267 web server, is up to you. One reason to avoid publishing the debug URL |
| 268 is that it is only guaranteed to work for the Chrome version that matches |
| 269 the SDK version. Developers who may have left the ``--enable-nacl-debug`` |
| 270 flag turned on may end up loading the debug copy of your application |
| 271 (which may or may not work, depending on their version of Chrome). |
| 272 |
| 273 |
| 274 Debugging PNaCl pexes (with older Pepper toolchains) |
| 275 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
219 | 276 |
220 If you want to use GDB to debug a program that is compiled with the PNaCl | 277 If you want to use GDB to debug a program that is compiled with the PNaCl |
221 toolchain, you must convert the ``pexe`` file to a ``nexe``. (You can skip | 278 toolchain, you must convert the ``pexe`` file to a ``nexe``. (You can skip |
222 this step if you are using the GCC toolchain.) | 279 this step if you are using the GCC toolchain, or if you are using |
| 280 pepper 35 or later.) |
223 | 281 |
224 * Firstly, make sure you are passing the ``-g`` :ref:`compile option | 282 * Firstly, make sure you are passing the ``-g`` :ref:`compile option |
225 <compile_flags>` to ``pnacl-clang`` to enable generating debugging info. | 283 <compile_flags>` to ``pnacl-clang`` to enable generating debugging info. |
226 You might also want to omit ``-O2`` from the compile-time and link-time | 284 You might also want to omit ``-O2`` from the compile-time and link-time |
227 options, otherwise GDB not might be able to print variables' values when | 285 options. |
228 debugging (this is more of a problem with the PNaCl/LLVM toolchain than | |
229 with GCC). | |
230 | 286 |
231 * Secondly, use ``pnacl-translate`` to convert your ``pexe`` to one or more | 287 * Secondly, use ``pnacl-translate`` to convert your ``pexe`` to one or more |
232 ``nexe`` files. For example: | 288 ``nexe`` files. For example: |
233 | 289 |
234 .. naclcode:: | 290 .. naclcode:: |
235 :prettyprint: 0 | 291 :prettyprint: 0 |
236 | 292 |
237 <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^ | 293 <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^ |
238 --allow-llvm-bitcode-input hello_world.pexe -arch x86-32 -o hello_world_x8
6_32.nexe | 294 --allow-llvm-bitcode-input hello_world.pexe -arch x86-32 -o hello_world_x8
6_32.nexe |
239 <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^ | 295 <NACL_SDK_ROOT>/toolchain/win_pnacl/bin/pnacl-translate ^ |
(...skipping 28 matching lines...) Expand all Loading... |
268 | 324 |
269 .. Note:: | 325 .. Note:: |
270 :class: note | 326 :class: note |
271 | 327 |
272 **Note:** If you know whether Chrome is using the x86-32 or x86-64 | 328 **Note:** If you know whether Chrome is using the x86-32 or x86-64 |
273 version of the NaCl sandbox on your system, you can translate the | 329 version of the NaCl sandbox on your system, you can translate the |
274 ``pexe`` once to a single x86-32 or x86-64 ``nexe``. Otherwise, you | 330 ``pexe`` once to a single x86-32 or x86-64 ``nexe``. Otherwise, you |
275 might find it easier to translate the ``pexe`` to both ``nexe`` | 331 might find it easier to translate the ``pexe`` to both ``nexe`` |
276 formats as described above. | 332 formats as described above. |
277 | 333 |
| 334 .. _running_nacl_gdb: |
| 335 |
278 Running nacl-gdb | 336 Running nacl-gdb |
279 ~~~~~~~~~~~~~~~~ | 337 ~~~~~~~~~~~~~~~~ |
280 | 338 |
281 Before you start using nacl-gdb, make sure you can :doc:`build <building>` your | 339 Before you start using nacl-gdb, make sure you can :doc:`build <building>` your |
282 module and :doc:`run <running>` your application normally. This will verify | 340 module and :doc:`run <running>` your application normally. This will verify |
283 that you have created all the required :doc:`application parts | 341 that you have created all the required :doc:`application parts |
284 <../coding/application-structure>` (.html, .nmf, and .nexe files, shared | 342 <../coding/application-structure>` (.html, .nmf, and .nexe files, shared |
285 libraries, etc.), that your server can access those resources, and that you've | 343 libraries, etc.), that your server can access those resources, and that you've |
286 configured Chrome correctly to run your application. The instructions below | 344 configured Chrome correctly to run your application. The instructions below |
287 assume that you are using a :ref:`local server <web_server>` to run your | 345 assume that you are using a :ref:`local server <web_server>` to run your |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 Prevents Chrome from displaying a warning when a tab is unresponsive. | 382 Prevents Chrome from displaying a warning when a tab is unresponsive. |
325 | 383 |
326 ``--user-data-dir=<directory>`` | 384 ``--user-data-dir=<directory>`` |
327 Specifies the `user data directory | 385 Specifies the `user data directory |
328 <http://www.chromium.org/user-experience/user-data-directory>`_ from which | 386 <http://www.chromium.org/user-experience/user-data-directory>`_ from which |
329 Chrome should load its state. You can specify a different user data | 387 Chrome should load its state. You can specify a different user data |
330 directory so that changes you make to Chrome in your debugging session do | 388 directory so that changes you make to Chrome in your debugging session do |
331 not affect your personal Chrome data (history, cookies, bookmarks, themes, | 389 not affect your personal Chrome data (history, cookies, bookmarks, themes, |
332 and settings). | 390 and settings). |
333 | 391 |
| 392 ``--nacl-debug-mask=<nmf_url_mask1,nmf_url_mask2,...>`` |
| 393 Specifies a set of debug mask patterns. This allows you to selectively |
| 394 choose to debug certain applications and not debug others. For example, |
| 395 if you only want to debug the NMF files for your applications at |
| 396 ``https://example.com/app``, and no other NaCl applications found |
| 397 on the web, specify ``--nacl-debug-mask=https://example.com/app/*.nmf``. |
| 398 This helps prevent accidentally debugging other NaCl applications if |
| 399 you like to leave the ``--enable-nacl-debug`` flag turned on. |
| 400 The pattern language for the mask follows `chrome extension match patterns |
| 401 <http://developer.chrome.com/extensions/match_patterns>`_. |
| 402 The pattern set can be inverted by prefixing the pattern set with |
| 403 the ``!`` character. |
| 404 |
334 ``<URL>`` | 405 ``<URL>`` |
335 Specifies the URL Chrome should open when it launches. The local server | 406 Specifies the URL Chrome should open when it launches. The local server |
336 that comes with the SDK listens on port 5103 by default, so the URL when | 407 that comes with the SDK listens on port 5103 by default, so the URL when |
337 you're debugging is typically ``localhost:5103`` (assuming that your | 408 you're debugging is typically ``localhost:5103`` (assuming that your |
338 application's page is called index.html and that you run the local server | 409 application's page is called index.html and that you run the local server |
339 in the directory where that page is located). | 410 in the directory where that page is located). |
340 | 411 |
341 #. Navigate to your application's page in Chrome. (You don't need to do this if | 412 #. Navigate to your application's page in Chrome. (You don't need to do this if |
342 you specified a URL when you launched Chrome in the previous step.) Chrome | 413 you specified a URL when you launched Chrome in the previous step.) Chrome |
343 will start loading the application, then pause and wait until you start | 414 will start loading the application, then pause and wait until you start |
344 nacl-gdb and run the ``continue`` command. | 415 nacl-gdb and run the ``continue`` command. |
345 | 416 |
346 #. Go to the directory with your source code, and run nacl-gdb from there. For | 417 #. Go to the directory with your source code, and run nacl-gdb from there. For |
347 example:: | 418 example:: |
348 | 419 |
349 cd <NACL_SDK_ROOT>/examples/hello_world_gles | 420 cd <NACL_SDK_ROOT>/examples/hello_world_gles |
350 <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb | 421 <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb |
351 | 422 |
352 The debugger will start and show you a gdb prompt:: | 423 The debugger will start and show you a gdb prompt:: |
353 | 424 |
354 (gdb) | 425 (gdb) |
355 | 426 |
356 #. Run the following three commands from the gdb command line:: | 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):: |
357 | 429 |
| 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> |
| 435 |
| 436 #. For NaCl nexes, run the following commands from the gdb command line:: |
| 437 |
| 438 (gdb) target remote localhost:4014 |
358 (gdb) nacl-manifest <path-to-your-.nmf-file> | 439 (gdb) nacl-manifest <path-to-your-.nmf-file> |
359 (gdb) nacl-irt <path-to-Chrome-NaCl-integrated-runtime> | 440 (gdb) remote get irt <path-to-save-NaCl-integrated-runtime> |
360 (gdb) target remote localhost:4014 | 441 (gdb) nacl-irt <path-to-saved-NaCl-integrated-runtime> |
361 | 442 |
362 These commands are described below: | 443 #. The command used for PNaCl and NaCl are described below: |
363 | |
364 ``nacl-manifest <path>`` | |
365 Tells the debugger about your Native Client application by pointing it to | |
366 the application's manifest (.nmf) file. The manifest file lists your | |
367 application's executable (.nexe) files, as well as any libraries that are | |
368 linked with the application dynamically. | |
369 | |
370 ``nacl-irt <path>`` | |
371 Tells the debugger where to find the Native Client Integrated Runtime | |
372 (IRT). The IRT is located in the same directory as the Chrome executable, | |
373 or in a subdirectory named after the Chrome version. For example, if | |
374 you're running Chrome canary on Windows, the path to the IRT typically | |
375 looks something like ``C:/Users/<username>/AppData/Local/Google/Chrome | |
376 SxS/Application/23.0.1247.1/nacl_irt_x86_64.nexe``. | |
377 | 444 |
378 ``target remote localhost:4014`` | 445 ``target remote localhost:4014`` |
379 Tells the debugger how to connect to the debug stub in the Native Client | 446 Tells the debugger how to connect to the debug stub in the Native Client |
380 application loader. This connection occurs through TCP port 4014 (note | 447 application loader. This connection occurs through TCP port 4014 (note |
381 that this port is distinct from the port which the local web server uses | 448 that this port is distinct from the port which the local web server uses |
382 to listen for incoming requests, typically port 5103). | 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. |
| 453 |
| 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. |
| 459 |
| 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. |
| 465 |
| 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. |
| 476 |
| 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. |
383 | 481 |
384 A couple of notes on how to specify path names in the nacl-gdb commands | 482 A couple of notes on how to specify path names in the nacl-gdb commands |
385 above: | 483 above: |
386 | 484 |
387 * You can use a forward slash to separate directories on Linux, Mac, and | 485 * You can use a forward slash to separate directories on Linux, Mac, and |
388 Windows. If you use a backslash to separate directories on Windows, you | 486 Windows. If you use a backslash to separate directories on Windows, you |
389 must escape the backslash by using a double backslash "\\" between | 487 must escape the backslash by using a double backslash "\\" between |
390 directories. | 488 directories. |
391 * If any directories in the path have spaces in their name, you must put | 489 * If any directories in the path have spaces in their name, you must put |
392 quotation marks around the path. | 490 quotation marks around the path. |
393 | 491 |
394 As an example, here is a what these nacl-gdb commands might look like on | 492 As an example, here is a what these nacl-gdb commands might look like on |
395 Windows:: | 493 Windows:: |
396 | 494 |
| 495 target remote localhost:4014 |
397 nacl-manifest "C:/<NACL_SDK_ROOT>/examples/hello_world_gles/newlib/Debug/he
llo_world_gles.nmf" | 496 nacl-manifest "C:/<NACL_SDK_ROOT>/examples/hello_world_gles/newlib/Debug/he
llo_world_gles.nmf" |
398 nacl-irt "C:/Users/<username>/AppData/Local/Google/Chrome SxS/Application/2
3.0.1247.1/nacl_irt_x86_64.nexe" | 497 nacl-irt "C:/Users/<username>/AppData/Local/Google/Chrome SxS/Application/2
3.0.1247.1/nacl_irt_x86_64.nexe" |
399 target remote localhost:4014 | |
400 | 498 |
401 To save yourself some typing, you can put put these nacl-gdb commands in a | 499 To save yourself some typing, you can put put these nacl-gdb commands in a |
402 script file, and execute the file when you run nacl-gdb, like so:: | 500 script file, and execute the file when you run nacl-gdb, like so:: |
403 | 501 |
404 <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb -x <nacl-scrip
t-file> | 502 <NACL_SDK_ROOT>/toolchain/win_x86_newlib/bin/x86_64-nacl-gdb -x <nacl-scrip
t-file> |
405 | 503 |
406 If nacl-gdb connects successfully to Chrome, it displays a message such as | 504 If nacl-gdb connects successfully to Chrome, it displays a message such as |
407 the one below, followed by a gdb prompt:: | 505 the one below, followed by a gdb prompt:: |
408 | 506 |
409 0x000000000fc00200 in _start () | 507 0x000000000fc00200 in _start () |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 <http://www.chromium.org/nativeclient>`_ that describe how to do profiling on | 588 <http://www.chromium.org/nativeclient>`_ that describe how to do profiling on |
491 `64-bit Windows | 589 `64-bit Windows |
492 <https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/profiling-nacl
-apps-on-64-bit-windows>`_ | 590 <https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/profiling-nacl
-apps-on-64-bit-windows>`_ |
493 and `Linux | 591 and `Linux |
494 <http://www.chromium.org/nativeclient/how-tos/limited-profiling-with-oprofile-on
-x86-64>`_ | 592 <http://www.chromium.org/nativeclient/how-tos/limited-profiling-with-oprofile-on
-x86-64>`_ |
495 machines. | 593 machines. |
496 | 594 |
497 | 595 |
498 .. |menu-icon| image:: /images/menu-icon.png | 596 .. |menu-icon| image:: /images/menu-icon.png |
499 .. |puzzle| image:: /images/puzzle.png | 597 .. |puzzle| image:: /images/puzzle.png |
OLD | NEW |