From f0287ae19ba24983cb17b0614879195ffd051e77 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Thu, 26 May 2016 18:23:52 -0400 Subject: [PATCH] Convert documentation to AsciiDoc This huge patch converts the LTTng Documentation sources to the AsciiDoc format. A few advantages of this move are: * The AsciiDoc language is much more complete and semantically correct than Markdown (or even kramdown). Labeled lists, source file inclusion, admonition blocks, custom block and inline elements, and complex table layouts are just a few of the many features that Markdown lacks and which are needed for a high quality technical documentation. The previous solution to have those features was to embed HTML elements in the Markdown source files, which is a bad idea for an appropriate separation of presentation and content. * The asciidoc(1) tool can convert an AsciiDoc input file to a DocBook XML file, making it possible to render the LTTng Documentation in any desired format thanks to XSLT and/or custom scripts. * The asciidoc(1) tool can also convert an AsciiDoc input file to an HTML5 file, so that the LTTng Documentation can be previewed by anyone with tools that are available for all the major distributions. The actual content of the documentation is also completely altered here. A major overhaul was necessary after two years of untouched content. The text of v2.7 now follows the Microsoft Manual of Style (4th Edition), as it is clearly stated in the new CONTRIBUTING.adoc file. Various improvements are introduced to this documentation, including: * Diagrams are redesigned and updated, and new diagrams are added. * The "What's new" section presents the new features as categorized lists instead of flat paragraphs. * The "What is tracing?" section was proofread by a professional. * LTTng alternatives are added. * More tables are used. * New LTTng availability in major distributions. * Clear examples. * New glossary section. Signed-off-by: Philippe Proulx --- .gitignore | 2 + 2.5/images/export/core-concepts.png | Bin 0 -> 34047 bytes 2.5/images/export/lttng-live-relayd.png | Bin 0 -> 14146 bytes 2.5/images/export/lttng-lttng-gen-tp.png | Bin 0 -> 25334 bytes 2.5/images/export/plumbing.png | Bin 0 -> 64762 bytes 2.5/images/src/core-concepts | Bin 0 -> 2197 bytes 2.5/images/src/getting-started-lttng-gen-tp | Bin 0 -> 2192 bytes 2.5/images/src/lttng-live-relayd | Bin 0 -> 1856 bytes 2.5/images/src/plumbing | Bin 0 -> 3634 bytes 2.5/lttng-docs-2.5.txt | 5144 ++++++++++++ 2.6/images/export/concepts.png | Bin 0 -> 26173 bytes 2.6/images/export/lttng-live.png | Bin 0 -> 4634 bytes 2.6/images/export/many-sessions.png | Bin 0 -> 5144 bytes 2.6/images/export/plumbing-26.png | Bin 0 -> 27687 bytes 2.6/images/export/ust-flow.png | Bin 0 -> 11167 bytes 2.6/lttng-docs-2.6.txt | 5404 +++++++++++++ 2.7/images/export/concepts.png | Bin 0 -> 63215 bytes 2.7/images/export/event-rule.png | Bin 0 -> 35444 bytes 2.7/images/export/java-app.png | Bin 0 -> 6117 bytes 2.7/images/export/live.png | Bin 0 -> 5223 bytes 2.7/images/export/lttng-logger.png | Bin 0 -> 5638 bytes 2.7/images/export/many-sessions.png | Bin 0 -> 5623 bytes 2.7/images/export/per-process-buffering.png | Bin 0 -> 76856 bytes 2.7/images/export/per-user-buffering.png | Bin 0 -> 53422 bytes 2.7/images/export/plumbing-consumerd.png | Bin 0 -> 42055 bytes 2.7/images/export/plumbing-liblttng-ctl.png | Bin 0 -> 41491 bytes 2.7/images/export/plumbing-liblttng-ust.png | Bin 0 -> 41625 bytes 2.7/images/export/plumbing-lttng-cli.png | Bin 0 -> 41622 bytes 2.7/images/export/plumbing-lttng-modules.png | Bin 0 -> 41912 bytes .../export/plumbing-lttng-ust-agents.png | Bin 0 -> 41671 bytes 2.7/images/export/plumbing-relayd.png | Bin 0 -> 41662 bytes 2.7/images/export/plumbing-sessiond.png | Bin 0 -> 41872 bytes 2.7/images/export/plumbing.png | Bin 0 -> 42371 bytes 2.7/images/export/python-app.png | Bin 0 -> 6036 bytes .../export/track-1-3-4-7-10-13-15-16.png | Bin 0 -> 1291 bytes 2.7/images/export/track-1-4-15-16.png | Bin 0 -> 1251 bytes 2.7/images/export/track-3-4-7-10-13.png | Bin 0 -> 1280 bytes 2.7/images/export/track-6-11.png | Bin 0 -> 1225 bytes 2.7/images/export/track-all.png | Bin 0 -> 1065 bytes 2.7/images/export/untrack-all.png | Bin 0 -> 1018 bytes 2.7/images/export/ust-app.png | Bin 0 -> 7795 bytes 2.7/images/export/ust-flow.png | Bin 0 -> 16956 bytes ...lib+lib-dlopens-tp-so+lib-instrumented.png | Bin 0 -> 3069 bytes ...lib-linked-with-tp-so+lib-instrumented.png | Bin 0 -> 2847 bytes ...sit+app-dlopens-tp-so+app-instrumented.png | Bin 0 -> 2091 bytes ...lib+lib-dlopens-tp-so+lib-instrumented.png | Bin 0 -> 2889 bytes ...+lib-linked-with-tp-o+lib-instrumented.png | Bin 0 -> 2173 bytes ...lib-linked-with-tp-so+lib-instrumented.png | Bin 0 -> 2533 bytes ...+app-linked-with-tp-a+app-instrumented.png | Bin 0 -> 1683 bytes ...-tp-o+app-dlopens-lib+lib-instrumented.png | Bin 0 -> 2489 bytes ...+app-linked-with-tp-o+app-instrumented.png | Bin 0 -> 1400 bytes ...o+app-linked-with-lib+lib-instrumented.png | Bin 0 -> 2194 bytes ...app-linked-with-tp-so+app-instrumented.png | Bin 0 -> 1774 bytes ...oaded+app-dlopens-lib+lib-instrumented.png | Bin 0 -> 3414 bytes ...t-sit+tp-so-preloaded+app-instrumented.png | Bin 0 -> 2268 bytes ...d+app-linked-with-lib+lib-instrumented.png | Bin 0 -> 3096 bytes 2.7/lttng-docs-2.7.txt | 7031 +++++++++++++++++ CONTRIBUTING.adoc | 692 ++ CONTRIBUTING.md | 238 - Makefile | 28 + README.adoc | 43 + README.md | 14 - asciidoc.html5.conf | 36 + common/acknowledgements.txt | 21 + common/audience.txt | 11 + common/convention.txt | 25 + common/copyright.txt | 8 + common/ust-sit-step-tp-o-fpic.txt | 10 + common/ust-sit-step-tp-o.txt | 10 + common/ust-sit-step-tp-so.txt | 19 + common/warning-not-maintained.txt | 9 + common/welcome.txt | 25 + contents/getting-started/intro.md | 19 - .../tracing-the-linux-kernel.md | 66 - .../tracing-your-own-user-application.md | 244 - .../getting-started/viewing-and-analyzing.md | 159 - .../installing-lttng/building-from-source.md | 24 - .../desktop-distributions/archlinux.md | 37 - .../desktop-distributions/debian.md | 28 - .../desktop-distributions/intro.md | 14 - .../desktop-distributions/opensuse.md | 31 - .../desktop-distributions/ubuntu/intro.md | 11 - .../ubuntu/official-repositories.md | 26 - .../desktop-distributions/ubuntu/ppa.md | 18 - contents/installing-lttng/enterprise.md | 9 - contents/installing-lttng/intro.md | 31 - contents/nuts-and-bolts/intro.md | 8 - contents/nuts-and-bolts/lttng-alternatives.md | 52 - contents/nuts-and-bolts/what-is-tracing.md | 63 - contents/preface.md | 132 - contents/reference/intro.md | 7 - contents/reference/lttng-modules/intro.md | 5 - .../lttng-modules/lttng-modules-tp-fields.md | 302 - contents/reference/lttng-ust/intro.md | 5 - .../reference/lttng-ust/liblttng-ust/intro.md | 11 - .../liblttng-ust/liblttng-ust-tp-fields.md | 200 - .../liblttng-ust-tracepoint-loglevel.md | 101 - contents/reference/online-manpages.md | 17 - .../channel/channel-buffering-schemes.md | 18 - .../channel-overwrite-mode-vs-discard-mode.md | 80 - .../channel-subbuf-size-vs-subbuf-count.md | 91 - .../core-concepts/channel/channel-timers.md | 84 - .../core-concepts/channel/intro.md | 22 - .../core-concepts/domain.md | 26 - .../core-concepts/event.md | 34 - .../core-concepts/intro.md | 12 - .../core-concepts/tracing-session.md | 64 - contents/understanding-lttng/intro.md | 15 - .../understanding-lttng/plumbing/intro.md | 8 - .../plumbing/liblttng-ctl-lttng.md | 29 - .../plumbing/lttng-consumerd.md | 39 - .../plumbing/lttng-modules.md | 23 - .../plumbing/lttng-relayd.md | 42 - .../plumbing/lttng-sessiond.md | 82 - .../understanding-lttng/plumbing/lttng-ust.md | 29 - .../understanding-lttng/plumbing/overview.md | 46 - .../controlling-tracing/adding-context.md | 54 - .../basic-tracing-session-control.md | 26 - .../creating-destroying-tracing-sessions.md | 89 - .../fine-tuning-channels.md | 81 - .../enabling-disabling-channels/intro.md | 100 - .../enabling-disabling-events.md | 149 - .../using-lttng/controlling-tracing/intro.md | 28 - .../controlling-tracing/lttng-live.md | 82 - .../using-lttng/controlling-tracing/mi.md | 26 - .../persistent-memory-file-systems.md | 49 - .../controlling-tracing/pid-tracking.md | 121 - .../saving-loading-tracing-session.md | 49 - .../sending-trace-data-over-the-network.md | 50 - .../controlling-tracing/taking-a-snapshot.md | 71 - .../building-32-bit-lttng-tools.md | 26 - .../building-32-bit-lttng-ust.md | 44 - .../building-32-bit-userspace-rcu.md | 18 - .../building-64-bit-lttng-tools.md | 20 - ...lding-instrumented-32-bit-c-application.md | 26 - .../32-bit-on-64-bit/intro.md | 20 - ...unning-32-bit-and-64-bit-c-applications.md | 18 - .../advanced-techniques/intro.md | 6 - .../c-application/assigning-log-levels.md | 31 - .../building-linking/dynamic-linking.md | 119 - .../c-application/building-linking/intro.md | 35 - .../building-linking/lttng-ust-pkg-config.md | 21 - .../building-linking/static-linking.md | 129 - .../using-lttng-ust-with-daemons.md | 20 - .../c-application/defining-tracepoints.md | 176 - .../instrumenting/c-application/intro.md | 27 - .../c-application/lttng-gen-tp.md | 34 - ...st-environment-variables-compiler-flags.md | 28 - .../probing-the-application-source-code.md | 129 - .../instrumenting/c-application/tracef.md | 67 - .../instrumenting/c-application/tracelog.md | 61 - .../c-application/tracepoint-provider.md | 202 - .../c-application/using-tracepoint-classes.md | 163 - .../instrumenting/cxx-application.md | 12 - .../instrumenting-linux-kernel-tracing.md | 72 - .../intro.md | 21 - .../lttng-adaptation-layer.md | 146 - .../lttng-tracepoint-event-code.md | 73 - .../mainline-trace-event.md | 98 - .../instrumenting-out-of-tree-linux-kernel.md | 46 - .../instrumenting-linux-kernel/intro.md | 42 - contents/using-lttng/instrumenting/intro.md | 43 - .../instrumenting/java-application/intro.md | 24 - .../instrumenting/java-application/jul.md | 61 - .../instrumenting/java-application/log4j.md | 64 - .../prebuilt-ust-helpers/intro.md | 24 - .../liblttng-ust-cyg-profile.md | 173 - .../prebuilt-ust-helpers/liblttng-ust-dl.md | 84 - .../liblttng-ust-libc-pthread-wrapper.md | 158 - .../instrumenting/proc-lttng-logger-abi.md | 37 - .../instrumenting/python-application.md | 75 - contents/using-lttng/intro.md | 41 - contents/whats-new.md | 58 - images/export/concepts.png | Bin 36697 -> 0 bytes images/export/lttng-live.png | Bin 8971 -> 0 bytes images/export/many-sessions.png | Bin 12226 -> 0 bytes images/export/plumbing-27.png | Bin 49389 -> 0 bytes images/export/track-1-3-4-7-10-13-15-16.png | Bin 2711 -> 0 bytes images/export/track-1-4-15-16.png | Bin 2500 -> 0 bytes images/export/track-3-4-7-10-13.png | Bin 2647 -> 0 bytes images/export/track-6-11.png | Bin 2466 -> 0 bytes images/export/track-all.png | Bin 2480 -> 0 bytes images/export/untrack-all.png | Bin 2158 -> 0 bytes images/export/ust-flow.png | Bin 24052 -> 0 bytes toc/docs.yml | 227 - tools/.gitignore | 1 + tools/asciidoc.check.conf | 31 + tools/check.py | 173 + tools/docs2json.py | 326 - tools/dotlinks.py | 76 - 190 files changed, 18723 insertions(+), 6992 deletions(-) create mode 100644 .gitignore create mode 100644 2.5/images/export/core-concepts.png create mode 100644 2.5/images/export/lttng-live-relayd.png create mode 100644 2.5/images/export/lttng-lttng-gen-tp.png create mode 100644 2.5/images/export/plumbing.png create mode 100644 2.5/images/src/core-concepts create mode 100644 2.5/images/src/getting-started-lttng-gen-tp create mode 100644 2.5/images/src/lttng-live-relayd create mode 100644 2.5/images/src/plumbing create mode 100644 2.5/lttng-docs-2.5.txt create mode 100644 2.6/images/export/concepts.png create mode 100644 2.6/images/export/lttng-live.png create mode 100644 2.6/images/export/many-sessions.png create mode 100644 2.6/images/export/plumbing-26.png create mode 100644 2.6/images/export/ust-flow.png create mode 100644 2.6/lttng-docs-2.6.txt create mode 100644 2.7/images/export/concepts.png create mode 100644 2.7/images/export/event-rule.png create mode 100644 2.7/images/export/java-app.png create mode 100644 2.7/images/export/live.png create mode 100644 2.7/images/export/lttng-logger.png create mode 100644 2.7/images/export/many-sessions.png create mode 100644 2.7/images/export/per-process-buffering.png create mode 100644 2.7/images/export/per-user-buffering.png create mode 100644 2.7/images/export/plumbing-consumerd.png create mode 100644 2.7/images/export/plumbing-liblttng-ctl.png create mode 100644 2.7/images/export/plumbing-liblttng-ust.png create mode 100644 2.7/images/export/plumbing-lttng-cli.png create mode 100644 2.7/images/export/plumbing-lttng-modules.png create mode 100644 2.7/images/export/plumbing-lttng-ust-agents.png create mode 100644 2.7/images/export/plumbing-relayd.png create mode 100644 2.7/images/export/plumbing-sessiond.png create mode 100644 2.7/images/export/plumbing.png create mode 100644 2.7/images/export/python-app.png create mode 100644 2.7/images/export/track-1-3-4-7-10-13-15-16.png create mode 100644 2.7/images/export/track-1-4-15-16.png create mode 100644 2.7/images/export/track-3-4-7-10-13.png create mode 100644 2.7/images/export/track-6-11.png create mode 100644 2.7/images/export/track-all.png create mode 100644 2.7/images/export/untrack-all.png create mode 100644 2.7/images/export/ust-app.png create mode 100644 2.7/images/export/ust-flow.png create mode 100644 2.7/images/export/ust-sit+app-dlopens-lib+lib-dlopens-tp-so+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-dlopens-lib+lib-linked-with-tp-so+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-dlopens-tp-so+app-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-lib+lib-dlopens-tp-so+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-lib+lib-linked-with-tp-o+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-lib+lib-linked-with-tp-so+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-tp-a+app-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-tp-o+app-dlopens-lib+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-tp-o+app-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-tp-o+app-linked-with-lib+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+app-linked-with-tp-so+app-instrumented.png create mode 100644 2.7/images/export/ust-sit+tp-so-preloaded+app-dlopens-lib+lib-instrumented.png create mode 100644 2.7/images/export/ust-sit+tp-so-preloaded+app-instrumented.png create mode 100644 2.7/images/export/ust-sit+tp-so-preloaded+app-linked-with-lib+lib-instrumented.png create mode 100644 2.7/lttng-docs-2.7.txt create mode 100644 CONTRIBUTING.adoc delete mode 100644 CONTRIBUTING.md create mode 100644 Makefile create mode 100644 README.adoc delete mode 100644 README.md create mode 100644 asciidoc.html5.conf create mode 100644 common/acknowledgements.txt create mode 100644 common/audience.txt create mode 100644 common/convention.txt create mode 100644 common/copyright.txt create mode 100644 common/ust-sit-step-tp-o-fpic.txt create mode 100644 common/ust-sit-step-tp-o.txt create mode 100644 common/ust-sit-step-tp-so.txt create mode 100644 common/warning-not-maintained.txt create mode 100644 common/welcome.txt delete mode 100644 contents/getting-started/intro.md delete mode 100644 contents/getting-started/tracing-the-linux-kernel.md delete mode 100644 contents/getting-started/tracing-your-own-user-application.md delete mode 100644 contents/getting-started/viewing-and-analyzing.md delete mode 100644 contents/installing-lttng/building-from-source.md delete mode 100644 contents/installing-lttng/desktop-distributions/archlinux.md delete mode 100644 contents/installing-lttng/desktop-distributions/debian.md delete mode 100644 contents/installing-lttng/desktop-distributions/intro.md delete mode 100644 contents/installing-lttng/desktop-distributions/opensuse.md delete mode 100644 contents/installing-lttng/desktop-distributions/ubuntu/intro.md delete mode 100644 contents/installing-lttng/desktop-distributions/ubuntu/official-repositories.md delete mode 100644 contents/installing-lttng/desktop-distributions/ubuntu/ppa.md delete mode 100644 contents/installing-lttng/enterprise.md delete mode 100644 contents/installing-lttng/intro.md delete mode 100644 contents/nuts-and-bolts/intro.md delete mode 100644 contents/nuts-and-bolts/lttng-alternatives.md delete mode 100644 contents/nuts-and-bolts/what-is-tracing.md delete mode 100644 contents/preface.md delete mode 100644 contents/reference/intro.md delete mode 100644 contents/reference/lttng-modules/intro.md delete mode 100644 contents/reference/lttng-modules/lttng-modules-tp-fields.md delete mode 100644 contents/reference/lttng-ust/intro.md delete mode 100644 contents/reference/lttng-ust/liblttng-ust/intro.md delete mode 100644 contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tp-fields.md delete mode 100644 contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tracepoint-loglevel.md delete mode 100644 contents/reference/online-manpages.md delete mode 100644 contents/understanding-lttng/core-concepts/channel/channel-buffering-schemes.md delete mode 100644 contents/understanding-lttng/core-concepts/channel/channel-overwrite-mode-vs-discard-mode.md delete mode 100644 contents/understanding-lttng/core-concepts/channel/channel-subbuf-size-vs-subbuf-count.md delete mode 100644 contents/understanding-lttng/core-concepts/channel/channel-timers.md delete mode 100644 contents/understanding-lttng/core-concepts/channel/intro.md delete mode 100644 contents/understanding-lttng/core-concepts/domain.md delete mode 100644 contents/understanding-lttng/core-concepts/event.md delete mode 100644 contents/understanding-lttng/core-concepts/intro.md delete mode 100644 contents/understanding-lttng/core-concepts/tracing-session.md delete mode 100644 contents/understanding-lttng/intro.md delete mode 100644 contents/understanding-lttng/plumbing/intro.md delete mode 100644 contents/understanding-lttng/plumbing/liblttng-ctl-lttng.md delete mode 100644 contents/understanding-lttng/plumbing/lttng-consumerd.md delete mode 100644 contents/understanding-lttng/plumbing/lttng-modules.md delete mode 100644 contents/understanding-lttng/plumbing/lttng-relayd.md delete mode 100644 contents/understanding-lttng/plumbing/lttng-sessiond.md delete mode 100644 contents/understanding-lttng/plumbing/lttng-ust.md delete mode 100644 contents/understanding-lttng/plumbing/overview.md delete mode 100644 contents/using-lttng/controlling-tracing/adding-context.md delete mode 100644 contents/using-lttng/controlling-tracing/basic-tracing-session-control.md delete mode 100644 contents/using-lttng/controlling-tracing/creating-destroying-tracing-sessions.md delete mode 100644 contents/using-lttng/controlling-tracing/enabling-disabling-channels/fine-tuning-channels.md delete mode 100644 contents/using-lttng/controlling-tracing/enabling-disabling-channels/intro.md delete mode 100644 contents/using-lttng/controlling-tracing/enabling-disabling-events.md delete mode 100644 contents/using-lttng/controlling-tracing/intro.md delete mode 100644 contents/using-lttng/controlling-tracing/lttng-live.md delete mode 100644 contents/using-lttng/controlling-tracing/mi.md delete mode 100644 contents/using-lttng/controlling-tracing/persistent-memory-file-systems.md delete mode 100644 contents/using-lttng/controlling-tracing/pid-tracking.md delete mode 100644 contents/using-lttng/controlling-tracing/saving-loading-tracing-session.md delete mode 100644 contents/using-lttng/controlling-tracing/sending-trace-data-over-the-network.md delete mode 100644 contents/using-lttng/controlling-tracing/taking-a-snapshot.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-tools.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-ust.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-userspace-rcu.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-64-bit-lttng-tools.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-instrumented-32-bit-c-application.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/intro.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/running-32-bit-and-64-bit-c-applications.md delete mode 100644 contents/using-lttng/instrumenting/advanced-techniques/intro.md delete mode 100644 contents/using-lttng/instrumenting/c-application/assigning-log-levels.md delete mode 100644 contents/using-lttng/instrumenting/c-application/building-linking/dynamic-linking.md delete mode 100644 contents/using-lttng/instrumenting/c-application/building-linking/intro.md delete mode 100644 contents/using-lttng/instrumenting/c-application/building-linking/lttng-ust-pkg-config.md delete mode 100644 contents/using-lttng/instrumenting/c-application/building-linking/static-linking.md delete mode 100644 contents/using-lttng/instrumenting/c-application/building-linking/using-lttng-ust-with-daemons.md delete mode 100644 contents/using-lttng/instrumenting/c-application/defining-tracepoints.md delete mode 100644 contents/using-lttng/instrumenting/c-application/intro.md delete mode 100644 contents/using-lttng/instrumenting/c-application/lttng-gen-tp.md delete mode 100644 contents/using-lttng/instrumenting/c-application/lttng-ust-environment-variables-compiler-flags.md delete mode 100644 contents/using-lttng/instrumenting/c-application/probing-the-application-source-code.md delete mode 100644 contents/using-lttng/instrumenting/c-application/tracef.md delete mode 100644 contents/using-lttng/instrumenting/c-application/tracelog.md delete mode 100644 contents/using-lttng/instrumenting/c-application/tracepoint-provider.md delete mode 100644 contents/using-lttng/instrumenting/c-application/using-tracepoint-classes.md delete mode 100644 contents/using-lttng/instrumenting/cxx-application.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/instrumenting-linux-kernel-tracing.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/intro.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-adaptation-layer.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-tracepoint-event-code.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/mainline-trace-event.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-out-of-tree-linux-kernel.md delete mode 100644 contents/using-lttng/instrumenting/instrumenting-linux-kernel/intro.md delete mode 100644 contents/using-lttng/instrumenting/intro.md delete mode 100644 contents/using-lttng/instrumenting/java-application/intro.md delete mode 100644 contents/using-lttng/instrumenting/java-application/jul.md delete mode 100644 contents/using-lttng/instrumenting/java-application/log4j.md delete mode 100644 contents/using-lttng/instrumenting/prebuilt-ust-helpers/intro.md delete mode 100644 contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-cyg-profile.md delete mode 100644 contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-dl.md delete mode 100644 contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-libc-pthread-wrapper.md delete mode 100644 contents/using-lttng/instrumenting/proc-lttng-logger-abi.md delete mode 100644 contents/using-lttng/instrumenting/python-application.md delete mode 100644 contents/using-lttng/intro.md delete mode 100644 contents/whats-new.md delete mode 100644 images/export/concepts.png delete mode 100644 images/export/lttng-live.png delete mode 100644 images/export/many-sessions.png delete mode 100644 images/export/plumbing-27.png delete mode 100644 images/export/track-1-3-4-7-10-13-15-16.png delete mode 100644 images/export/track-1-4-15-16.png delete mode 100644 images/export/track-3-4-7-10-13.png delete mode 100644 images/export/track-6-11.png delete mode 100644 images/export/track-all.png delete mode 100644 images/export/untrack-all.png delete mode 100644 images/export/ust-flow.png delete mode 100644 toc/docs.yml create mode 100644 tools/.gitignore create mode 100644 tools/asciidoc.check.conf create mode 100644 tools/check.py delete mode 100755 tools/docs2json.py delete mode 100755 tools/dotlinks.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28d4854 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.html +*.xml diff --git a/2.5/images/export/core-concepts.png b/2.5/images/export/core-concepts.png new file mode 100644 index 0000000000000000000000000000000000000000..67a4d5f9ab58d63b37330339df3a95028c5c747b GIT binary patch literal 34047 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 Qz@Iy}AKc2ni3x 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 literal 0 HcmV?d00001 diff --git a/2.5/images/export/lttng-lttng-gen-tp.png b/2.5/images/export/lttng-lttng-gen-tp.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9694a569fa2976ad92a40bf62690ab73ae770a GIT binary patch literal 25334 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 YZkC;iJ(>}OTYmKlck`}c>@0XNH3_ZPk5cfhY% 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%0Ag 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 -``` - -Replace the `tip` class with `warn` for a warning block, and with `err` -for an error message block (when JavaScript is needed but is disabled, etc.). - -Title should be `Tip:` for a tip, `Note:` for a note, `Warning:` for a -warning, and `Error:` for an error. - - -#### External links - -Internal links should always use Markdown -(`[caption](#doc-section)`). External links, however, need a special -style and must use the `` tag with the `ext` CSS class: - -```html -The LTTng Documentation is -public. -``` - -Sometimes, however, it is necessary to write internal links in plain -HTML, for example in tip blocks, since Markdown code is not processed. -In these cases, add the `int` CSS class as a hint to prevent the static -analyzer from complaining (`tools/checkdocs.py`). - - -#### Abbreviations - -Use `` for describing abbreviations. This should only be used -for the first use of the abbreviation: - -```html -The LTTng -project is an open source system software package [...] -``` - - -#### Non-breaking spaces - -Sometimes, a non-breaking space HTML entity (` `) needs to be -explicitly written. - -Examples: - -```html -The size of this file is 1039 bytes. - -This integer is displayed in base 16. - -A check is performed every 3000 ms. -``` - - -#### Placeholders in inline code - -You must use `` to emphasize a placeholder within a `` tag -because Markdown backticks (`) always render their -content literally: - -```html -Name your file something_sys.c, where -sys is your system name. -``` - - -#### Terminal boxes - -A terminal box, where command lines are shown, is a simple `
`
-with the `term` class:
-
-```html
-
-echo This is a terminal box
-
-``` - -Do not prefix command lines with prompts (`$`/`#`) since this makes -copy/paste operations painful. - -You may use `` tags to emphasize a part of the command line: - -```html -
-echo This is a terminal box
-
-``` - -Results of commands, if needed, should be presented in a simple -`text` kramdown code block: - -
-~~~ text
-[15:30:34.835895035] (+?.?????????) hostname hello_world: { cpu_id = 1 }, { my_int = 8, char0 = 68, char1 = 97, product = "DataTraveler 2.0" }
-[15:30:42.262781421] (+7.426886386) hostname hello_world: { cpu_id = 1 }, { my_int = 9, char0 = 80, char1 = 97, product = "Patriot Memory" }
-[15:30:48.175621778] (+5.912840357) hostname hello_world: { cpu_id = 1 }, { my_int = 10, char0 = 68, char1 = 97, product = "DataTraveler 2.0" }
-~~~
-
- - -#### Images - -Use - -```html -
- Short description -
-``` - -Replace `docs26` with the appropriate version tag depending on the -checked out branch. - -to display an image. Change `img-70` to `img-` followed by the -width percentage you wish. - - -Convention ----------- - -A few rules to comply with in order to keep the text as -consistent as possible: - - * Use _user space_, not _userspace_ nor _user-space_. - (neither _user land_). - * Use _file system_, not _filesystem_. - * Use _use case_, not _use-case_ nor _usecase_. - * Use _the C standard library_, not _libc_. - * Use _log level_, not _loglevel_. - * Use complete LTTng project names: _LTTng-modules_, _LTTng-UST_ and - _LTTng-tools_, not _modules_, _UST_ and _tools_. - * All code snippets should use 4 spaces for indentation (even C) - so that they are not too large. - * Prefer emphasis (Markdown: `_something_`, HTML: `something`) - to strong (Markdown: `**something**`, HTML: `something`) - for emphasizing text. - * Try to stay behind the 72th column mark if possible, and behind - the 80th column otherwise. - * Do not end directory paths with a forward slash - (good: `include/trace/events`, bad: `include/trace/events/`). - * Minimize the use of the future tense (_will_). - * Do not use Latin abbreviations (_e.g._, _i.e._, _etc._). - - -Committing ----------- - -If you make a change to a single contents file, prefix your Git commit -message's first line with the file ID followed by `: `, e.g: - - archlinux: minor fix diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a66e8e1 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +CONF = asciidoc.html5.conf +PREFIX = lttng-docs +ALLVERSIONS = 2.5 2.6 2.7 + +ASCIIDOC = asciidoc -v -f $(CONF) -a source-highlighter=pygments +RM = rm -rf + +htmldst = $(1)/$(PREFIX)-$(1).html + +.PHONY: all + +all: $(ALLVERSIONS) + +.PHONY: $(ALLVERSIONS) + +2.5: $(call htmldst,2.5) + +2.6: $(call htmldst,2.6) + +2.7: $(call htmldst,2.7) + +%.html: %.txt $(CONF) + $(ASCIIDOC) $< + +.PHONY: clean + +clean: + $(RM) $(foreach version,$(ALLVERSIONS),$(call htmldst,$(version))) diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..40b2d6c --- /dev/null +++ b/README.adoc @@ -0,0 +1,43 @@ +The LTTng Documentation: Source +=============================== + +This is the official repository of the +http://lttng.org/docs[online LTTng Documentation's] source. + + +== Generate + +You can generate your own version of the LTTng Documentation by running: + +---- +make +---- + +The generated HTML file is named ++__VERSION__/lttng-docs-__VERSION__.html+, where +__VERSION__+ is the +version of the LTTng project documented by this file. + +You can also make a specific version: + +---- +make 2.7 +---- + +NOTE: The SVG animations rendered on the LTTng website are not +available in the generated version. + +You need the following tools to generate the LTTng Documentation: + +* http://www.methods.co.nz/asciidoc/[AsciiDoc] >= 8.6.5 +* http://pygments.org/[Pygments] and the `pygmentize` command + + +== Contribute + +To contribute: + +. Fork this repo. +. Make your change, following the link:CONTRIBUTING.adoc[contributor's guide]. +. Create a pull request. + +Thanks for your contributions and fixes! diff --git a/README.md b/README.md deleted file mode 100644 index 59a0eab..0000000 --- a/README.md +++ /dev/null @@ -1,14 +0,0 @@ -LTTng Documentation -=================== - -This is the official repository of the -[online LTTng Documentation's](http://lttng.org/docs) source. - -To contribute: - - 1. Fork this repo - 2. Checkout the appropriate branch (`stable-2.x` or `master`) - 3. Make your change, following the [contributor's guide](CONTRIBUTING.md) - 4. Create a pull request - -Thanks for your contributions and fixes! diff --git a/asciidoc.html5.conf b/asciidoc.html5.conf new file mode 100644 index 0000000..2aff8bb --- /dev/null +++ b/asciidoc.html5.conf @@ -0,0 +1,36 @@ +[attributes] +toc= +toclevels=6 +imagesdir=images/export +autowidth-option= +note-no-anim="Animations are not supported in this output." + +[macros] +(?su)[\\]?(?Pman):(?P\S*?)\((?P
.*?)\)= +(?su)[\\]?(?Ppath):\{(?P[^}]+)\}= +(?su)[\\]?(?Pdir):\{(?P[^}]+)\}= +(?su)[\\]?(?Penv):(?P[a-zA-Z0-9_]+)= +(?su)[\\]?(?Pcmd):(?P[a-zA-Z0-9_-]+)= +(?su)[\\]?(?Pnoch):\{(?P[^}]+)\}= + +[man-inlinemacro] +{page}({section}) + +[path-inlinemacro] +{path} + +[dir-inlinemacro] +{dir} + +[env-inlinemacro] +{var} + +[cmd-inlinemacro] +{cmd} + +[noch-inlinemacro] +{text} + +[tabledef-default] +style=def +def-style=options=("header",) diff --git a/common/acknowledgements.txt b/common/acknowledgements.txt new file mode 100644 index 0000000..c31b75f --- /dev/null +++ b/common/acknowledgements.txt @@ -0,0 +1,21 @@ +[[acknowledgements]] +=== Acknowledgements + +A few people made the online LTTng Documentation possible. + +http://eepp.ca/[Philippe Proulx] wrote most of the content, created +the diagrams, and formatted the document. He is the current maintainer +of the LTTng Documentation. + +Daniel U. Thibault, from the DRDC, wrote an open guide called _LTTng: +The Linux Trace Toolkit Next Generation{nbsp}—{nbsp}A +Comprehensive User's Guide (version 2.3 edition)_ which was used +to complete parts of the <> and +<> sections and for a few passages here +and there. + +The entire http://www.efficios.com/[EfficiOS] team made essential reviews +of the whole document. + +We sincerely thank everyone who helped enhance the quality of this +documentation. diff --git a/common/audience.txt b/common/audience.txt new file mode 100644 index 0000000..d220ce5 --- /dev/null +++ b/common/audience.txt @@ -0,0 +1,11 @@ +[[audience]] +=== Target audience + +The material of this documentation is appropriate for intermediate to +advanced software developers working in a Linux environment and +interested in efficient software tracing. LTTng is also worth a +try for students interested in the inner mechanics of their systems. + +If you do not have a programming background, you may wish to skip +everything related to instrumentation, which often requires at least +some programming language skills. diff --git a/common/convention.txt b/common/convention.txt new file mode 100644 index 0000000..b725241 --- /dev/null +++ b/common/convention.txt @@ -0,0 +1,25 @@ +[[convention]] +=== Convention + +Function names, parameter names, variable names, command names, argument +names, file system paths, file names, and other literal strings are +written using a `monospace typeface` in this document. An +_italic_ +word+ within such a block is a placeholder, usually described in the +following sentence. + +Practical tips and notes are given throughout the document using the +following style: + +TIP: Make sure you read the tips. + +Terminal boxes are used to show command lines: + +[role="term"] +---- +echo This is a terminal box +---- + +Typical command prompts, like `$` and `#`, are not shown in terminal +boxes to make copy operations easier, especially for multiline commands +which you can copy and paste as is to your terminal. Command lines +which you need to execute as a root user start with cmd:sudo. diff --git a/common/copyright.txt b/common/copyright.txt new file mode 100644 index 0000000..b0d2ed9 --- /dev/null +++ b/common/copyright.txt @@ -0,0 +1,8 @@ +[[copyright]] +== Copyright + +Copyright © 2014-2016 http://lttng.org/[The LTTng Project] + +This work is licensed under a +http://creativecommons.org/licenses/by/4.0/[Creative Commons +Attribution 4.0 International License]. diff --git a/common/ust-sit-step-tp-o-fpic.txt b/common/ust-sit-step-tp-o-fpic.txt new file mode 100644 index 0000000..e0b2d0f --- /dev/null +++ b/common/ust-sit-step-tp-o-fpic.txt @@ -0,0 +1,10 @@ +To build the tracepoint provider package object file: + +* Compile the <>: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c tpp.c +---- +-- diff --git a/common/ust-sit-step-tp-o.txt b/common/ust-sit-step-tp-o.txt new file mode 100644 index 0000000..a5ff6e3 --- /dev/null +++ b/common/ust-sit-step-tp-o.txt @@ -0,0 +1,10 @@ +To build the tracepoint provider package object file: + +* Compile the <>: ++ +-- +[role="term"] +---- +gcc -I. -c tpp.c +---- +-- diff --git a/common/ust-sit-step-tp-so.txt b/common/ust-sit-step-tp-so.txt new file mode 100644 index 0000000..aa5aa76 --- /dev/null +++ b/common/ust-sit-step-tp-so.txt @@ -0,0 +1,19 @@ +To build the tracepoint provider package shared object: + +. Compile the <>: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c tpp.c +---- +-- + +. Build the tracepoint provider package shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libtpp.so tpp.o -llttng-ust -ldl +---- +-- diff --git a/common/warning-not-maintained.txt b/common/warning-not-maintained.txt new file mode 100644 index 0000000..8abca91 --- /dev/null +++ b/common/warning-not-maintained.txt @@ -0,0 +1,9 @@ +[WARNING] +[role="not-maintained"] +===== +This version of the LTTng Documentation is **not maintained anymore**, +since the corresponding version of LTTng is not the current release, +nor the previous release. + +Visit the link:/docs[latest LTTng Documentation version]. +===== diff --git a/common/welcome.txt b/common/welcome.txt new file mode 100644 index 0000000..782027e --- /dev/null +++ b/common/welcome.txt @@ -0,0 +1,25 @@ +[[welcome]] +== Welcome! + +Welcome to the **LTTng Documentation**! + +The _Linux Trace Toolkit: next generation_ is an open source software +toolkit used to simultaneously trace the Linux kernel, user applications, +and user libraries. LTTng consists of <> +(for Linux kernel tracing) and dynamically loaded +<> (for user application and library tracing). +A <> controls the LTTng tracers after it +receives commands from the <>. + +[NOTE] +.Open source documentation +==== +This is an **open documentation**: its source is available in a +https://github.com/lttng/lttng-docs[public Git repository]. + +Should you find any error in the content of this text, any grammatical +mistake, or any dead link, we would be very grateful if you would file a +GitHub issue for it or, even better, contribute a patch to this +documentation by creating a pull request. +==== diff --git a/contents/getting-started/intro.md b/contents/getting-started/intro.md deleted file mode 100644 index b034bd0..0000000 --- a/contents/getting-started/intro.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: getting-started ---- - -This is a small guide to get started quickly with LTTng kernel and user -space tracing. For a more thorough understanding of LTTng and intermediate -to advanced use cases and, see [Understanding LTTng](#doc-understanding-lttng) -and [Using LTTng](#doc-using-lttng). - -Before reading this guide, make sure LTTng -[is installed](#doc-installing-lttng). LTTng-tools is required. Also install -LTTng-modules for -[tracing the Linux kernel](#doc-tracing-the-linux-kernel) and LTTng-UST -for -[tracing your own user space applications](#doc-tracing-your-own-user-application). -When the traces are finally written and complete, the -[Viewing and analyzing your traces](#doc-viewing-and-analyzing-your-traces) -section of this chapter will help you analyze your tracepoint events -to investigate. diff --git a/contents/getting-started/tracing-the-linux-kernel.md b/contents/getting-started/tracing-the-linux-kernel.md deleted file mode 100644 index 659aa47..0000000 --- a/contents/getting-started/tracing-the-linux-kernel.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -id: tracing-the-linux-kernel ---- - -Make sure LTTng-tools and LTTng-modules packages -[are installed](#doc-installing-lttng). - -Since you're about to trace the Linux kernel itself, let's look at the -available kernel events using the `lttng` tool, which has a -Git-like command line structure: - -
-lttng list --kernel
-
- -Before tracing, you need to create a session: - -
-sudo lttng create
-
- -
-

- Tip:You can avoid using sudo in - the previous and following commands if your user is a member of the - tracing - group. -

-
- -Let's now enable some events for this session: - -
-sudo lttng enable-event --kernel sched_switch,sched_process_fork
-
- -Or you might want to simply enable all available kernel events (beware -that trace files grow rapidly when doing this): - -
-sudo lttng enable-event --kernel --all
-
- -Start tracing: - -
-sudo lttng start
-
- -By default, traces are saved in -~/lttng-traces/name-date-time, -where name is the session name. - -When you're done tracing: - -
-sudo lttng stop
-sudo lttng destroy
-
- -Although `destroy` looks scary here, it doesn't actually destroy the -written trace files: it only destroys the tracing session. - -What's next? Have a look at -[Viewing and analyzing your traces](#doc-viewing-and-analyzing-your-traces) -to view and analyze the trace you just recorded. diff --git a/contents/getting-started/tracing-your-own-user-application.md b/contents/getting-started/tracing-your-own-user-application.md deleted file mode 100644 index 252edce..0000000 --- a/contents/getting-started/tracing-your-own-user-application.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -id: tracing-your-own-user-application ---- - -The previous section helped you create a trace out of Linux kernel events. -This section steps you through a simple example showing you how to trace -a _Hello world_ program written in C. - -Make sure the LTTng-tools and LTTng-UST packages -[are installed](#doc-installing-lttng). - -Tracing is just like having `printf()` calls at specific locations of -your source code, albeit LTTng is much faster and more flexible than -`printf()`. In the LTTng realm, **`tracepoint()`** is analogous to -`printf()`. - -Unlike `printf()`, though, `tracepoint()` does not use a format string to -know the types of its arguments: the formats of all tracepoints must be -defined before using them. So before even writing our _Hello world_ program, -we need to define the format of our tracepoint. This is done by creating a -**tracepoint provider**, which consists of a tracepoint provider header -(`.h` file) and a tracepoint provider definition (`.c` file). - -The tracepoint provider header contains some boilerplate as well as a -list of tracepoint definitions and other optional definition entries -which we skip for this quickstart. Each tracepoint is defined using the -`TRACEPOINT_EVENT()` macro. For each tracepoint, you must provide: - - * a **provider name**, which is the "scope" or namespace of this - tracepoint (this usually includes the company and project names) - * a **tracepoint name** - * a **list of arguments** for the eventual `tracepoint()` call, each - item being: - * the argument C type - * the argument name - * a **list of fields**, which correspond to the actual fields of the - recorded events for this tracepoint - -Here's an example of a simple tracepoint provider header with two -arguments: an integer and a string: - -~~~ c -#undef TRACEPOINT_PROVIDER -#define TRACEPOINT_PROVIDER hello_world - -#undef TRACEPOINT_INCLUDE -#define TRACEPOINT_INCLUDE "./hello-tp.h" - -#if !defined(_HELLO_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) -#define _HELLO_TP_H - -#include - -TRACEPOINT_EVENT( - hello_world, - my_first_tracepoint, - TP_ARGS( - int, my_integer_arg, - char*, my_string_arg - ), - TP_FIELDS( - ctf_string(my_string_field, my_string_arg) - ctf_integer(int, my_integer_field, my_integer_arg) - ) -) - -#endif /* _HELLO_TP_H */ - -#include -~~~ - -The exact syntax is well explained in the -[C application](#doc-c-application) instrumentation guide of the -[Using LTTng](#doc-using-lttng) chapter, as well as in the -LTTng-UST man page. - -Save the above snippet as `hello-tp.h`. - -Write the tracepoint provider definition as `hello-tp.c`: - -~~~ c -#define TRACEPOINT_CREATE_PROBES -#define TRACEPOINT_DEFINE - -#include "hello-tp.h" -~~~ - -Create the tracepoint provider: - -
-gcc -c -I. hello-tp.c
-
- -Now, by including `hello-tp.h` in your own application, you may use the -tracepoint defined above by properly refering to it when calling -`tracepoint()`: - -~~~ c -#include -#include "hello-tp.h" - -int main(int argc, char *argv[]) -{ - int x; - - puts("Hello, World!\nPress Enter to continue..."); - - /* - * The following getchar() call is only placed here for the purpose - * of this demonstration, for pausing the application in order for - * you to have time to list its events. It's not needed otherwise. - */ - getchar(); - - /* - * A tracepoint() call. Arguments, as defined in hello-tp.h: - * - * 1st: provider name (always) - * 2nd: tracepoint name (always) - * 3rd: my_integer_arg (first user-defined argument) - * 4th: my_string_arg (second user-defined argument) - * - * Notice the provider and tracepoint names are NOT strings; - * they are in fact parts of variables created by macros in - * hello-tp.h. - */ - tracepoint(hello_world, my_first_tracepoint, 23, "hi there!"); - - for (x = 0; x < argc; ++x) { - tracepoint(hello_world, my_first_tracepoint, x, argv[x]); - } - - puts("Quitting now!"); - - tracepoint(hello_world, my_first_tracepoint, x * x, "x^2"); - - return 0; -} -~~~ - -Save this as `hello.c`, next to `hello-tp.c`. - -Notice `hello-tp.h`, the tracepoint provider header, is included -by `hello.c`. - -You are now ready to compile the application with LTTng-UST support: - -
-gcc -c hello.c
-gcc -o hello hello.o hello-tp.o -llttng-ust -ldl
-
- -Here's the whole build process: - -
-User space tracing's build process -
- User space tracing build process -
-
- -If you followed the -[Tracing the Linux kernel](#doc-tracing-the-linux-kernel) tutorial, the -following steps should look familiar. - -First, run the application with a few arguments: - -
-./hello world and beyond
-
- -You should see - -~~~ text -Hello, World! -Press Enter to continue... -~~~ - -Use the `lttng` tool to list all available user space events: - -
-lttng list --userspace
-
- -You should see the `hello_world:my_first_tracepoint` tracepoint listed -under the `./hello` process. - -Create a tracing session: - -
-lttng create
-
- -Enable the `hello_world:my_first_tracepoint` tracepoint: - -
-lttng enable-event --userspace hello_world:my_first_tracepoint
-
- -Start tracing: - -
-lttng start
-
- -Go back to the running `hello` application and press Enter. All `tracepoint()` -calls are executed and the program finally exits. - -Stop tracing: - -
-lttng stop
-
- -Done! You may use `lttng view` to list the recorded events. This command -starts -babeltrace -in the background, if it's installed: - -
-lttng view
-
- -should output something like: - -~~~ text -[18:10:27.684304496] (+?.?????????) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "hi there!", my_integer_field = 23 } -[18:10:27.684338440] (+0.000033944) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "./hello", my_integer_field = 0 } -[18:10:27.684340692] (+0.000002252) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "world", my_integer_field = 1 } -[18:10:27.684342616] (+0.000001924) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "and", my_integer_field = 2 } -[18:10:27.684343518] (+0.000000902) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "beyond", my_integer_field = 3 } -[18:10:27.684357978] (+0.000014460) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "x^2", my_integer_field = 16 } -~~~ - -When you're done, you may destroy the tracing session, which does _not_ -destroy the generated trace files, leaving them available for further -analysis: - -
-lttng destroy
-
- -The next section presents other alternatives to view and analyze your -LTTng traces. diff --git a/contents/getting-started/viewing-and-analyzing.md b/contents/getting-started/viewing-and-analyzing.md deleted file mode 100644 index a00a814..0000000 --- a/contents/getting-started/viewing-and-analyzing.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -id: viewing-and-analyzing-your-traces ---- - -This section describes how to visualize the data gathered after tracing -the Linux kernel or a user space application. - -Many ways exist to read LTTng traces: - - * **`babeltrace`** is a command line utility which converts trace formats; - it supports the format used by LTTng, - CTF, as well as a basic - text output which may be `grep`ed. The `babeltrace` command is - part of the - Babeltrace project. - * Babeltrace also includes **Python bindings** so that you may - easily open and read an LTTng trace with your own script, benefiting - from the power of Python. - * **Trace Compass** - is an Eclipse plugin used to visualize and analyze various types of - traces, including LTTng's. It also comes as a standalone application. - -LTTng trace files are recorded in the `~/lttng-traces` directory by default. -Let's now view the trace and perform a basic analysis using -`babeltrace`. - -The simplest way to list all the recorded events of a trace is to pass its -path to `babeltrace` with no options: - -
-babeltrace ~/lttng-traces/my-session
-
- -`babeltrace` finds all traces recursively within the given path and -prints all their events, merging them in order of time. - -Listing all the system calls of a Linux kernel trace with their arguments is -easy with `babeltrace` and `grep`: - -
-babeltrace ~/lttng-traces/my-kernel-session | grep sys_
-
- -Counting events is also straightforward: - -
-babeltrace ~/lttng-traces/my-kernel-session | grep sys_read | wc --lines
-
- -The text output of `babeltrace` is useful for isolating events by simple -matching using `grep` and similar utilities. However, more elaborate filters -such as keeping only events with a field value falling within a specific range -are not trivial to write using a shell. Moreover, reductions and even the -most basic computations involving multiple events are virtually impossible -to implement. - -Fortunately, Babeltrace ships with Python 3 bindings which makes it -really easy to read the events of an LTTng trace sequentially and compute -the desired information. - -Here's a simple example using the Babeltrace Python bindings. The following -script accepts an LTTng Linux kernel trace path as its first argument and -prints the short names of the top 5 running processes on CPU 0 during the -whole trace: - -~~~ python -import sys -from collections import Counter -import babeltrace - - -def top5proc(): - if len(sys.argv) != 2: - msg = 'Usage: python {} TRACEPATH'.format(sys.argv[0]) - raise ValueError(msg) - - # a trace collection holds one to many traces - col = babeltrace.TraceCollection() - - # add the trace provided by the user - # (LTTng traces always have the 'ctf' format) - if col.add_trace(sys.argv[1], 'ctf') is None: - raise RuntimeError('Cannot add trace') - - # this counter dict will hold execution times: - # - # task command name -> total execution time (ns) - exec_times = Counter() - - # this holds the last `sched_switch` timestamp - last_ts = None - - # iterate events - for event in col.events: - # keep only `sched_switch` events - if event.name != 'sched_switch': - continue - - # keep only events which happened on CPU 0 - if event['cpu_id'] != 0: - continue - - # event timestamp - cur_ts = event.timestamp - - if last_ts is None: - # we start here - last_ts = cur_ts - - # previous task command (short) name - prev_comm = event['prev_comm'] - - # initialize entry in our dict if not yet done - if prev_comm not in exec_times: - exec_times[prev_comm] = 0 - - # compute previous command execution time - diff = cur_ts - last_ts - - # update execution time of this command - exec_times[prev_comm] += diff - - # update last timestamp - last_ts = cur_ts - - # display top 10 - for name, ns in exec_times.most_common(5): - s = ns / 1000000000 - print('{:20}{} s'.format(name, s)) - - -if __name__ == '__main__': - top5proc() -~~~ - -Save this script as `top5proc.py` and run it with Python 3, providing the -path to an LTTng Linux kernel trace as the first argument: - -
-python3 top5proc.py ~/lttng-sessions/my-session-.../kernel
-
- -Make sure the path you provide is the directory containing actual trace -files (`channel0_0`, `metadata`, and the rest): the `babeltrace` utility -recurses directories, but the Python bindings do not. - -Here's an example of output: - -~~~ text -swapper/0 48.607245889 s -chromium 7.192738188 s -pavucontrol 0.709894415 s -Compositor 0.660867933 s -Xorg.bin 0.616753786 s -~~~ - -Note that `swapper/0` is the "idle" process of CPU 0 on Linux; since we -weren't using the CPU that much when tracing, its first position in the list -makes sense. diff --git a/contents/installing-lttng/building-from-source.md b/contents/installing-lttng/building-from-source.md deleted file mode 100644 index b5d3c9e..0000000 --- a/contents/installing-lttng/building-from-source.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: building-from-source ---- - -As [previously stated](#doc-installing-lttng), LTTng is shipped as -three packages: LTTng-tools, LTTng-modules and LTTng-UST. LTTng-tools -contains everything needed to control tracing sessions, while -LTTng-modules is only needed for Linux kernel tracing and LTTng-UST is -only needed for user space tracing. - -The tarballs are available in the -Download -section of the LTTng website. - -Please refer to the `README.md` files provided by each package to -properly build and install them. - -
-

-Tip:The aforementioned README.md files -are rendered as rich text when -viewed on GitHub. -

-
diff --git a/contents/installing-lttng/desktop-distributions/archlinux.md b/contents/installing-lttng/desktop-distributions/archlinux.md deleted file mode 100644 index 55686e1..0000000 --- a/contents/installing-lttng/desktop-distributions/archlinux.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: archlinux ---- - -LTTng 2.7 packages are currently available in the -AUR under the following names: -lttng-tools, -lttng-modules -and -lttng-ust. - -The three LTTng packages can be installed using the following -Yaourt commands: - -
-yaourt -S lttng-tools
-yaourt -S lttng-modules
-yaourt -S lttng-ust
-
- -If you need to trace [Python applications](#doc-python-application), you -need to install the LTTng-UST Python agent also: - - * Python 3: python-lttngust - * Python 2: python2-lttngust - -
-

- Note: If you need to trace - Java - applications on Arch Linux, you need to build and install LTTng-UST 2.7 - from source and - use the --enable-java-agent-jul, - --enable-java-agent-log4j, or - --enable-java-agent-all options. -

-
diff --git a/contents/installing-lttng/desktop-distributions/debian.md b/contents/installing-lttng/desktop-distributions/debian.md deleted file mode 100644 index d66dd41..0000000 --- a/contents/installing-lttng/desktop-distributions/debian.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: debian ---- - -Debian "stretch" and Debian "sid" have LTTng-modules 2.7 and -LTTng-UST 2.7 packages: - -
-sudo apt-get install lttng-modules-dkms
-sudo apt-get install liblttng-ust-dev
-
- -LTTng-tools 2.7 still needs to be -[built from source](#doc-building-from-source). - -If you need to trace [Java applications](#doc-java-application), you -need to install the LTTng-UST Java agent also: - -
-sudo apt-get install liblttng-ust-agent-java
-
- -If you need to trace [Python applications](#doc-python-application), -you need to install the LTTng-UST Python agent also: - -
-sudo apt-get install python3-lttngust
-
diff --git a/contents/installing-lttng/desktop-distributions/intro.md b/contents/installing-lttng/desktop-distributions/intro.md deleted file mode 100644 index bf7b387..0000000 --- a/contents/installing-lttng/desktop-distributions/intro.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: desktop-distributions ---- - -Official and unofficial LTTng 2.7 packages are available for -[Ubuntu](#doc-ubuntu), [Debian](#doc-debian), -[openSUSE](#doc-opensuse) (and other RPM-based distributions), and -[Arch Linux](#doc-archlinux). - -Older versions of LTTng are available for Fedora. - -Should any issue arise when -following the procedures below, please inform the -community about it. diff --git a/contents/installing-lttng/desktop-distributions/opensuse.md b/contents/installing-lttng/desktop-distributions/opensuse.md deleted file mode 100644 index d6cac4d..0000000 --- a/contents/installing-lttng/desktop-distributions/opensuse.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: opensuse ---- - -The openSUSE Leap 42.1 repository includes LTTng 2.7 packages. - -Use `zypper` directly: - -
-sudo zypper install lttng-tools
-sudo zypper install lttng-modules
-sudo zypper install lttng-ust-devel
-
- -
-

- Note: If you need to trace - Java applications on - openSUSE, you need to build and install LTTng-UST 2.7 - from source and - use the --enable-java-agent-jul, - --enable-java-agent-log4j, or - --enable-java-agent-all options. -

-

- If you need to trace - Python applications on - openSUSE, you need to build and install LTTng-UST 2.7 from source - and use the --enable-python-agent option. -

-
diff --git a/contents/installing-lttng/desktop-distributions/ubuntu/intro.md b/contents/installing-lttng/desktop-distributions/ubuntu/intro.md deleted file mode 100644 index 128a61b..0000000 --- a/contents/installing-lttng/desktop-distributions/ubuntu/intro.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: ubuntu ---- - -LTTng 2.7 packages are available in Ubuntu 16.04 _Xenial Xerus_'s -[official repositories](#doc-ubuntu-official-repositories). - -It is also possible to install the latest stable LTTng 2.7 release -on any current Ubuntu release (including Ubuntu 12.04 _Precise Pangolin_ -and Ubuntu 14.04 _Trusty Tahr_) by using the -[LTTng latest stable PPA](#doc-ubuntu-ppa). diff --git a/contents/installing-lttng/desktop-distributions/ubuntu/official-repositories.md b/contents/installing-lttng/desktop-distributions/ubuntu/official-repositories.md deleted file mode 100644 index efe2c04..0000000 --- a/contents/installing-lttng/desktop-distributions/ubuntu/official-repositories.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: ubuntu-official-repositories ---- - -To install LTTng 2.7 from the official Ubuntu 16.04 _Xenial Xerus_ -repositories, simply use `apt-get`: - -
-sudo apt-get install lttng-tools
-sudo apt-get install lttng-modules-dkms
-sudo apt-get install liblttng-ust-dev
-
- -If you need to trace [Java applications](#doc-java-application), you -need to install the LTTng-UST Java agent also: - -
-sudo apt-get install liblttng-ust-agent-java
-
- -If you need to trace [Python applications](#doc-python-application), -you need to install the LTTng-UST Python agent also: - -
-sudo apt-get install python3-lttngust
-
diff --git a/contents/installing-lttng/desktop-distributions/ubuntu/ppa.md b/contents/installing-lttng/desktop-distributions/ubuntu/ppa.md deleted file mode 100644 index 5ee84c6..0000000 --- a/contents/installing-lttng/desktop-distributions/ubuntu/ppa.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: ubuntu-ppa ---- - -The -LTTng latest stable PPA -offers the latest stable LTTng 2.7 packages. To get packages from the -PPA, follow these steps: - -
-sudo apt-add-repository ppa:lttng/ppa
-sudo apt-get update
-sudo apt-get install lttng-tools
-sudo apt-get install lttng-modules-dkms
-sudo apt-get install liblttng-ust-dev
-sudo apt-get install liblttng-ust-agent-java
-sudo apt-get install python3-lttngust
-
diff --git a/contents/installing-lttng/enterprise.md b/contents/installing-lttng/enterprise.md deleted file mode 100644 index 71612c0..0000000 --- a/contents/installing-lttng/enterprise.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: enterprise-distributions ---- - -To install LTTng on enterprise Linux distributions -(such as RHEL and -SLES), please see -EfficiOS -Enterprise Packages. diff --git a/contents/installing-lttng/intro.md b/contents/installing-lttng/intro.md deleted file mode 100644 index f8e9cff..0000000 --- a/contents/installing-lttng/intro.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: installing-lttng ---- - -**LTTng** is a set of software components which interact to allow -instrumenting the Linux kernel and user applications as well as -controlling tracing sessions (starting/stopping tracing, -enabling/disabling events, and more). Those components are bundled into -the following packages: - - * **LTTng-tools**: libraries and command line interface to control - tracing sessions. - * **LTTng-modules**: Linux kernel modules for tracing the kernel. - * **LTTng-UST**: user space tracing library. - -Most distributions mark the LTTng-modules and LTTng-UST packages as -optional. In the following sections, the steps to install all three are -always provided, but note that LTTng-modules is only required if -you intend to trace the Linux kernel and LTTng-UST is only required if -you intend to trace user space applications. - -This chapter shows how to install the above packages on a Linux -system. The easiest way is to use the package manager of the system's -[distribution](#doc-desktop-distributions). Embedded distributions -(Buildroot and OpenEmbedded/Yocto) currently have no packages of -LTTng 2.7 (LTTng 2.6 is available for both of them). Support is also -available for -[enterprise distributions](#doc-enterprise-distributions), such as -Red Hat Enterprise Linux (RHEL) and SUSE Linux Enterprise Server (SLES). -Otherwise, you can -[build the LTTng packages from source](#doc-building-from-source). diff --git a/contents/nuts-and-bolts/intro.md b/contents/nuts-and-bolts/intro.md deleted file mode 100644 index 0347a62..0000000 --- a/contents/nuts-and-bolts/intro.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: nuts-and-bolts ---- - -What is LTTng? As its name suggests, the -_Linux Trace Toolkit: next generation_ is a modern toolkit for -tracing Linux systems and applications. So your first question might -rather be: **what is tracing?** diff --git a/contents/nuts-and-bolts/lttng-alternatives.md b/contents/nuts-and-bolts/lttng-alternatives.md deleted file mode 100644 index 01f814e..0000000 --- a/contents/nuts-and-bolts/lttng-alternatives.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -id: lttng-alternatives ---- - -Excluding proprietary solutions, a few competing software tracers -exist for Linux: - - * ftrace - is the de facto function tracer of the Linux kernel. Its user - interface is a set of special files in sysfs. - * perf is - a performance analyzing tool for Linux which supports hardware - performance counters, tracepoints, as well as other counters and - types of probes. perf's controlling utility is the `perf` command - line/curses tool. - * strace - is a command line utility which records system calls made by a - user process, as well as signal deliveries and changes of process - state. strace makes use of - ptrace - to fulfill its function. - * SystemTap - is a Linux kernel and user space tracer which uses custom user scripts - to produce plain text traces. Scripts are converted to the C language, - then compiled as Linux kernel modules which are loaded to produce - trace data. SystemTap's primary user interface is the `stap` - command line tool. - * sysdig, like - SystemTap, uses scripts to analyze Linux kernel events. Scripts, - or _chisels_ in sysdig's jargon, are written in Lua and executed - while the system is being traced, or afterwards. sysdig's interface - is the `sysdig` command line tool as well as the curses-based - `csysdig` tool. - -The main distinctive features of LTTng is that it produces correlated -kernel and user space traces, as well as doing so with the lowest -overhead amongst other solutions. It produces trace files in the -CTF -format, an optimized file format for production and analyses of -multi-gigabyte data. LTTng is the result of close to 10 years of -active development by a community of passionate developers. LTTng 2.7 -is currently available on some major desktop and server Linux -distributions. - -The main interface for tracing control is a single command line tool -named `lttng`. The latter can create several tracing sessions, -enable/disable events on the fly, filter them efficiently with custom -user expressions, start/stop tracing, and do much more. Traces can be -recorded on disk or sent over the network, kept totally or partially, -and viewed once tracing becomes inactive or in real-time. - -[Install LTTng now](#doc-installing-lttng) and start tracing! diff --git a/contents/nuts-and-bolts/what-is-tracing.md b/contents/nuts-and-bolts/what-is-tracing.md deleted file mode 100644 index eabfd23..0000000 --- a/contents/nuts-and-bolts/what-is-tracing.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -id: what-is-tracing ---- - -As the history of software engineering progressed and led to what -we now take for granted—complex, numerous and -interdependent software applications running in parallel on -sophisticated operating systems like Linux—the authors of such -components, or software developers, began feeling a natural -urge of having tools to ensure the robustness and good performance -of their masterpieces. - -One major achievement in this field is, inarguably, the -GNU debugger -(GDB), which is an essential tool for developers to find and fix -bugs. But even the best debugger won't help make your software run -faster, and nowadays, faster software means either more work done by -the same hardware, or cheaper hardware for the same work. - -A _profiler_ is often the tool of choice to identify performance -bottlenecks. Profiling is suitable to identify _where_ performance is -lost in a given software; the profiler outputs a profile, a -statistical summary of observed events, which you may use to discover -which functions took the most time to execute. However, a profiler -won't report _why_ some identified functions are the bottleneck. -Bottlenecks might only occur when specific conditions are met, sometimes -almost impossible to capture by a statistical profiler, or impossible to -reproduce with an application altered by the overhead of an event-based -profiler. For a thorough investigation of software performance issues, -a history of execution, with the recorded values of chosen variables -and context, is essential. This is where tracing comes in handy. - -_Tracing_ is a technique used to understand what goes on in a running -software system. The software used for tracing is called a _tracer_, -which is conceptually similar to a tape recorder. When recording, -specific probes placed in the software source code generate events -that are saved on a giant tape: a _trace_ file. Both user applications -and the operating system may be traced at the same time, opening the -possibility of resolving a wide range of problems that are otherwise -extremely challenging. - -Tracing is often compared to _logging_. However, tracers and loggers -are two different tools, serving two different purposes. Tracers are -designed to record much lower-level events that occur much more -frequently than log messages, often in the thousands per second range, -with very little execution overhead. Logging is more appropriate for -very high-level analysis of less frequent events: user accesses, -exceptional conditions (errors and warnings, for example), database -transactions, instant messaging communications, and such. More formally, -logging is one of several use cases that can be accomplished with -tracing. - -The list of recorded events inside a trace file may be read manually -like a log file for the maximum level of detail, but it is generally -much more interesting to perform application-specific analyses to -produce reduced statistics and graphs that are useful to resolve a -given problem. Trace viewers and analysers are specialized tools -designed to do this. - -So, in the end, this is what LTTng is: a powerful, open source set of -tools to trace the Linux kernel and user applications at the same time. -LTTng is composed of several components actively maintained and -developed by its community. diff --git a/contents/preface.md b/contents/preface.md deleted file mode 100644 index 70b27e3..0000000 --- a/contents/preface.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -id: preface ---- - - - - -## Welcome! - -Welcome to the **LTTng Documentation**! - -The _Linux Trace Toolkit: next generation_ -is an open source system software package for correlated tracing of the -Linux kernel, user applications and libraries. LTTng consists of kernel -modules (for Linux kernel tracing) and dynamically loaded libraries (for -user application and library tracing). It is controlled by a session -daemon, which receives commands from a command line interface. - - -### Convention - -Function and argument names, variable names, command names, -file system paths, file names and other precise strings are written -using a monospaced typeface in this document. An -italic word within such a block is a -placeholder, usually described in the following sentence. - -Practical tips and sidenotes are given throughout the document using a -blue background: - -
-

Tip:Make sure you read the tips.

-
- -Terminal boxes are used to show command lines: - -
-echo This is a terminal box
-
- -Typical command prompts, like `$` and `#`, are not shown in terminal -boxes to make copy/paste operations easier, especially for multiline -commands which may be copied and pasted as is in a user's terminal. -Commands to be executed as a root user begin with `sudo`. - - -### Target audience - -The material of this documentation is appropriate for intermediate to -advanced software developers working in a Linux environment who are -interested in efficient software tracing. LTTng may also be worth a -try for students interested in the inner mechanics of their systems. - -Readers who do not have a programming background may wish to skip -everything related to instrumentation, which requires, most of the -time, some programming language skills. - -
-

Note to readers:This is an open -documentation: its source is available in a -public Git -repository. Should you find any error in the contents of this text, -any grammatical mistake, or any dead link, we would be very grateful if -you would fill a GitHub issue for it or, even better, contribute a patch -to this documentation by creating a pull request.

-
- -### Chapter descriptions - -What follows is a list of brief descriptions of this documentation's -chapters. The latter are ordered in such a way as to make the reading -as linear as possible. - - 1. [Nuts and bolts](#doc-nuts-and-bolts) explains the - rudiments of software tracing and the rationale behind the - LTTng project. - 2. [Installing LTTng](#doc-installing-lttng) is divided into - sections describing the steps needed to get a working installation - of LTTng packages for common Linux distributions and from its - source. - 3. [Getting started](#doc-getting-started) is a very concise guide to - get started quickly with LTTng kernel and user space tracing. This - chapter is recommended if you're new to LTTng or to software tracing - in general. - 4. [Understanding LTTng](#doc-understanding-lttng) deals with some - core concepts and components of the LTTng suite. Understanding - those is important since the next chapter assumes you're familiar - with them. - 5. [Using LTTng](#doc-using-lttng) is a complete user guide of the - LTTng project. It shows in great details how to instrument user - applications and the Linux kernel, how to control tracing sessions - using the `lttng` command line tool, and miscellaneous practical use - cases. - 6. [Reference](#doc-reference) contains references of LTTng components. - -We recommend that you read the above chapters in this order, although -some of them may be skipped depending on your situation. You may skip -[Nuts and bolts](#doc-nuts-and-bolts) if you're familiar with tracing -and the LTTng project. Also, you may jump over -[Installing LTTng](#doc-installing-lttng) if LTTng is already properly -installed on your target system. - - -### Acknowledgements - -A few people made the online LTTng Documentation possible. - -Philippe Proulx wrote and formatted most of the text. -Daniel U. Thibault, from the -DRDC, -wrote an open guide called LTTng: The Linux Trace Toolkit Next -Generation — A Comprehensive User's Guide (version 2.3 -edition) which was mostly used to complete parts of the -[Understanding LTTng](#doc-understanding-lttng) chapter and for a few -passages here and there. -The whole EfficiOS -team (Christian Babeux, Antoine Busque, Julien Desfossez, -Mathieu Desnoyers, Jérémie Galarneau and David Goulet) made essential -reviews of the whole document. - -We sincerely thank everyone who helped make this documentation what -it is. We hope you enjoy reading it as much as we did writing it. diff --git a/contents/reference/intro.md b/contents/reference/intro.md deleted file mode 100644 index f422066..0000000 --- a/contents/reference/intro.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -id: reference ---- - -This chapter presents various references for LTTng packages such as links -to online man pages, tables needed by the rest of the text, descriptions -of library functions, and more. diff --git a/contents/reference/lttng-modules/intro.md b/contents/reference/lttng-modules/intro.md deleted file mode 100644 index ff2269a..0000000 --- a/contents/reference/lttng-modules/intro.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -id: lttng-modules-ref ---- - -This section presents references of the LTTng-modules package. diff --git a/contents/reference/lttng-modules/lttng-modules-tp-fields.md b/contents/reference/lttng-modules/lttng-modules-tp-fields.md deleted file mode 100644 index 0a515f7..0000000 --- a/contents/reference/lttng-modules/lttng-modules-tp-fields.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -id: lttng-modules-tp-fields -since: 2.7 -since-note: | - Previous versions used the TP_STRUCT__entry() and TP_fast_assign() - macros which also used different inner macros. The new ctf_*() - macros are similar to their LTTng-UST counterpart. ---- - - - -The available macros to define tracepoint fields, which should be listed -within `TP_FIELDS()` in `LTTNG_TRACEPOINT_EVENT()`, are: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MacroDescription/arguments
-
    -
  • ctf_integer(t, n, e)
  • -
  • ctf_integer_nowrite(t, n, e)
  • -
  • ctf_user_integer(t, n, e)
  • -
  • ctf_user_integer_nowrite(t, n, e)
  • -
-
-

Standard integer, displayed in base 10

-
    -
  • - t integer C type - (int, long, - size_t, ...) -
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_integer_hex(t, n, e)
  • -
  • ctf_user_integer_hex(t, n, e)
  • -
-
-

Standard integer, displayed in base 16

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
ctf_integer_oct(t, n, e) -

Standard integer, displayed in base 8

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_integer_network(t, n, e)
  • -
  • ctf_user_integer_network(t, n, e)
  • -
-
-

- Integer in network byte order (big-endian), - displayed in base 10 -

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_integer_network_hex(t, n, e)
  • -
  • ctf_user_integer_network_hex(t, n, e)
  • -
-
-

- Integer in network byte order, displayed - in base 16

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_float(t, n, e)
  • -
  • ctf_user_float(t, n, e)
  • -
  • ctf_float_nowrite(t, n, e)
  • -
  • ctf_user_float_nowrite(t, n, e)
  • -
-
-

Floating point number

-
    -
  • - t floating point number - C type (float, double) -
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_string(n, e)
  • -
  • ctf_user_string(n, e)
  • -
  • ctf_string_nowrite(n, e)
  • -
  • ctf_user_string_nowrite(n, e)
  • -
-
-

- Null-terminated string; undefined behavior if - e is NULL -

-
    -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_array(t, n, e, s)
  • -
  • ctf_user_array(t, n, e, s)
  • -
  • ctf_array_nowrite(t, n, e, s)
  • -
  • ctf_user_array_nowrite(t, n, e, s)
  • -
-
-

- Statically-sized array of integers, displayed in - base 10 -

-
    -
  • t array element C type
  • -
  • n field name
  • -
  • e argument expression
  • -
  • s number of elements
  • -
-
-
    -
  • ctf_array_text(t, n, e, s)
  • -
  • ctf_user_array_text(t, n, e, s)
  • -
  • ctf_array_text_nowrite(t, n, e, s)
  • -
  • ctf_user_array_text_nowrite(t, n, e, s)
  • -
-
-

- Statically-sized array, printed as text; no need to - be null-terminated -

-
    -
  • t array element C type (always char)
  • -
  • n field name
  • -
  • e argument expression
  • -
  • s number of elements
  • -
-
-
    -
  • ctf_sequence(t, n, e, T, E)
  • -
  • ctf_user_sequence(t, n, e, T, E)
  • -
  • ctf_sequence_nowrite(t, n, e, T, E)
  • -
  • ctf_user_sequence_nowrite(t, n, e, T, E)
  • -
-
-

- Dynamically-sized array of integers, displayed in - base 10; type of - E needs to be unsigned -

-
    -
  • t sequence element C type
  • -
  • n field name
  • -
  • e argument expression
  • -
  • T length expression C type
  • -
  • E length expression
  • -
-
-
    -
  • ctf_sequence_hex(t, n, e, T, E)
  • -
-
-

- Dynamically-sized array of integers, displayed in - base 16; type of - E needs to be unsigned -

-
    -
  • t sequence element C type
  • -
  • n field name
  • -
  • e argument expression
  • -
  • T length expression C type
  • -
  • E length expression
  • -
-
-
    -
  • ctf_sequence_network(t, n, e, T, E)
  • -
-
-

- Dynamically-sized array of integers in network byte - order (big endian), displayed in base 10; - type of - - - - E needs to be unsigned -

-
    -
  • t sequence element C type
  • -
  • n field name
  • -
  • e argument expression
  • -
  • T length expression C type
  • -
  • E length expression
  • -
-
-
    -
  • ctf_sequence_text(t, n, e, T, E)
  • -
  • ctf_user_sequence_text(t, n, e, T, E)
  • -
  • ctf_sequence_text_nowrite(t, n, e, T, E)
  • -
  • ctf_user_sequence_text_nowrite(t, n, e, T, E)
  • -
-
-

- Dynamically-sized array, displayed as text; no need to - be null-terminated; undefined behavior if - e is NULL

-
    -
  • t sequence element C type (always char)
  • -
  • n field name
  • -
  • e argument expression
  • -
  • T length expression C type
  • -
  • E length expression
  • -
-
-
- -The `_user` versions must be used when the argument expression, `e`, is -a user space address. In the cases of `ctf_user_integer*()` and -`ctf_user_float*()`, `&e` must be a user space address, thus `e` must -be addressable. - -The `_nowrite` versions omit themselves from the session trace, but are -otherwise identical. This means the `_nowrite` fields won't be written -in the recorded trace. Their primary purpose is to make some -of the event context available to the -[event filters](#doc-enabling-disabling-events) without having to -commit the data to sub-buffers. diff --git a/contents/reference/lttng-ust/intro.md b/contents/reference/lttng-ust/intro.md deleted file mode 100644 index e6581d5..0000000 --- a/contents/reference/lttng-ust/intro.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -id: lttng-ust-ref ---- - -This section presents references of the LTTng-UST package. diff --git a/contents/reference/lttng-ust/liblttng-ust/intro.md b/contents/reference/lttng-ust/liblttng-ust/intro.md deleted file mode 100644 index ebf03c5..0000000 --- a/contents/reference/lttng-ust/liblttng-ust/intro.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: liblttng-ust ---- - -The LTTng-UST library, or `liblttng-ust`, is the main shared object -against which user applications are linked to make LTTng user space -tracing possible. - -The [C application](#doc-c-application) guide shows the complete -process to instrument, build and run a C/C++ application using -LTTng-UST, while this section contains a few important tables. diff --git a/contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tp-fields.md b/contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tp-fields.md deleted file mode 100644 index 76cbea0..0000000 --- a/contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tp-fields.md +++ /dev/null @@ -1,200 +0,0 @@ ---- -id: liblttng-ust-tp-fields ---- - -The available macros to define tracepoint fields, which should be listed -within `TP_FIELDS()` in `TRACEPOINT_EVENT()`, are: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MacroDescription/arguments
-
    -
  • ctf_integer(t, n, e)
  • -
  • ctf_integer_nowrite(t, n, e)
  • -
-
-

Standard integer, displayed in base 10

-
    -
  • - t integer C type - (int, long, - size_t, ...) -
  • -
  • n field name
  • -
  • e argument expression
  • -
-
ctf_integer_hex(t, n, e) -

Standard integer, displayed in base 16

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
ctf_integer_network(t, n, e) -

- Integer in network byte order (big endian), - displayed in base 10 -

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
ctf_integer_network_hex(t, n, e) -

- Integer in network byte order, displayed - in base 16

-
    -
  • t integer C type
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_float(t, n, e)
  • -
  • ctf_float_nowrite(t, n, e)
  • -
-
-

Floating point number

-
    -
  • - t floating point number - C type (float, double) -
  • -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_string(n, e)
  • -
  • ctf_string_nowrite(n, e)
  • -
-
-

- Null-terminated string; undefined behavior if - e is NULL -

-
    -
  • n field name
  • -
  • e argument expression
  • -
-
-
    -
  • ctf_array(t, n, e, s)
  • -
  • ctf_array_nowrite(t, n, e, s)
  • -
-
-

Statically-sized array of integers

-
    -
  • t array element C type
  • -
  • n field name
  • -
  • e argument expression
  • -
  • s number of elements
  • -
-
-
    -
  • ctf_array_text(t, n, e, s)
  • -
  • ctf_array_nowrite_text(t, n, e, s)
  • -
-
-

- Statically-sized array, printed as text; no need to be - null-terminated -

-
    -
  • t array element C type (always char)
  • -
  • n field name
  • -
  • e argument expression
  • -
  • s number of elements
  • -
-
-
    -
  • ctf_sequence(t, n, e, T, E)
  • -
  • ctf_sequence_nowrite(t, n, e, T, E)
  • -
-
-

- Dynamically-sized array of integers; type of - E needs to be unsigned -

-
    -
  • t sequence element C type
  • -
  • n field name
  • -
  • e argument expression
  • -
  • T length expression C type
  • -
  • E length expression
  • -
-
-
    -
  • ctf_sequence_text(t, n, e, T, E)
  • -
  • ctf_sequence_text_nowrite(t, n, e, T, E)
  • -
-
-

- Dynamically-sized array, displayed as text; no need to - be null-terminated; undefined behavior if - e is NULL

-
    -
  • t sequence element C type (always char)
  • -
  • n field name
  • -
  • e argument expression
  • -
  • T length expression C type
  • -
  • E length expression
  • -
-
-
- -The `_nowrite` versions omit themselves from the session trace, but are -otherwise identical. This means the `_nowrite` fields won't be written -in the recorded trace. Their primary purpose is to make some -of the event context available to the -[event filters](#doc-enabling-disabling-events) without having to -commit the data to sub-buffers. diff --git a/contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tracepoint-loglevel.md b/contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tracepoint-loglevel.md deleted file mode 100644 index dec7263..0000000 --- a/contents/reference/lttng-ust/liblttng-ust/liblttng-ust-tracepoint-loglevel.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -id: liblttng-ust-tracepoint-loglevel ---- - -The following table shows the available log level values for the -`TRACEPOINT_LOGLEVEL()` macro: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Enum labelEnum valueDescription
TRACE_EMERG0System is unusable
TRACE_ALERT1Action must be taken immediately
TRACE_CRIT2Critical conditions
TRACE_ERR3Error conditions
TRACE_WARNING4Warning conditions
TRACE_NOTICE5Normal, but significant, condition
TRACE_INFO6Informational message
TRACE_DEBUG_SYSTEM7Debug information with system-level scope (set of programs)
TRACE_DEBUG_PROGRAM8Debug information with program-level scope (set of processes)
TRACE_DEBUG_PROCESS9Debug information with process-level scope (set of modules)
TRACE_DEBUG_MODULE10Debug information with module (executable/library) scope (set of units)
TRACE_DEBUG_UNIT11Debug information with compilation unit scope (set of functions)
TRACE_DEBUG_FUNCTION12Debug information with function-level scope
TRACE_DEBUG_LINE13Debug information with line-level scope (TRACEPOINT_EVENT default)
TRACE_DEBUG14Debug-level message
-
- -Higher log level numbers imply the most verbosity (expect higher tracing -throughput). Log levels 0 through 6 and log level 14 match -syslog -level semantics. Log levels 7 through 13 offer more fine-grained -selection of debug information. diff --git a/contents/reference/online-manpages.md b/contents/reference/online-manpages.md deleted file mode 100644 index e9d122a..0000000 --- a/contents/reference/online-manpages.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: online-lttng-manpages ---- - -LTTng packages currently install the following [man pages](/man), available -online using the links below: - - * **LTTng-tools** - * `lttng` - * `lttng-crash` - * `lttng-sessiond` - * `lttng-relayd` - * **LTTng-UST** - * `lttng-gen-tp` - * `lttng-ust` - * `lttng-ust-cyg-profile` - * `lttng-ust-dl` diff --git a/contents/understanding-lttng/core-concepts/channel/channel-buffering-schemes.md b/contents/understanding-lttng/core-concepts/channel/channel-buffering-schemes.md deleted file mode 100644 index e6b87d0..0000000 --- a/contents/understanding-lttng/core-concepts/channel/channel-buffering-schemes.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: channel-buffering-schemes ---- - -In the user space tracing domain, two **buffering schemes** are -available when creating a channel: - - * **Per-PID buffering**: keep one ring buffer per process. - * **Per-UID buffering**: keep one ring buffer for all processes of - a single user. - -The per-PID buffering scheme consumes more memory than the per-UID -option if more than one process is instrumented for LTTng-UST. However, -per-PID buffering ensures that one process having a high event -throughput won't fill all the shared sub-buffers, only its own. - -The Linux kernel tracing domain only has one available buffering scheme -which is to use a single ring buffer for the whole system. diff --git a/contents/understanding-lttng/core-concepts/channel/channel-overwrite-mode-vs-discard-mode.md b/contents/understanding-lttng/core-concepts/channel/channel-overwrite-mode-vs-discard-mode.md deleted file mode 100644 index 53d799b..0000000 --- a/contents/understanding-lttng/core-concepts/channel/channel-overwrite-mode-vs-discard-mode.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -id: channel-overwrite-mode-vs-discard-mode ---- - -As previously mentioned, a channel's ring buffer is divided into many -equally sized sub-buffers. - -As events occur, they are serialized as trace data into a specific -sub-buffer (yellow arc in the following animation) until it is full: -when this happens, the sub-buffer is marked as consumable (red) and -another, _empty_ (white) sub-buffer starts receiving the following -events. The marked sub-buffer is eventually consumed by a consumer -daemon (returns to white). - - - - - -In an ideal world, sub-buffers are consumed faster than filled, like it -is the case above. In the real world, however, all sub-buffers could be -full at some point, leaving no space to record the following events. By -design, LTTng is a _non-blocking_ tracer: when no empty sub-buffer -exists, losing events is acceptable when the alternative would be to -cause substantial delays in the instrumented application's execution. -LTTng privileges performance over integrity, aiming at perturbing the -traced system as little as possible in order to make tracing of subtle -race conditions and rare interrupt cascades possible. - -When it comes to losing events because no empty sub-buffer is available, -the channel's _event loss mode_ determines what to do amongst: - - * **Discard**: drop the newest events until a sub-buffer is released. - * **Overwrite**: clear the sub-buffer containing the oldest recorded - events and start recording the newest events there. This mode is - sometimes called _flight recorder mode_ because it behaves like a - flight recorder: always keep a fixed amount of the latest data. - -Which mechanism you should choose depends on your context: prioritize -the newest or the oldest events in the ring buffer? - -Beware that, in overwrite mode, a whole sub-buffer is abandoned as soon -as a new event doesn't find an empty sub-buffer, whereas in discard -mode, only the event that doesn't fit is discarded. - -Also note that a count of lost events is incremented and saved in -the trace itself when an event is lost in discard mode, whereas no -information is kept when a sub-buffer gets overwritten before being -committed. - -There are known ways to decrease your probability of losing events. The -next section shows how tuning the sub-buffers count and size can be -used to virtually stop losing events. diff --git a/contents/understanding-lttng/core-concepts/channel/channel-subbuf-size-vs-subbuf-count.md b/contents/understanding-lttng/core-concepts/channel/channel-subbuf-size-vs-subbuf-count.md deleted file mode 100644 index b78242b..0000000 --- a/contents/understanding-lttng/core-concepts/channel/channel-subbuf-size-vs-subbuf-count.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -id: channel-subbuf-size-vs-subbuf-count ---- - -For each channel, an LTTng user may set its number of sub-buffers and -their size. - -Note that there is a noticeable tracer's CPU overhead introduced when -switching sub-buffers (marking a full one as consumable and switching -to an empty one for the following events to be recorded). Knowing this, -the following list presents a few practical situations along with how -to configure sub-buffers for them: - - * **High event throughput**: in general, prefer bigger sub-buffers to - lower the risk of losing events. Having bigger sub-buffers - also ensures a lower sub-buffer switching frequency. The number of - sub-buffers is only meaningful if the channel is enabled in - overwrite mode: in this case, if a sub-buffer overwrite happens, the - other sub-buffers are left unaltered. - * **Low event throughput**: in general, prefer smaller sub-buffers - since the risk of losing events is already low. Since events - happen less frequently, the sub-buffer switching frequency should - remain low and thus the tracer's overhead should not be a problem. - * **Low memory system**: if your target system has a low memory - limit, prefer fewer first, then smaller sub-buffers. Even if the - system is limited in memory, you want to keep the sub-buffers as - big as possible to avoid a high sub-buffer switching frequency. - -You should know that LTTng uses CTF as its trace format, which means -event data is very compact. For example, the average LTTng Linux kernel -event weights about 32 bytes. A sub-buffer size of 1 MiB is -thus considered big. - -The previous situations highlight the major trade-off between a few big -sub-buffers and more, smaller sub-buffers: sub-buffer switching -frequency vs. how much data is lost in overwrite mode. Assuming a -constant event throughput and using the overwrite mode, the two -following configurations have the same ring buffer total size: - - - - - - * **2 sub-buffers of 4 MiB each** lead to a very low sub-buffer - switching frequency, but if a sub-buffer overwrite happens, half of - the recorded events so far (4 MiB) are definitely lost. - * **8 sub-buffers of 1 MiB each** lead to 4 times the tracer's - overhead as the previous configuration, but if a sub-buffer - overwrite happens, only the eighth of events recorded so far are - definitely lost. - -In discard mode, the sub-buffers count parameter is pointless: use two -sub-buffers and set their size according to the requirements of your -situation. diff --git a/contents/understanding-lttng/core-concepts/channel/channel-timers.md b/contents/understanding-lttng/core-concepts/channel/channel-timers.md deleted file mode 100644 index ab54115..0000000 --- a/contents/understanding-lttng/core-concepts/channel/channel-timers.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -id: channel-switch-timer ---- - -The _switch timer_ period is another important configurable feature of -channels to ensure periodic sub-buffer flushing. - -When the _switch timer_ fires, a sub-buffer switch happens. This timer -may be used to ensure that event data is consumed and committed to -trace files periodically in case of a low event throughput: - - - - - -It's also convenient when big sub-buffers are used to cope with -sporadic high event throughput, even if the throughput is normally -lower. diff --git a/contents/understanding-lttng/core-concepts/channel/intro.md b/contents/understanding-lttng/core-concepts/channel/intro.md deleted file mode 100644 index aa63e05..0000000 --- a/contents/understanding-lttng/core-concepts/channel/intro.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: channel ---- - -A _channel_ is a set of events with specific parameters and potential -added context information. Channels have unique names per domain within -a tracing session. A given event is always registered to at least one -channel; having the same enabled event in two channels makes -this event being recorded twice everytime it occurs. - -Channels may be individually enabled or disabled. Occurring events of -a disabled channel never make it to recorded events. - -The fundamental role of a channel is to keep a shared ring buffer, where -events are eventually recorded by the tracer and consumed by a consumer -daemon. This internal ring buffer is divided into many sub-buffers of -equal size. - -Channels, when created, may be fine-tuned thanks to a few parameters, -many of them related to sub-buffers. The following subsections explain -what those parameters are and in which situations you should manually -adjust them. diff --git a/contents/understanding-lttng/core-concepts/domain.md b/contents/understanding-lttng/core-concepts/domain.md deleted file mode 100644 index 5b53696..0000000 --- a/contents/understanding-lttng/core-concepts/domain.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: domain ---- - -A tracing _domain_ is the official term the LTTng project uses to -designate a tracer category. - -There are currently five known domains: - - * Linux kernel - * user space - * `java.util.logging` (JUL) - * log4j - * Python (2 and 3 are supported) - -Different tracers expose common features in their own interfaces, but, -from a user's perspective, you still need to target a specific type of -tracer to perform some actions. For example, since both kernel and user -space tracers support named tracepoints (probes manually inserted in -source code), you need to specify which one is concerned when enabling -an event because both domains could have existing events with the same -name. - -Some features are reserved for some domains. Dynamic function entry/return -instrumentation, for example, is currently only supported in the kernel -domain, but support for other domains could be added in the future. diff --git a/contents/understanding-lttng/core-concepts/event.md b/contents/understanding-lttng/core-concepts/event.md deleted file mode 100644 index 5526e27..0000000 --- a/contents/understanding-lttng/core-concepts/event.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: event ---- - -An _event_, in LTTng's realm, is a term often used metonymically, -having multiple definitions depending on the context: - - 1. When tracing, an event is a _point in space-time_. Space, in a - tracing context, is the set of all executable positions of a - compiled application by a logical processor. When a program is - executed by a processor and some instrumentation point, or - _probe_, is encountered, an event occurs. This event is accompanied - by some contextual payload (values of specific variables at this - point of execution) which may or may not be recorded. - 2. In the context of a recorded trace file, the term _event_ implies - a _recorded event_. - 3. When configuring a tracing session, _enabled events_ refer to - specific rules which could lead to the transfer of actual - occurring events (1) to recorded events (2). - -The whole [Core concepts](#doc-core-concepts) section focuses on the -third definition. An event is always registered to _one or more_ -channels and may be enabled or disabled at will per channel. A disabled -event never leads to a recorded event, even if its channel is enabled. - -An event (3) is enabled with a few conditions that must _all_ be met -when an event (1) happens in order to generate a recorded event (2): - - 1. A _probe_ or group of probes in the traced application must be - executed. - 2. **Optionally**, the probe must have a log level matching a - log level range specified when enabling the event. - 3. **Optionally**, the occurring event must satisfy a custom - expression, or _filter_, specified when enabling the event. diff --git a/contents/understanding-lttng/core-concepts/intro.md b/contents/understanding-lttng/core-concepts/intro.md deleted file mode 100644 index f884c8d..0000000 --- a/contents/understanding-lttng/core-concepts/intro.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: core-concepts ---- - -This section explains the various elementary concepts a user has to deal -with when using LTTng. They are: - - * [tracing session](#doc-tracing-session) - * [domain](#doc-domain) - * [channel](#doc-channel) - * [event](#doc-event) - diff --git a/contents/understanding-lttng/core-concepts/tracing-session.md b/contents/understanding-lttng/core-concepts/tracing-session.md deleted file mode 100644 index 1b8a96e..0000000 --- a/contents/understanding-lttng/core-concepts/tracing-session.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: tracing-session ---- - -A _tracing session_ is—like any session—a container of -state. Anything that is done when tracing using LTTng happens in the -scope of a tracing session. In this regard, it is analogous to a bank -website's session: you can't interact online with your bank account -unless you are logged in a session, except for reading a few static -webpages (LTTng, too, can report some static information that does not -need a created tracing session). - -A tracing session holds the following attributes and objects (some of -which are described in the following sections): - - * a name - * the tracing state (tracing started or stopped) - * the trace data output path/URL (local path or sent over the network) - * a mode (normal, snapshot or live) - * the snapshot output paths/URLs (if applicable) - * for each [domain](#doc-domain), a list of [channels](#doc-channel) - * for each channel: - * a name - * the channel state (enabled or disabled) - * its parameters (event loss mode, sub-buffers size and count, - timer periods, output type, trace files size and count, and the rest) - * a list of added context information - * a list of [events](#doc-event) - * for each event: - * its state (enabled or disabled) - * a list of instrumentation points (tracepoints, system calls, - dynamic probes, other types of probes) - * associated log levels - * a filter expression - -All this information is completely isolated between tracing sessions. -As you can see in the list above, even the tracing state -is a per-tracing session attribute, so that you may trace your target -system/application in a given tracing session with a specific -configuration while another one stays inactive. - -
-LTTng concepts -
- A tracing session is a container of domains, - channels, and events. -
-
- -Conceptually, a tracing session is a per-user object; the -[Plumbing](#doc-plumbing) section shows how this is actually -implemented. Any user may create as many concurrent tracing sessions -as desired. - -
-Tracing sessions per user -
- Each user may create as many tracing sessions as desired. -
-
- -The trace data generated in a tracing session may be either saved -to disk, sent over the network or not saved at all (in which case -snapshots may still be saved to disk or sent to a remote machine). diff --git a/contents/understanding-lttng/intro.md b/contents/understanding-lttng/intro.md deleted file mode 100644 index 9da52fd..0000000 --- a/contents/understanding-lttng/intro.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: understanding-lttng ---- - -If you're going to use LTTng in any serious way, it is fundamental that -you become familiar with its core concepts. Technical terms like -_tracing sessions_, _domains_, _channels_ and _events_ are used over -and over in the [Using LTTng](#doc-using-lttng) chapter, -and it is assumed that you understand what they mean when reading it. - -LTTng, as you already know, is a _toolkit_. It would be wrong -to call it a simple _tool_ since it is composed of multiple interacting -components. This chapter also describes the latter, providing details -about their respective roles and how they connect together to form -the current LTTng ecosystem. diff --git a/contents/understanding-lttng/plumbing/intro.md b/contents/understanding-lttng/plumbing/intro.md deleted file mode 100644 index 4aad2da..0000000 --- a/contents/understanding-lttng/plumbing/intro.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: plumbing ---- - -The previous section described the concepts at the heart of LTTng. -This section summarizes LTTng's implementation: how those objects are -managed by different applications and libraries working together to -form the toolkit. diff --git a/contents/understanding-lttng/plumbing/liblttng-ctl-lttng.md b/contents/understanding-lttng/plumbing/liblttng-ctl-lttng.md deleted file mode 100644 index 3a97c26..0000000 --- a/contents/understanding-lttng/plumbing/liblttng-ctl-lttng.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: liblttng-ctl-lttng ---- - -The LTTng control library, `liblttng-ctl`, can be used to communicate -with the session daemon using a C API that hides the underlying -protocol's details. `liblttng-ctl` is part of LTTng-tools. - -`liblttng-ctl` may be used by including its "master" header: - -~~~ c -#include -~~~ - -Some objects are referred by name (C string), such as tracing sessions, -but most of them require creating a handle first using -`lttng_create_handle()`. The best available developer documentation for -`liblttng-ctl` is, for the moment, its installed header files as such. -Every function/structure is thoroughly documented. - -The `lttng` program is the _de facto_ standard user interface to -control LTTng tracing sessions. `lttng` uses `liblttng-ctl` to -communicate with session daemons behind the scenes. -Its man page is exhaustive, as -well as its command line help (lttng cmd --help, -where cmd is the command name). - -The [Controlling tracing](#doc-controlling-tracing) section is a feature -tour of the `lttng` tool. diff --git a/contents/understanding-lttng/plumbing/lttng-consumerd.md b/contents/understanding-lttng/plumbing/lttng-consumerd.md deleted file mode 100644 index 09001c4..0000000 --- a/contents/understanding-lttng/plumbing/lttng-consumerd.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: lttng-consumerd ---- - -The _consumer daemon_, or `lttng-consumerd`, is a program sharing some -ring buffers with user applications or the LTTng kernel modules to -collect trace data and output it at some place (on disk or sent over -the network to an LTTng relay daemon). - -Consumer daemons are created by a session daemon as soon as events are -enabled within a tracing session, well before tracing is activated -for the latter. Entirely managed by session daemons, -consumer daemons survive session destruction to be reused later, -should a new tracing session be created. Consumer daemons are always -owned by the same user as their session daemon. When its owner session -daemon is killed, the consumer daemon also exits. This is because -the consumer daemon is always the child process of a session daemon. -Consumer daemons should never be started manually. For this reason, -they are not installed in one of the usual locations listed in the -`PATH` environment variable. `lttng-sessiond` has, however, a -bunch of options to -specify custom consumer daemon paths if, for some reason, a consumer -daemon other than the default installed one is needed. - -There are up to two running consumer daemons per user, whereas only one -session daemon may run per user. This is because each process has -independent bitness: if the target system runs a mixture of 32-bit and -64-bit processes, it is more efficient to have separate corresponding -32-bit and 64-bit consumer daemons. The `root` user is an exception: it -may have up to _three_ running consumer daemons: 32-bit and 64-bit -instances for its user space applications and one more reserved for -collecting kernel trace data. - -As new tracing domains are added to LTTng, the development community's -intent is to minimize the need for additionnal consumer daemon instances -dedicated to them. For instance, the `java.util.logging` (JUL) domain -events are in fact mapped to the user space domain, thus tracing this -particular domain is handled by existing user space domain consumer -daemons. diff --git a/contents/understanding-lttng/plumbing/lttng-modules.md b/contents/understanding-lttng/plumbing/lttng-modules.md deleted file mode 100644 index 27075a5..0000000 --- a/contents/understanding-lttng/plumbing/lttng-modules.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: lttng-modules ---- - -The LTTng Linux kernel modules provide everything needed to trace the -Linux kernel: various probes, a ring buffer implementation for a -consumer daemon to read trace data and the tracer itself. - -Only in exceptional circumstances should you ever need to load the -LTTng kernel modules manually: it is normally the responsability of -`root`'s session daemon to do so. Even if you were to develop your -own LTTng probe module—for tracing a custom kernel or some kernel -module (this topic is covered in the -[Linux kernel](#doc-instrumenting-linux-kernel) instrumenting guide of -the [Using LTTng](#doc-using-lttng) chapter)—you -should use the `--extra-kmod-probes` option of the session daemon to -append your probe to the default list. The session and consumer daemons -of regular users do not interact with the LTTng kernel modules at all. - -LTTng kernel modules are installed, by default, in -/usr/lib/modules/release/extra, where -release is the kernel release -(see `uname --kernel-release`). diff --git a/contents/understanding-lttng/plumbing/lttng-relayd.md b/contents/understanding-lttng/plumbing/lttng-relayd.md deleted file mode 100644 index 8f1e54b..0000000 --- a/contents/understanding-lttng/plumbing/lttng-relayd.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -id: lttng-relayd ---- - -When a tracing session is configured to send its trace data over the -network, an LTTng _relay daemon_ must be used at the other end to -receive trace packets and serialize them to trace files. This setup -makes it possible to trace a target system without ever committing trace -data to its local storage, a feature which is useful for embedded -systems, amongst others. The command implementing the relay daemon -is `lttng-relayd`. - -The basic use case of `lttng-relayd` is to transfer trace data received -over the network to trace files on the local file system. The relay -daemon must listen on two TCP ports to achieve this: one control port, -used by the target session daemon, and one data port, used by the -target consumer daemon. The relay and session daemons agree on common -default ports when custom ones are not specified. - -Since the communication transport protocol for both ports is standard -TCP, the relay daemon may be started either remotely or locally (on the -target system). - -While two instances of consumer daemons (32-bit and 64-bit) may run -concurrently for a given user, `lttng-relayd` needs only be of its -host operating system's bitness. - -The other important feature of LTTng's relay daemon is the support of -_LTTng live_. LTTng live is an application protocol to view events as -they arrive. The relay daemon still records events in trace files, -but a _tee_ allows to inspect incoming events. - -
-LTTng live -
- The relay daemon creates a tee, forwarding the trace data - to both trace files and a live viewer. -
-
- -Using LTTng live -locally thus requires to run a local relay daemon. diff --git a/contents/understanding-lttng/plumbing/lttng-sessiond.md b/contents/understanding-lttng/plumbing/lttng-sessiond.md deleted file mode 100644 index 70ac4cd..0000000 --- a/contents/understanding-lttng/plumbing/lttng-sessiond.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -id: lttng-sessiond ---- - -At the heart of LTTng's plumbing is the _session daemon_, often called -by its command name, `lttng-sessiond`. - -The session daemon is responsible for managing tracing sessions and -what they logically contain (channel properties, enabled/disabled -events, and the rest). By communicating locally with instrumented -applications (using LTTng-UST) and with the LTTng Linux kernel modules -(LTTng-modules), it oversees all tracing activities. - -One of the many things that `lttng-sessiond` does is to keep -track of the available event types. User space applications and -libraries actively connect and register to the session daemon when they -start. By contrast, `lttng-sessiond` seeks out and loads the appropriate -LTTng kernel modules as part of its own initialization. Kernel event -types are _pulled_ by `lttng-sessiond`, whereas user space event types -are _pushed_ to it by the various user space tracepoint providers. - -Using a specific inter-process communication protocol with Linux kernel -and user space tracers, the session daemon can send channel information -so that they are initialized, enable/disable specific probes based on -enabled/disabled events by the user, send event filters information to -LTTng tracers so that filtering actually happens at the tracer site, -start/stop tracing a specific application or the Linux kernel, and more. - -The session daemon is not useful without some user controlling it, -because it's only a sophisticated control interchange and thus -doesn't make any decision on its own. `lttng-sessiond` opens a local -socket for controlling it, albeit the preferred way to control it is -using `liblttng-ctl`, an installed C library hiding the communication -protocol behind an easy-to-use API. The `lttng` tool makes use of -`liblttng-ctl` to implement a user-friendly command line interface. - -`lttng-sessiond` does not receive any trace data from instrumented -applications; the _consumer daemons_ are the programs responsible for -collecting trace data using shared ring buffers. However, the session -daemon is the one that must spawn a consumer daemon and establish -a control communication with it. - -Session daemons run on a per-user basis. Knowing this, multiple -instances of `lttng-sessiond` may run simultaneously, each belonging -to a different user and each operating independently of the others. -Only `root`'s session daemon, however, may control LTTng kernel modules -(that is, the kernel tracer). With that in mind, if a user has no root -access on the target system, he cannot trace the system's kernel, but -should still be able to trace its own instrumented applications. - -It has to be noted that, although only `root`'s session daemon may -control the kernel tracer, the `lttng-sessiond` command has a `--group` -option which may be used to specify the name of a special user group -allowed to communicate with `root`'s session daemon and thus record -kernel traces. By default, this group is named `tracing`. - -If not done yet, the `lttng` tool, by default, automatically starts a -session daemon. `lttng-sessiond` may also be started manually: - -
-lttng-sessiond
-
- -This starts the session daemon in foreground. Use - -
-lttng-sessiond --daemonize
-
- -to start it as a true daemon. - -To kill the current user's session daemon, `pkill` may be used: - -
-pkill lttng-sessiond
-
- -The default `SIGTERM` signal terminates it cleanly. - -Several other options are available and described in -lttng-sessiond's -man page or by running `lttng-sessiond --help`. diff --git a/contents/understanding-lttng/plumbing/lttng-ust.md b/contents/understanding-lttng/plumbing/lttng-ust.md deleted file mode 100644 index 850a722..0000000 --- a/contents/understanding-lttng/plumbing/lttng-ust.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: lttng-ust ---- - -The user space tracing part of LTTng is possible thanks to the user -space tracing library, `liblttng-ust`, which is part of the LTTng-UST -package. - -`liblttng-ust` provides header files containing macros used to define -tracepoints and create tracepoint providers, as well as a shared object -that must be linked to individual applications to connect to and -communicate with a session daemon and a consumer daemon as soon as the -application starts. - -The exact mechanism by which an application is registered to the -session daemon is beyond the scope of this documentation. The only thing -you need to know is that, since the library constructor does this job -automatically, tracepoints may be safely inserted anywhere in the source -code without prior manual initialization of `liblttng-ust`. - -The `liblttng-ust`-session daemon collaboration also provides an -interesting feature: user space events may be enabled _before_ -applications actually start. By doing this and starting tracing before -launching the instrumented application, you make sure that even the -earliest occurring events can be recorded. - -The [C application](#doc-c-application) instrumenting guide of the -[Using LTTng](#doc-using-lttng) chapter focuses on using `liblttng-ust`: -instrumenting, building/linking and running a user application. diff --git a/contents/understanding-lttng/plumbing/overview.md b/contents/understanding-lttng/plumbing/overview.md deleted file mode 100644 index 383a04d..0000000 --- a/contents/understanding-lttng/plumbing/overview.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: plumbing-overview ---- - -As [mentioned previously](#doc-installing-lttng), the whole LTTng suite -is made of the LTTng-tools, LTTng-UST, and -LTTng-modules packages. Together, they provide different daemons, libraries, -kernel modules and command line interfaces. The following tree shows -which usable component belongs to which package: - - * **LTTng-tools**: - * session daemon (`lttng-sessiond`) - * consumer daemon (`lttng-consumerd`) - * relay daemon (`lttng-relayd`) - * tracing control library (`liblttng-ctl`) - * tracing control command line tool (`lttng`) - * **LTTng-UST**: - * user space tracing library (`liblttng-ust`) and its headers - * preloadable user space tracing helpers - (`liblttng-ust-libc-wrapper`, `liblttng-ust-pthread-wrapper`, - `liblttng-ust-cyg-profile`, `liblttng-ust-cyg-profile-fast` - and `liblttng-ust-dl`) - * user space tracepoint code generator command line tool - (`lttng-gen-tp`) - * `java.util.logging`/log4j tracepoint providers - (`liblttng-ust-jul-jni` and `liblttng-ust-log4j-jni`) and JAR - file (`liblttng-ust-agent.jar`) - * **LTTng-modules**: - * LTTng Linux kernel tracer module - * tracing ring buffer kernel modules - * many LTTng probe kernel modules - -The following diagram shows how the most important LTTng components -interact. Plain purple arrows represent trace data paths while dashed -red arrows indicate control communications. The LTTng relay daemon is -shown running on a remote system, although it could as well run on the -target (monitored) system. - -
-LTTng plumbing -
- Control and data paths between LTTng components -
-
- -Each component is described in the following subsections. diff --git a/contents/using-lttng/controlling-tracing/adding-context.md b/contents/using-lttng/controlling-tracing/adding-context.md deleted file mode 100644 index 34ab0f7..0000000 --- a/contents/using-lttng/controlling-tracing/adding-context.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -id: adding-context ---- - -If you read all the sections of -[Controlling tracing](#doc-controlling-tracing) so far, you should be -able to create tracing sessions, create and enable channels and events -within them and start/stop the LTTng tracers. Event fields recorded in -trace files provide important information about occurring events, but -sometimes external context may help you solve a problem faster. This -section discusses how to add context information to events of a -specific channel using the `lttng` tool. - -There are various available context values which can accompany events -recorded by LTTng, for example: - - * **process information**: - * identifier (PID) - * name - * priority - * scheduling priority (niceness) - * thread identifier (TID) - * the **hostname** of the system on which the event occurred - * plenty of **performance counters** using perf, for example: - * CPU cycles, stalled cycles, idle cycles, and the other cycle types - * cache misses - * branch instructions, misses, loads - * CPU faults - -The full list is available in the output of `lttng add-context --help`. -Some of them are reserved for a specific domain (kernel or -user space) while others are available for both. - -To add context information to one or all channels of a given tracing -session, use the `add-context` command: - -
-lttng add-context --userspace --type vpid --type perf:thread:cpu-cycles
-
- -The above example adds the virtual process identifier and per-thread -CPU cycles count values to all recorded user space domain events of the -current tracing session. Use the `--channel` option to select a specific -channel: - -
-lttng add-context --kernel --channel my-channel --type tid
-
- -adds the thread identifier value to all recorded kernel domain events -in the channel `my-channel` of the current tracing session. - -Beware that context information cannot be removed from channels once -it's added for a given tracing session. diff --git a/contents/using-lttng/controlling-tracing/basic-tracing-session-control.md b/contents/using-lttng/controlling-tracing/basic-tracing-session-control.md deleted file mode 100644 index 0955e7e..0000000 --- a/contents/using-lttng/controlling-tracing/basic-tracing-session-control.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: basic-tracing-session-control ---- - -Once you have -[created a tracing session](#doc-creating-destroying-tracing-sessions) -and [enabled one or more events](#doc-enabling-disabling-events), -you may activate the LTTng tracers for the current tracing session at -any time: - -
-lttng start
-
- -Subsequently, you may stop the tracers: - -
-lttng stop
-
- -LTTng is very flexible: user space applications may be launched before -or after the tracers are started. Events are only recorded if they -are properly enabled and if they occur while tracers are active. - -A tracing session name may be passed to both the `start` and `stop` -commands to start/stop tracing a session other than the current one. diff --git a/contents/using-lttng/controlling-tracing/creating-destroying-tracing-sessions.md b/contents/using-lttng/controlling-tracing/creating-destroying-tracing-sessions.md deleted file mode 100644 index e92dbaf..0000000 --- a/contents/using-lttng/controlling-tracing/creating-destroying-tracing-sessions.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -id: creating-destroying-tracing-sessions ---- - -Whatever you want to do with `lttng`, it has to happen inside a -**tracing session**, created beforehand. A session, in general, is a -per-user container of state. A tracing session is no different; it -keeps a specific state of stuff like: - - * session name - * enabled/disabled channels with associated parameters - * enabled/disabled events with associated log levels and filters - * context information added to channels - * tracing activity (started or stopped) - -and more. - -A single user may have many active tracing sessions. LTTng session -daemons are the ultimate owners and managers of tracing sessions. For -user space tracing, each user has its own session daemon. Since Linux -kernel tracing requires root privileges, only `root`'s session daemon -may enable and trace kernel events. However, `lttng` has a `--group` -option (which is passed to `lttng-sessiond` when starting it) to -specify the name of a _tracing group_ which selected users may be part -of to be allowed to communicate with `root`'s session daemon. By -default, the tracing group name is `tracing`. - -To create a tracing session, do: - -
-lttng create my-session
-
- -This creates a new tracing session named `my-session` and make it -the current one. If you don't specify a name (running only -`lttng create`), your tracing session is named `auto` followed by the -current date and time. Traces -are written in ~/lttng-traces/session- followed -by the tracing session's creation date/time by default, where -session is the tracing session name. To save them -at a different location, use the `--output` option: - -
-lttng create --output /tmp/some-directory my-session
-
- -You may create as many tracing sessions as you wish: - -
-lttng create other-session
-lttng create yet-another-session
-
- -You may view all existing tracing sessions using the `list` command: - -
-lttng list
-
- -The state of a _current tracing session_ is kept in `~/.lttngrc`. Each -invocation of `lttng` reads this file to set its current tracing -session name so that you don't have to specify a session name for each -command. You could edit this file manually, but the preferred way to -set the current tracing session is to use the `set-session` command: - -
-lttng set-session other-session
-
- -Most `lttng` commands accept a `--session` option to specify the name -of the target tracing session. - -Any existing tracing session may be destroyed using the `destroy` -command: - -
-lttng destroy my-session
-
- -Providing no argument to `lttng destroy` destroys the current -tracing session. Destroying a tracing session stops any tracing -running within the latter. Destroying a tracing session frees resources -acquired by the session daemon and tracer side, making sure to flush -all trace data. - -You can't do much with LTTng using only the `create`, `set-session` -and `destroy` commands of `lttng`, but it is essential to know them in -order to control LTTng tracing, which always happen within the scope of -a tracing session. diff --git a/contents/using-lttng/controlling-tracing/enabling-disabling-channels/fine-tuning-channels.md b/contents/using-lttng/controlling-tracing/enabling-disabling-channels/fine-tuning-channels.md deleted file mode 100644 index d21924b..0000000 --- a/contents/using-lttng/controlling-tracing/enabling-disabling-channels/fine-tuning-channels.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -id: fine-tuning-channels ---- - -There are various parameters that may be fine-tuned with the -`enable-channel` command. The latter are well documented in -the man page of `lttng` -and in the [Channel](#doc-channel) section of the -[Understanding LTTng](#doc-understanding-lttng) chapter. For basic -tracing needs, their default values should be just fine, but here are a -few examples to break the ice. - -As the frequency of recorded events increases—either because the -event throughput is actually higher or because you enabled more events -than usual—_event loss_ might be experienced. Since LTTng never -waits, by design, for sub-buffer space availability (non-blocking -tracer), when a sub-buffer is full and no empty sub-buffers are left, -there are two possible outcomes: either the new events that do not fit -are rejected, or they start replacing the oldest recorded events. -The choice of which algorithm to use is a per-channel parameter, the -default being discarding the newest events until there is some space -left. If your situation always needs the latest events at the expense -of writing over the oldest ones, create a channel with the `--overwrite` -option: - -
-lttng enable-channel --kernel --overwrite my-channel
-
- -When an event is lost, it means no space was available in any -sub-buffer to accommodate it. Thus, if you want to cope with sporadic -high event throughput situations and avoid losing events, you need to -allocate more room for storing them in memory. This can be done by -either increasing the size of sub-buffers or by adding sub-buffers. -The following example creates a user space domain channel with -16 sub-buffers of 512 kiB each: - -
-lttng enable-channel --userspace --num-subbuf 16 --subbuf-size 512k big-channel
-
- -Both values need to be powers of two, otherwise they are rounded up -to the next one. - -Two other interesting available parameters of `enable-channel` are -`--tracefile-size` and `--tracefile-count`, which respectively limit -the size of each trace file and the their count for a given channel. -When the number of written trace files reaches its limit for a given -channel-CPU pair, the next trace file overwrites the very first -one. The following example creates a kernel domain channel with a -maximum of three trace files of 1 MiB each: - -
-lttng enable-channel --kernel --tracefile-size 1M --tracefile-count 3 my-channel
-
- -An efficient way to make sure lots of events are generated is enabling -all kernel events in this channel and starting the tracer: - -
-lttng enable-event --kernel --all --channel my-channel
-lttng start
-
- -After a few seconds, look at trace files in your tracing session -output directory. For two CPUs, it should look like: - -~~~ text -my-channel_0_0 my-channel_1_0 -my-channel_0_1 my-channel_1_1 -my-channel_0_2 my-channel_1_2 -~~~ - -Amongst the files above, you might see one in each group with a size -lower than 1 MiB: they are the files currently being written. - -Since all those small files are valid LTTng trace files, LTTng trace -viewers may read them. It is the viewer's responsibility to properly -merge the streams so as to present an ordered list to the user. -Babeltrace -merges LTTng trace files correctly and is fast at doing it. diff --git a/contents/using-lttng/controlling-tracing/enabling-disabling-channels/intro.md b/contents/using-lttng/controlling-tracing/enabling-disabling-channels/intro.md deleted file mode 100644 index 676d4ba..0000000 --- a/contents/using-lttng/controlling-tracing/enabling-disabling-channels/intro.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -id: enabling-disabling-channels ---- - -[As mentioned](#doc-event) in the -[Understanding LTTng](#doc-understanding-lttng) chapter, enabled -events are contained in a specific channel, itself contained in a -specific tracing session. A channel is a group of events with -tunable parameters (event loss mode, sub-buffer size, number of -sub-buffers, trace file sizes and count, to name a few). A given channel -may only be responsible for enabled events belonging to one domain: -either kernel or user space. - -If you only used the `create`, `enable-event` and `start`/`stop` -commands of the `lttng` tool so far, one or two channels were -automatically created for you (one for the kernel domain and/or one -for the user space domain). The default channels are both named -`channel0`; channels from different domains may have the same name. - -The current channels of a given tracing session can be viewed with - -
-lttng list some-session
-
- -where `some-session` is the name of the desired tracing session. - -To create and enable a channel, use the `enable-channel` command: - -
-lttng enable-channel --kernel my-channel
-
- -This creates a kernel domain channel named `my-channel` with -default parameters in the current tracing session. - -
-

- Note:Because of a current limitation, all - channels must be created prior to beginning tracing in a - given tracing session, that is before the first time you do - lttng start. -

-

- Since a channel is automatically created by - enable-event only for the specified domain, you cannot, - for example, enable a kernel domain event, start tracing and then - enable a user space domain event because no user space channel - exists yet and it's too late to create one. -

-

- For this reason, make sure to configure your channels properly - before starting the tracers for the first time! -

-
- -Here's another example: - -
-lttng enable-channel --userspace --session other-session --overwrite \
-                     --tracefile-size 1048576 1mib-channel
-
- -This creates a user space domain channel named `1mib-channel` in -the tracing session named `other-session` that loses new events by -overwriting previously recorded events (instead of the default mode of -discarding newer ones) and saves trace files with a maximum size of -1 MiB each. - -Note that channels may also be created using the `--channel` option of -the `enable-event` command when the provided channel name doesn't exist -for the specified domain: - -
-lttng enable-event --kernel --channel some-channel sched_switch
-
- -If no kernel domain channel named `some-channel` existed before calling -the above command, it would be created with default parameters. - -You may enable the same event in two different channels: - -
-lttng enable-event --userspace --channel my-channel app:tp
-lttng enable-event --userspace --channel other-channel app:tp
-
- -If both channels are enabled, the occurring `app:tp` event -generates two recorded events, one for each channel. - -Disabling a channel is done with the `disable-event` command: - -
-lttng disable-event --kernel some-channel
-
- -The state of a channel precedes the individual states of events within -it: events belonging to a disabled channel, even if they are -enabled, won't be recorded. - diff --git a/contents/using-lttng/controlling-tracing/enabling-disabling-events.md b/contents/using-lttng/controlling-tracing/enabling-disabling-events.md deleted file mode 100644 index 5c40f4c..0000000 --- a/contents/using-lttng/controlling-tracing/enabling-disabling-events.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -id: enabling-disabling-events ---- - -Inside a tracing session, individual events may be enabled or disabled -so that tracing them may or may not generate trace data. - -We sometimes use the term _event_ metonymically throughout this text to -refer to a specific condition, or _rule_, that could lead, when -satisfied, to an actual occurring event (a point at a specific position -in source code/binary program, logical processor and time capturing -some payload) being recorded as trace data. This specific condition is -composed of: - - 1. A **domain** (kernel, user space, `java.util.logging`, or log4j) - (required). - 2. One or many **instrumentation points** in source code or binary - program (tracepoint name, address, symbol name, function name, - logger name, amongst other types of probes) to be executed - (required). - 3. A **log level** (each instrumentation point declares its own log - level) or log level range to match (optional; only valid for user - space domain). - 4. A **custom user expression**, or **filter**, that must evaluate to - _true_ when a tracepoint is executed (optional). - -All conditions are specified using arguments passed to the -`enable-event` command of the `lttng` tool. - -Condition 1 is specified using either `--kernel`/`-k` (kernel), -`--userspace`/`-u` (user space), `--jul`/`-j` -(JUL), or `--log4j`/`-l` (log4j). -Exactly one of those four arguments must be specified. - -Condition 2 is specified using one of: - - * `--tracepoint`: **tracepoint** - * `--probe`: **dynamic probe** (address, symbol name or combination - of both in binary program; only valid for kernel domain) - * `--function`: **function entry/exit** (address, symbol name or - combination of both in binary program; only valid for kernel domain) - * `--syscall`: **system call entry/exit** (only valid for kernel - domain) - -When none of the above is specified, `enable-event` defaults to -using `--tracepoint`. - -Condition 3 is specified using one of: - - * `--loglevel`: log level range from 0 to a specific log level - * `--loglevel-only`: specific log level - -See `lttng enable-event --help` for the complete list of log level -names. - -Condition 4 is specified using the `--filter` option. This filter is -a C-like expression, potentially reading real-time values of event -fields, that has to evaluate to _true_ for the condition to be satisfied. -Event fields are read using plain identifiers while context fields -must be prefixed with `$ctx.`. See `lttng enable-event --help` for -all usage details. - -The aforementioned arguments are combined to create and enable events. -Each unique combination of arguments leads to a different -_enabled event_. The log level and filter arguments are optional, their -default values being respectively all log levels and a filter which -always returns _true_. - -Here are a few examples (you must -[create a tracing session](#doc-creating-destroying-tracing-sessions) -first): - -
-lttng enable-event -u --tracepoint my_app:hello_world
-lttng enable-event -u --tracepoint my_app:hello_you --loglevel TRACE_WARNING
-lttng enable-event -u --tracepoint 'my_other_app:*'
-lttng enable-event -u --tracepoint my_app:foo_bar \
-                   --filter 'some_field <= 23 && !other_field'
-lttng enable-event -k --tracepoint sched_switch
-lttng enable-event -k --tracepoint gpio_value
-lttng enable-event -k --function usb_probe_device usb_probe_device
-lttng enable-event -k --syscall --all
-lttng enable-event -k --tracepoint irq_handler_entry  \
-                   --filter 'irq == 28 || irq == 17'
-
- -The wildcard symbol, `*`, matches _anything_ and may only be used at -the end of the string when specifying a _tracepoint_. Make sure to -use it between single quotes in your favorite shell to avoid -undesired shell expansion. - -System call events can be enabled individually, too: - -
-
Since 2.6
lttng enable-event -k --syscall open -lttng enable-event -k --syscall read -lttng enable-event -k --syscall fork,chdir,pipe -
- -The complete list of available system call events can be -obtained using - -
-lttng list --kernel --syscall
-
- -You can see a list of events (enabled or disabled) using - -
-lttng list some-session
-
- -where `some-session` is the name of the desired tracing session. - -What you're actually doing when enabling events with specific conditions -is creating a **whitelist** of traceable events for a given channel. -Thus, the following case presents redundancy: - -
-lttng enable-event -u --tracepoint my_app:hello_you
-lttng enable-event -u --tracepoint my_app:hello_you --loglevel TRACE_DEBUG
-
- -The second command, matching a log level range, is useless since the first -command enables all tracepoints matching the same name, -`my_app:hello_you`. - -Disabling an event is simpler: you only need to provide the event -name to the `disable-event` command: - -
-lttng disable-event --userspace my_app:hello_you
-
- -This name has to match a name previously given to `enable-event` (it -has to be listed in the output of `lttng list some-session`). -The `*` wildcard is supported, as long as you also used it in a -previous `enable-event` invocation. - -Disabling an event does not add it to some blacklist: it simply removes -it from its channel's whitelist. This is why you cannot disable an event -which wasn't previously enabled. - -A disabled event doesn't generate any trace data, even if all its -specified conditions are met. - -Events may be enabled and disabled at will, either when LTTng tracers -are active or not. Events may be enabled before a user space application -is even started. diff --git a/contents/using-lttng/controlling-tracing/intro.md b/contents/using-lttng/controlling-tracing/intro.md deleted file mode 100644 index 7d42c52..0000000 --- a/contents/using-lttng/controlling-tracing/intro.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: controlling-tracing ---- - -Once you're in possession of a software that is properly -[instrumented](#doc-instrumenting) for LTTng tracing, be it thanks to -the built-in LTTng probes for the Linux kernel, a custom user -application, or a custom Linux kernel, all that is left is actually -tracing it. - -You control LTTng tracing using a single command -line tool: `lttng`. LTTng [session daemons](#doc-lttng-sessiond) may -either be started manually (`lttng-sessiond`) or automatically by the -`lttng` command when a sessions is created. Trace data may be forwarded -to the network and used elsewhere using an LTTng -[relay daemon](#doc-lttng-relayd) (`lttng-relayd`). - -The man pages of `lttng`, `lttng-sessiond`, and `lttng-relayd` are pretty -complete, thus this section is not an online copy of the latter (we -leave this contents for the -[Online LTTng man pages](#doc-online-lttng-manpages) section). -This section is rather a tour of LTTng -features through practical examples and tips. - -If not already done, make sure you understand the core concepts -and how LTTng components connect together by reading the -[Understanding LTTng](#doc-understanding-lttng) chapter; this section -assumes you are familiar with them. diff --git a/contents/using-lttng/controlling-tracing/lttng-live.md b/contents/using-lttng/controlling-tracing/lttng-live.md deleted file mode 100644 index b9a3456..0000000 --- a/contents/using-lttng/controlling-tracing/lttng-live.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -id: lttng-live -since: 2.4 ---- - -We have seen how trace files may be produced by LTTng out of generated -application and Linux kernel events. We have seen that those trace files -may be either recorded locally by consumer daemons or remotely using -a relay daemon. And we have seen that the maximum size and count of -trace files is configurable for each channel. With all those features, -it's still not possible to read a trace file as it is being written -because it could be incomplete and appear corrupted to the viewer. -There is a way to view events as they arrive, however: using -_LTTng live_. - -LTTng live is implemented, in LTTng, solely on the relay daemon side. -As trace data is sent over the network to a relay daemon by a (possibly -remote) consumer daemon, a _tee_ is created: trace data is recorded to -trace files _as well as_ being transmitted to a connected live viewer: - -
-LTTng live -
- The relay daemon creates a tee, forwarding the trace data - to both trace files and a live viewer. -
-
- -In order to use this feature, a tracing session must created in live -mode on the target system: - -
-lttng create --live
-
- -An optional parameter may be passed to `--live` to set the period -(in microseconds) between flushes to the network -(1 second is the default). With: - -
-lttng create --live 100000
-
- -the daemons flush their data every 100 ms. - -If no network output is specified to the `create` command, a local -relay daemon is spawned. In this very common case, viewing a live -trace is easy: enable events and start tracing as usual, then use -`lttng view` to start the default live viewer: - -
-lttng view
-
- -The correct arguments are passed to the live viewer so that it -may connect to the local relay daemon and start reading live events. - -You may also wish to use a live viewer not running on the target -system. In this case, you should specify a network output when using -the `create` command (`--set-url` or `--ctrl-url`/`--data-url` options). -A distant LTTng relay daemon should also be started to receive control -and trace data. By default, `lttng-relayd` listens on 127.0.0.1:5344 -for an LTTng live connection. Otherwise, the desired URL may be -specified using its `--live-port` option. - -The -`babeltrace` -viewer supports LTTng live as one of its input formats. `babeltrace` is -the default viewer when using `lttng view`. To use it manually, first -list active tracing sessions by doing the following (assuming the relay -daemon to connect to runs on the same host): - -
-babeltrace --input-format lttng-live net://localhost
-
- -Then, choose a tracing session and start viewing events as they arrive -using LTTng live: - -
-babeltrace --input-format lttng-live net://localhost/host/hostname/my-session
-
diff --git a/contents/using-lttng/controlling-tracing/mi.md b/contents/using-lttng/controlling-tracing/mi.md deleted file mode 100644 index 5b82c4c..0000000 --- a/contents/using-lttng/controlling-tracing/mi.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: mi -since: 2.6 ---- - -The `lttng` tool aims at providing a command output as human-readable as -possible. While this output is easy to parse by a human being, machines -have a hard time. - -This is why the `lttng` tool provides the general `--mi` option, which -must specify a machine interface output format. As of the latest -LTTng stable release, only the `xml` format is supported. A schema -definition (XSD) is made -available -to ease the integration with external tools as much as possible. - -The `--mi` option can be used in conjunction with all `lttng` commands. -Here are some examples: - -
-lttng --mi xml create some-session
-lttng --mi xml list some-session
-lttng --mi xml list --kernel
-lttng --mi xml enable-event --kernel --syscall open
-lttng --mi xml start
-
diff --git a/contents/using-lttng/controlling-tracing/persistent-memory-file-systems.md b/contents/using-lttng/controlling-tracing/persistent-memory-file-systems.md deleted file mode 100644 index 2c8a2ec..0000000 --- a/contents/using-lttng/controlling-tracing/persistent-memory-file-systems.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -id: persistent-memory-file-systems -since: 2.7 ---- - -Non-volatile random-access memory -(NVRAM) is random-access memory that retains its information when power is turned off (non-volatile). -Systems with such memory can store data structures in RAM -and retrieve them after a reboot, without flushing to typical _storage_. - -Linux supports NVRAM file systems thanks to either -PRAMFS or -DAX + pmem -(requires Linux 4.1+). - -This documentation does not describe how to operate such file systems; -it is assumed that you have a working persistent memory file system. - -When creating an LTTng tracing session, you can use the `--shm-path` -option to specify the path of the shared memory holding the ring -buffers. Specifying a location on an NVRAM file system makes it possible -to retrieve the latest recorded trace data when the system reboots -after a crash. - -Example: - -
-lttng create --shm-path /path/to/shm
-
- -The binary layout of the ring buffer files is not exactly the same as -the trace files layout. To view the events of ring buffer files after -a system crash, use the `lttng-crash` utility: - -
-lttng-crash /path/to/shm
-
- -This extracts the trace data behind the scenes and runs -babeltrace -to view the events. To extract the trace data to an LTTng trace without -viewing the events, use the `--extract` option: - -
-lttng-crash --extract /path/to/trace /path/to/shm
-
- -See the lttng-crash man page -for the complete list of options. diff --git a/contents/using-lttng/controlling-tracing/pid-tracking.md b/contents/using-lttng/controlling-tracing/pid-tracking.md deleted file mode 100644 index 47edf2a..0000000 --- a/contents/using-lttng/controlling-tracing/pid-tracking.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -id: pid-tracking -since: 2.7 ---- - -It's often useful to allow only specific process IDs (PIDs) to emit -enabled events. For example, you may wish to record all the system -calls made by a given process (à la -strace). - -The `lttng track` and `lttng untrack` commands serve this purpose. Both -commands operate on a whitelist of process IDs. The `track` command -adds entries to this whitelist while the `untrack` command removes -entries. Any process having one of the PIDs in the whitelist is allowed -to emit [enabled](#doc-enabling-disabling-events) LTTng events. - -
-

- Note:The PID tracker tracks the - numeric process IDs. Should a process with a given tracked - ID exit and another process be given this ID, then the latter would - also be allowed to emit events. -

-
- -For the sake of the following examples, assume the target system has 16 -possible PIDs. When a [tracing session](#doc-creating-destroying-tracing-sessions) -is created, the whitelist contains all the possible PIDs: - -
-All PIDs are tracked -
All PIDs are tracked
-
- -When the whitelist is full and the `track` command is executed to specify -some PIDs to track, the whitelist is first cleared, then the specific -PIDs are tracked. For example, after - -
-lttng track --pid 3,4,7,10,13
-
- -the whitelist is: - -
-PIDs 3, 4, 7, 10, and 13 are tracked -
PIDs 3, 4, 7, 10, and 13 are tracked
-
- -More PIDs can be added to the whitelist afterwards: - -
-lttng track --pid 1,15,16
-
- -gives: - -
-PIDs 1, 15, and 16 are added to the whitelist -
PIDs 1, 15, and 16 are added to the whitelist
-
- -The `untrack` command removes entries from the PID tracker's whitelist. -Given the last example, the following command: - -
-lttng untrack --pid 3,7,10,13
-
- -leads to this whitelist: - -
-PIDs 3, 7, 10, and 13 are removed from the whitelist -
PIDs 3, 7, 10, and 13 are removed from the whitelist
-
- -All possible PIDs can be tracked again using the `--all` option of -`lttng track`: - -
-lttng track --pid --all
-
- -gives: - -
-All PIDs are tracked -
All PIDs are tracked
-
- -A very typical use case with PID tracking is starting with an empty -whitelist, then [starting the tracers](#doc-basic-tracing-session-control), -and then adding PIDs manually while tracing is active. This can be -accomplished by using the `--all` option of the `untrack` command -to clear the whitelist after a tracing session is created: - -
-lttng untrack --pid --all
-
- -gives: - -
-No PIDs are tracked -
No PIDs are tracked
-
- -Tracing with this whitelist configuration does not produce any event -because no processes are tracked. The `track` command can be used -as usual to track specific PIDs, for example: - -
-lttng track --pid 6,11
-
- -results in: - -
-PIDs 6 and 11 are tracked -
PIDs 6 and 11 are tracked
-
diff --git a/contents/using-lttng/controlling-tracing/saving-loading-tracing-session.md b/contents/using-lttng/controlling-tracing/saving-loading-tracing-session.md deleted file mode 100644 index 02ff9b1..0000000 --- a/contents/using-lttng/controlling-tracing/saving-loading-tracing-session.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -id: saving-loading-tracing-session -since: 2.5 ---- - -Configuring a tracing session may be long: creating and enabling -channels with specific parameters, enabling kernel and user space -domain events with specific log levels and filters, and adding context -to some channels are just a few of the many possible operations using -the `lttng` command line tool. If you're going to use LTTng to solve real -world problems, chances are you're going to have to record events using -the same tracing session setup over and over, modifying a few variables -each time in your instrumented program or environment. To avoid -constant tracing session reconfiguration, the `lttng` tool is able to -save and load tracing session configurations to/from XML files. - -To save a given tracing session configuration, do: - -
-lttng save my-session
-
- -where `my-session` is the name of the tracing session to save. Tracing -session configurations are saved to `~/.lttng/sessions` by default; -use the `--output-path` option to change this destination directory. - -All configuration parameters are saved: - - * tracing session name - * trace data output path - * channels with their state and all their parameters - * context information added to channels - * events with their state, log level and filter - * tracing activity (started or stopped) - -To load a tracing session, simply do: - -
-lttng load my-session
-
- -or, if you used a custom path: - -
-lttng load --input-path /path/to/my-session.lttng
-
- -Your saved tracing session is restored as if you just configured -it manually. diff --git a/contents/using-lttng/controlling-tracing/sending-trace-data-over-the-network.md b/contents/using-lttng/controlling-tracing/sending-trace-data-over-the-network.md deleted file mode 100644 index 68335e5..0000000 --- a/contents/using-lttng/controlling-tracing/sending-trace-data-over-the-network.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: sending-trace-data-over-the-network ---- - -The possibility of sending trace data over the network comes as a -built-in feature of LTTng-tools. For this to be possible, an LTTng -_relay daemon_ must be executed and listening on the machine where -trace data is to be received, and the user must create a tracing -session using appropriate options to forward trace data to the remote -relay daemon. - -The relay daemon listens on two different TCP ports: one for control -information and the other for actual trace data. - -Starting the relay daemon on the remote machine is easy: - -
-lttng-relayd
-
- -This makes it listen to its default ports: 5342 for control and -5343 for trace data. The `--control-port` and `--data-port` options may -be used to specify different ports. - -Traces written by `lttng-relayd` are written to -~/lttng-traces/hostname/session by -default, where hostname is the host name of the -traced (monitored) system and session is the -tracing session name. Use the `--output` option to write trace data -outside `~/lttng-traces`. - -On the sending side, a tracing session must be created using the -`lttng` tool with the `--set-url` option to connect to the distant -relay daemon: - -
-lttng create my-session --set-url net://distant-host
-
- -The URL format is described in the output of `lttng create --help`. -The above example uses the default ports; the `--ctrl-url` and -`--data-url` options may be used to set the control and data URLs -individually. - -Once this basic setup is completed and the connection is established, -you may use the `lttng` tool on the target machine as usual; everything -you do is transparently forwarded to the remote machine if needed. -For example, a parameter changing the maximum size of trace files -only has an effect on the distant relay daemon actually writing -the trace. diff --git a/contents/using-lttng/controlling-tracing/taking-a-snapshot.md b/contents/using-lttng/controlling-tracing/taking-a-snapshot.md deleted file mode 100644 index a48897d..0000000 --- a/contents/using-lttng/controlling-tracing/taking-a-snapshot.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: taking-a-snapshot -since: 2.3 ---- - -The normal behavior of LTTng is to record trace data as trace files. -This is ideal for keeping a long history of events that occurred on -the target system and applications, but may be too much data in some -situations. For example, you may wish to trace your application -continuously until some critical situation happens, in which case you -would only need the latest few recorded events to perform the desired -analysis, not multi-gigabyte trace files. - -LTTng has an interesting feature called _snapshots_. When creating -a tracing session in snapshot mode, no trace files are written; the -tracers' sub-buffers are constantly overwriting the oldest recorded -events with the newest. At any time, either when the tracers are started -or stopped, you may take a snapshot of those sub-buffers. - -There is no difference between the format of a normal trace file and the -format of a snapshot: viewers of LTTng traces also support LTTng -snapshots. By default, snapshots are written to disk, but they may also -be sent over the network. - -To create a tracing session in snapshot mode, do: - -
-lttng create --snapshot my-snapshot-session
-
- -Next, enable channels, events and add context to channels as usual. -Once a tracing session is created in snapshot mode, channels are -forced to use the -[overwrite](#doc-channel-overwrite-mode-vs-discard-mode) mode -(`--overwrite` option of the `enable-channel` command; also called -_flight recorder mode_) and have an `mmap()` channel type -(`--output mmap`). - -Start tracing. When you're ready to take a snapshot, do: - -
-lttng snapshot record --name my-snapshot
-
- -This records a snapshot named `my-snapshot` of all channels of -all domains of the current tracing session. By default, snapshots files -are recorded in the path returned by `lttng snapshot list-output`. You -may change this path or decide to send snapshots over the network -using either: - - 1. an output path/URL specified when creating the tracing session - (`lttng create`) - 2. an added snapshot output path/URL using - `lttng snapshot add-output` - 3. an output path/URL provided directly to the - `lttng snapshot record` command - -Method 3 overrides method 2 which overrides method 1. When specifying -a URL, a relay daemon must be listening on some machine (see -[Sending trace data over the network](#doc-sending-trace-data-over-the-network)). - -If you need to make absolutely sure that the output file won't be -larger than a certain limit, you can set a maximum snapshot size when -taking it with the `--max-size` option: - -
-lttng snapshot record --name my-snapshot --max-size 2M
-
- -Older recorded events are discarded in order to respect this -maximum size. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-tools.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-tools.md deleted file mode 100644 index e4bb8b1..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-tools.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: building-32-bit-lttng-tools ---- - -Since the host is a 64-bit system, most 32-bit binaries and libraries of -LTTng-tools are not needed; the host uses their 64-bit counterparts. -The required step here is building and installing a 32-bit consumer -daemon. - -Follow this: - -
-git clone http://git.lttng.org/lttng-tools.git
-cd lttng-ust
-./bootstrap
-./configure --prefix=/usr \
-            --libdir=/usr/lib32 CFLAGS=-m32 CXXFLAGS=-m32 \
-            LDFLAGS=-L/usr/lib32
-make
-cd src/bin/lttng-consumerd
-sudo make install
-sudo ldconfig
-
- -The above commands build all the LTTng-tools project as 32-bit -applications, but only installs the 32-bit consumer daemon. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-ust.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-ust.md deleted file mode 100644 index c1317cf..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-lttng-ust.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -id: building-32-bit-lttng-ust ---- - -Follow this: - -
-git clone http://git.lttng.org/lttng-ust.git
-cd lttng-ust
-./bootstrap
-./configure --prefix=/usr \
-            --libdir=/usr/lib32 \
-            CFLAGS=-m32 CXXFLAGS=-m32 \
-            LDFLAGS=-L/usr/lib32
-make
-sudo make install
-sudo ldconfig
-
- -`-L/usr/lib32` is required for the build to find the 32-bit versions -of Userspace RCU and other dependencies. - -
-

- Note:Depending on your Linux distribution, - 32-bit libraries could be installed at a different location than - /usr/lib32. For example, Debian is known to install - some 32-bit libraries in /usr/lib/i386-linux-gnu. -

-

- In this case, make sure to set LDFLAGS to all the - relevant 32-bit library paths, for example, - LDFLAGS="-L/usr/lib32 -L/usr/lib/i386-linux-gnu". -

-
- -
-

- Note:You may add options to - ./configure if you need them (for - Java and SystemTap support, for example). Look at - ./configure --help for more information. -

-
diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-userspace-rcu.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-userspace-rcu.md deleted file mode 100644 index e990524..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-32-bit-userspace-rcu.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: building-32-bit-userspace-rcu ---- - -Follow this: - -
-git clone git://git.urcu.so/urcu.git
-cd urcu
-./bootstrap
-./configure --libdir=/usr/lib32 CFLAGS=-m32
-make
-sudo make install
-sudo ldconfig
-
- -The `-m32` C compiler flag creates 32-bit object files and `--libdir` -indicates where to install the resulting libraries. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-64-bit-lttng-tools.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-64-bit-lttng-tools.md deleted file mode 100644 index 1ae5c1c..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-64-bit-lttng-tools.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: building-64-bit-lttng-tools ---- - -Finally, you need to build a 64-bit version of LTTng-tools which is -aware of the 32-bit consumer daemon previously built and installed: - -
-make clean
-./bootstrap
-./configure --prefix=/usr \
-            --with-consumerd32-libdir=/usr/lib32 \
-            --with-consumerd32-bin=/usr/lib32/lttng/libexec/lttng-consumerd
-make
-sudo make install
-sudo ldconfig
-
- -Henceforth, the 64-bit session daemon automatically finds the -32-bit consumer daemon if required. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-instrumented-32-bit-c-application.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-instrumented-32-bit-c-application.md deleted file mode 100644 index 8203c37..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/building-instrumented-32-bit-c-application.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: building-instrumented-32-bit-c-application ---- - -Let us reuse the _Hello world_ example of -[Tracing your own user application](#doc-tracing-your-own-user-application) -([Getting started](#doc-getting-started) chapter). - -The instrumentation process is unaltered. - -First, a typical 64-bit build (assuming you're running a 64-bit system): - -
-gcc -o hello64 -I. hello.c hello-tp.c -ldl -llttng-ust
-
- -Now, a 32-bit build: - -
-gcc -o hello32 -I. -m32 hello.c hello-tp.c -L/usr/lib32 \
-    -ldl -llttng-ust -Wl,-rpath,/usr/lib32
-
- -The `-rpath` option, passed to the linker, makes the dynamic loader -check for libraries in `/usr/lib32` before looking in its default paths, -where it should find the 32-bit version of `liblttng-ust`. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/intro.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/intro.md deleted file mode 100644 index 00c2e12..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/intro.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: instrumenting-32-bit-app-on-64-bit-system ---- - -In order to trace a 32-bit application running on a 64-bit system, -LTTng must use a dedicated 32-bit -[consumer daemon](#doc-lttng-consumerd). This section discusses how to -build that daemon (which is _not_ part of the default 64-bit LTTng -build) and the LTTng 32-bit tracing libraries, and how to instrument -a 32-bit application in that context. - -Make sure you install all 32-bit versions of LTTng dependencies. -Their names can be found in the `README.md` files of each LTTng package -source. How to find and install them depends on your target's -Linux distribution. `gcc-multilib` is a common package name for the -multilib version of GCC, which you also need. - -The following packages will be built for 32-bit support on a 64-bit -system: Userspace RCU, -LTTng-UST and LTTng-tools. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/running-32-bit-and-64-bit-c-applications.md b/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/running-32-bit-and-64-bit-c-applications.md deleted file mode 100644 index c768af4..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/32-bit-on-64-bit/running-32-bit-and-64-bit-c-applications.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: running-32-bit-and-64-bit-c-applications ---- - -Now, both 32-bit and 64-bit versions of the _Hello world_ example above -can be traced in the same tracing session. Use the `lttng` tool as usual -to create a tracing session and start tracing: - -
-lttng create session-3264
-lttng enable-event -u -a
-./hello32
-./hello64
-lttng stop
-
- -Use `lttng view` to verify both processes were -successfully traced. diff --git a/contents/using-lttng/instrumenting/advanced-techniques/intro.md b/contents/using-lttng/instrumenting/advanced-techniques/intro.md deleted file mode 100644 index 99e75a7..0000000 --- a/contents/using-lttng/instrumenting/advanced-techniques/intro.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: advanced-instrumenting-techniques ---- - -This section presents some advanced techniques related to -LTTng instrumenting. diff --git a/contents/using-lttng/instrumenting/c-application/assigning-log-levels.md b/contents/using-lttng/instrumenting/c-application/assigning-log-levels.md deleted file mode 100644 index 5565e2c..0000000 --- a/contents/using-lttng/instrumenting/c-application/assigning-log-levels.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: assigning-log-levels ---- - -Optionally, a log level can be assigned to a defined tracepoint. -Assigning different levels of importance to tracepoints can be useful; -when controlling tracing sessions, -[you can choose](#doc-controlling-tracing) to only enable tracepoints -falling into a specific log level range. - -Log levels are assigned to defined tracepoints using the -`TRACEPOINT_LOGLEVEL()` macro. The latter must be used _after_ having -used `TRACEPOINT_EVENT()` for a given tracepoint. The -`TRACEPOINT_LOGLEVEL()` macro has the following construct: - -~~~ c -TRACEPOINT_LOGLEVEL(, , ) -~~~ - -where the first two arguments are the same as the first two arguments -of `TRACEPOINT_EVENT()` and `` is one -of the values given in the -[LTTng-UST library reference](#doc-liblttng-ust-tracepoint-loglevel) -section. - -As an example, let's assign a `TRACE_DEBUG_UNIT` log level to our -previous tracepoint definition: - -~~~ c -TRACEPOINT_LOGLEVEL(my_provider, my_tracepoint, TRACE_DEBUG_UNIT) -~~~ diff --git a/contents/using-lttng/instrumenting/c-application/building-linking/dynamic-linking.md b/contents/using-lttng/instrumenting/c-application/building-linking/dynamic-linking.md deleted file mode 100644 index 4e02f9c..0000000 --- a/contents/using-lttng/instrumenting/c-application/building-linking/dynamic-linking.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -id: dynamic-linking ---- - -The second approach to package the tracepoint providers is to use -dynamic linking: the library and its member functions are explicitly -sought, loaded and unloaded at runtime using `libdl`. - -It has to be noted that, for a variety of reasons, the created shared -library is be dynamically _loaded_, as opposed to dynamically -_linked_. The tracepoint provider shared object is, however, linked -with `liblttng-ust`, so that `liblttng-ust` is guaranteed to be loaded -as soon as the tracepoint provider is. If the tracepoint provider is -not loaded, since the application itself is not linked with -`liblttng-ust`, the latter is not loaded at all and the tracepoint calls -become inert. - -The process to create the tracepoint provider shared object is pretty -much the same as the static library method, except that: - - * since the tracepoint provider is not part of the application - anymore, `TRACEPOINT_DEFINE` _must_ be defined, for each tracepoint - provider, in exactly one translation unit (C source file) of the - _application_; - * `TRACEPOINT_PROBE_DYNAMIC_LINKAGE` must be defined next to - `TRACEPOINT_DEFINE`. - -Regarding `TRACEPOINT_DEFINE` and `TRACEPOINT_PROBE_DYNAMIC_LINKAGE`, -the recommended practice is to use a separate C source file in your -application to define them, then include the tracepoint provider -header files afterwards. For example: - -~~~ c -#define TRACEPOINT_DEFINE -#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE - -/* include the header files of one or more tracepoint providers below */ -#include "tp1.h" -#include "tp2.h" -#include "tp3.h" -~~~ - -`TRACEPOINT_PROBE_DYNAMIC_LINKAGE` makes the macros included afterwards -(by including the tracepoint provider header, which itself includes -LTTng-UST headers) aware that the tracepoint provider is to be loaded -dynamically and not part of the application's executable. - -The tracepoint provider object file used to create the shared library -is built like it is using the static library method, only with the -`-fpic` option added: - -
-gcc -c -fpic -I. tp.c
-
- -It is then linked as a shared library like this: - -
-gcc -shared -Wl,--no-as-needed -o tp.so -llttng-ust tp.o
-
- -As previously stated, this tracepoint provider shared object isn't -linked with the user application: it's loaded manually. This is -why the application is built with no mention of this tracepoint -provider, but still needs `libdl`: - -
-gcc -o app other.o files.o of.o your.o app.o -ldl
-
- -Now, to make LTTng-UST tracing available to the application, the -`LD_PRELOAD` environment variable is used to preload the tracepoint -provider shared library _before_ the application actually starts: - -
-LD_PRELOAD=/path/to/tp.so ./app
-
- -
-

- Note:It is not safe to use - dlclose() on a tracepoint provider shared object that - is being actively used for tracing, due to a lack of reference - counting from LTTng-UST to the shared object. -

- -

- For example, statically linking a tracepoint provider to a - shared object which is to be dynamically loaded by an application - (a plugin, for example) is not safe: the shared object, which - contains the tracepoint provider, could be dynamically closed - (dlclose()) at any time by the application. -

- -

- To instrument a shared object, either: -

- -
    -
  1. - Statically link the tracepoint provider to the - application, or -
  2. -
  3. - Build the tracepoint provider as a shared object (following - the procedure shown in this section), and preload it when - tracing is needed using the LD_PRELOAD - environment variable. -
  4. -
-
- -Your application will still work without this preloading, albeit without -LTTng-UST tracing support: - -
-./app
-
- diff --git a/contents/using-lttng/instrumenting/c-application/building-linking/intro.md b/contents/using-lttng/instrumenting/c-application/building-linking/intro.md deleted file mode 100644 index cb3ad60..0000000 --- a/contents/using-lttng/instrumenting/c-application/building-linking/intro.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: building-tracepoint-providers-and-user-application ---- - -This section explains the final step of using LTTng-UST for tracing -a user space C application (beside running the application): building and -linking tracepoint providers and the application itself. - -As discussed above, the macros used by the user-written tracepoint provider -header file are useless until actually used to create probes code -(global data structures and functions) in a translation unit (C source file). -This is accomplished by defining `TRACEPOINT_CREATE_PROBES` in a translation -unit and then including the tracepoint provider header file. -When `TRACEPOINT_CREATE_PROBES` is defined, macros used and included by -the tracepoint provider header produce actual source code needed by any -application using the defined tracepoints. Defining -`TRACEPOINT_CREATE_PROBES` produces code used when registering -tracepoint providers when the tracepoint provider package loads. - -The other important definition is `TRACEPOINT_DEFINE`. This one creates -global, per-tracepoint structures referencing the tracepoint providers -data. Those structures are required by the actual functions inserted -where `tracepoint()` macros are placed and need to be defined by the -instrumented application. - -Both `TRACEPOINT_CREATE_PROBES` and `TRACEPOINT_DEFINE` need to be defined -at some places in order to trace a user space C application using LTTng. -Although explaining their exact mechanism is beyond the scope of this -document, the reason they both exist separately is to allow the trace -providers to be packaged as a shared object (dynamically loaded library). - -There are two ways to compile and link the tracepoint providers -with the application: _[statically](#doc-static-linking)_ or -_[dynamically](#doc-dynamic-linking)_. Both methods are covered in the -following subsections. diff --git a/contents/using-lttng/instrumenting/c-application/building-linking/lttng-ust-pkg-config.md b/contents/using-lttng/instrumenting/c-application/building-linking/lttng-ust-pkg-config.md deleted file mode 100644 index 1e38f43..0000000 --- a/contents/using-lttng/instrumenting/c-application/building-linking/lttng-ust-pkg-config.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: lttng-ust-pkg-config ---- - -On some distributions, LTTng-UST is shipped with a pkg-config metadata -file, so that you may use the `pkg-config` tool: - -
-pkg-config --libs lttng-ust
-
- -This prints `-llttng-ust -ldl` on Linux systems. - -You may also check the LTTng-UST version using `pkg-config`: - -
-pkg-config --modversion lttng-ust
-
- -For more information about pkg-config, see -its man page. diff --git a/contents/using-lttng/instrumenting/c-application/building-linking/static-linking.md b/contents/using-lttng/instrumenting/c-application/building-linking/static-linking.md deleted file mode 100644 index 8d80a92..0000000 --- a/contents/using-lttng/instrumenting/c-application/building-linking/static-linking.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -id: static-linking ---- - -With the static linking method, compiled tracepoint providers are copied -into the target application. There are three ways to do this: - - 1. Use one of your **existing C source files** to create probes. - 2. Create probes in a separate C source file and build it as an - **object file** to be linked with the application (more decoupled). - 3. Create probes in a separate C source file, build it as an - object file and archive it to create a **static library** - (more decoupled, more portable). - -The first approach is to define `TRACEPOINT_CREATE_PROBES` and include -your tracepoint provider(s) header file(s) directly into an existing C -source file. Here's an example: - -~~~ c -#include -#include -/* ... */ - -#define TRACEPOINT_CREATE_PROBES -#define TRACEPOINT_DEFINE -#include "tp.h" - -/* ... */ - -int my_func(int a, const char* b) -{ - /* ... */ - - tracepoint(my_provider, my_tracepoint, buf, sz, limit, &tt) - - /* ... */ -} - -/* ... */ -~~~ - -Again, before including a given tracepoint provider header file, -`TRACEPOINT_CREATE_PROBES` and `TRACEPOINT_DEFINE` must be defined in -one, **and only one**, translation unit. Other C source files of the -same application may include `tp.h` to use tracepoints with -the `tracepoint()` macro, but must not define -`TRACEPOINT_CREATE_PROBES`/`TRACEPOINT_DEFINE` again. - -This translation unit may be built as an object file by making sure to -add `.` to the include path: - -
-gcc -c -I. file.c
-
- -The second approach is to isolate the tracepoint provider code into a -separate object file by using a dedicated C source file to create probes: - -~~~ c -#define TRACEPOINT_CREATE_PROBES - -#include "tp.h" -~~~ - -`TRACEPOINT_DEFINE` must be defined by a translation unit of the -application. Since we're talking about static linking here, it could as -well be defined directly in the file above, before `#include "tp.h"`: - -~~~ c -#define TRACEPOINT_CREATE_PROBES -#define TRACEPOINT_DEFINE - -#include "tp.h" -~~~ - -This is actually what [`lttng-gen-tp`](#doc-lttng-gen-tp) does, and is -the recommended practice. - -Build the tracepoint provider: - -
-gcc -c -I. tp.c
-
- -Finally, the resulting object file may be archived to create a -more portable tracepoint provider static library: - -
-ar rc tp.a tp.o
-
- -Using a static library does have the advantage of centralising the -tracepoint providers objects so they can be shared between multiple -applications. This way, when the tracepoint provider is modified, the -source code changes don't have to be patched into each application's source -code tree. The applications need to be relinked after each change, but need -not to be otherwise recompiled (unless the tracepoint provider's API -changes). - -Regardless of which method you choose, you end up with an object file -(potentially archived) containing the trace providers assembled code. -To link this code with the rest of your application, you must also link -with `liblttng-ust` and `libdl`: - -
-gcc -o app tp.o other.o files.o of.o your.o app.o -llttng-ust -ldl
-
- -or - -
-gcc -o app tp.a other.o files.o of.o your.o app.o -llttng-ust -ldl
-
- -If you're using a BSD -system, replace `-ldl` with `-lc`: - -
-gcc -o app tp.a other.o files.o of.o your.o app.o -llttng-ust -lc
-
- -The application can be started as usual, for example: - -
-./app
-
- -The `lttng` command line tool can be used to -[control tracing](#doc-controlling-tracing). diff --git a/contents/using-lttng/instrumenting/c-application/building-linking/using-lttng-ust-with-daemons.md b/contents/using-lttng/instrumenting/c-application/building-linking/using-lttng-ust-with-daemons.md deleted file mode 100644 index d4a6cbb..0000000 --- a/contents/using-lttng/instrumenting/c-application/building-linking/using-lttng-ust-with-daemons.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: using-lttng-ust-with-daemons ---- - -Some extra care is needed when using `liblttng-ust` with daemon -applications that call `fork()`, `clone()` or BSD's `rfork()` without -a following `exec()` family system call. The `liblttng-ust-fork` -library must be preloaded for the application. - -Example: - -
-LD_PRELOAD=liblttng-ust-fork.so ./app
-
- -Or, if you're using a tracepoint provider shared library: - -
-LD_PRELOAD="liblttng-ust-fork.so /path/to/tp.so" ./app
-
diff --git a/contents/using-lttng/instrumenting/c-application/defining-tracepoints.md b/contents/using-lttng/instrumenting/c-application/defining-tracepoints.md deleted file mode 100644 index 3952994..0000000 --- a/contents/using-lttng/instrumenting/c-application/defining-tracepoints.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -id: defining-tracepoints ---- - -As written in [Tracepoint provider](#doc-tracepoint-provider), -tracepoints are defined using the -`TRACEPOINT_EVENT()` macro. Each tracepoint, when called using the -`tracepoint()` macro in the actual application's source code, generates -a specific event type with its own fields. - -Let's have another look at the example above, with a few added comments: - -~~~ c -TRACEPOINT_EVENT( - /* tracepoint provider name */ - my_provider, - - /* tracepoint/event name */ - my_first_tracepoint, - - /* list of tracepoint arguments */ - TP_ARGS( - int, my_integer_arg, - char*, my_string_arg - ), - - /* list of fields of eventual event */ - TP_FIELDS( - ctf_string(my_string_field, my_string_arg) - ctf_integer(int, my_integer_field, my_integer_arg) - ) -) -~~~ - -The tracepoint provider name must match the name of the tracepoint -provider in which this tracepoint is defined -(see [Tracepoint provider](#doc-tracepoint-provider)). In other words, -always use the same string as the value of `TRACEPOINT_PROVIDER` above. - -The tracepoint name becomes the event name once events are recorded -by the LTTng-UST tracer. It must follow the tracepoint provider name -syntax: start with a letter and contain either letters, numbers or -underscores. Two tracepoints under the same provider cannot have the -same name. In other words, you cannot overload a tracepoint like you -would overload functions and methods in C++/Java. - -
-

Note:The concatenation of the tracepoint -provider name and the tracepoint name cannot exceed 254 characters. If -it does, the instrumented application compiles and runs, but LTTng -issues multiple warnings and you could experience serious problems.

-
- -The list of tracepoint arguments gives this tracepoint its signature: -see it like the declaration of a C function. The format of `TP_ARGS()` -arguments is: C type, then argument name; repeat as needed, up to ten -times. For example, if we were to replicate the signature of C standard -library's `fseek()`, the `TP_ARGS()` part would look like: - -~~~ c - TP_ARGS( - FILE*, stream, - long int, offset, - int, origin - ), -~~~ - -Of course, you need to include appropriate header files before -the `TRACEPOINT_EVENT()` macro calls if any argument has a complex type. - -`TP_ARGS()` may not be omitted, but may be empty. `TP_ARGS(void)` is -also accepted. - -The list of fields is where the fun really begins. The fields defined -in this list are the fields of the events generated by the execution -of this tracepoint. Each tracepoint field definition has a C -_argument expression_ which is evaluated when the execution reaches -the tracepoint. Tracepoint arguments _may be_ used freely in those -argument expressions, but they _don't_ have to. - -There are several types of tracepoint fields available. The macros to -define them are given and explained in the -[LTTng-UST library reference](#doc-liblttng-ust-tp-fields) section. - -Field names must follow the standard C identifier syntax: letter, then -optional sequence of letters, numbers or underscores. Each field must have -a different name. - -Those `ctf_*()` macros are added to the `TP_FIELDS()` part of -`TRACEPOINT_EVENT()`. Note that they are not delimited by commas. -`TP_FIELDS()` may be empty, but the `TP_FIELDS(void)` form is _not_ -accepted. - -The following snippet shows how argument expressions may be used in -tracepoint fields and how they may refer freely to tracepoint arguments. - -~~~ c -/* for struct stat */ -#include -#include -#include - -TRACEPOINT_EVENT( - my_provider, - my_tracepoint, - TP_ARGS( - int, my_int_arg, - char*, my_str_arg, - struct stat*, st - ), - TP_FIELDS( - /* simple integer field with constant value */ - ctf_integer( - int, /* field C type */ - my_constant_field, /* field name */ - 23 + 17 /* argument expression */ - ) - - /* my_int_arg tracepoint argument */ - ctf_integer( - int, - my_int_arg_field, - my_int_arg - ) - - /* my_int_arg squared */ - ctf_integer( - int, - my_int_arg_field2, - my_int_arg * my_int_arg - ) - - /* sum of first 4 characters of my_str_arg */ - ctf_integer( - int, - sum4, - my_str_arg[0] + my_str_arg[1] + - my_str_arg[2] + my_str_arg[3] - ) - - /* my_str_arg as string field */ - ctf_string( - my_str_arg_field, /* field name */ - my_str_arg /* argument expression */ - ) - - /* st_size member of st tracepoint argument, hexadecimal */ - ctf_integer_hex( - off_t, /* field C type */ - size_field, /* field name */ - st->st_size /* argument expression */ - ) - - /* st_size member of st tracepoint argument, as double */ - ctf_float( - double, /* field C type */ - size_dbl_field, /* field name */ - (double) st->st_size /* argument expression */ - ) - - /* half of my_str_arg string as text sequence */ - ctf_sequence_text( - char, /* element C type */ - half_my_str_arg_field, /* field name */ - my_str_arg, /* argument expression */ - size_t, /* length expression C type */ - strlen(my_str_arg) / 2 /* length expression */ - ) - ) -) -~~~ - -As you can see, having a custom argument expression for each field -makes tracepoints very flexible for tracing a user space C application. -This tracepoint definition is reused later in this guide, when -actually using tracepoints in a user space application. diff --git a/contents/using-lttng/instrumenting/c-application/intro.md b/contents/using-lttng/instrumenting/c-application/intro.md deleted file mode 100644 index 24858ce..0000000 --- a/contents/using-lttng/instrumenting/c-application/intro.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: c-application ---- - -Instrumenting a C (or C++) application, be it an executable program or -a library, implies using LTTng-UST, the -user space tracing component of LTTng. For C/C++ applications, the -LTTng-UST package includes a dynamically loaded library -(`liblttng-ust`), C headers and the `lttng-gen-tp` command line utility. - -Since C and C++ are the base languages of virtually all other -programming languages -(Java virtual machine, Python, Perl, PHP and Node.js interpreters, to -name a few), implementing user space tracing for an unsupported language -is just a matter of using the LTTng-UST C API at the right places. - -The usual work flow to instrument a user space C application with -LTTng-UST is: - - 1. Define tracepoints (actual probes) - 2. Write tracepoint providers - 3. Insert tracepoints into target source code - 4. Package (build) tracepoint providers - 5. Build user application and link it with tracepoint providers - -The steps above are discussed in greater detail in the following -subsections. diff --git a/contents/using-lttng/instrumenting/c-application/lttng-gen-tp.md b/contents/using-lttng/instrumenting/c-application/lttng-gen-tp.md deleted file mode 100644 index cc52ec6..0000000 --- a/contents/using-lttng/instrumenting/c-application/lttng-gen-tp.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: lttng-gen-tp ---- - -LTTng-UST ships with `lttng-gen-tp`, a handy command line utility for -generating most of the stuff discussed above. It takes a _template file_, -with a name usually ending with the `.tp` extension, containing only -tracepoint definitions, and outputs a tracepoint provider (either a C -source file or a precompiled object file) with its header file. - -`lttng-gen-tp` should suffice in [static linking](#doc-static-linking) -situations. When using it, write a template file containing a list of -`TRACEPOINT_EVENT()` macro calls. The tool finds the provider names -used and generate the appropriate files which are going to look a lot -like `tp.h` and `tp.c` above. - -Just call `lttng-gen-tp` like this: - -
-lttng-gen-tp my-template.tp
-
- -`my-template.c`, `my-template.o` and `my-template.h` are created -in the same directory. - -You may specify custom C flags passed to the compiler invoked by -`lttng-gen-tp` using the `CFLAGS` environment variable: - -
-CFLAGS=-I/custom/include/path lttng-gen-tp my-template.tp
-
- -For more information on `lttng-gen-tp`, see -its man page. diff --git a/contents/using-lttng/instrumenting/c-application/lttng-ust-environment-variables-compiler-flags.md b/contents/using-lttng/instrumenting/c-application/lttng-ust-environment-variables-compiler-flags.md deleted file mode 100644 index d64662d..0000000 --- a/contents/using-lttng/instrumenting/c-application/lttng-ust-environment-variables-compiler-flags.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: lttng-ust-environment-variables-compiler-flags ---- - -A few special environment variables and compile flags may affect the -behavior of LTTng-UST. - -LTTng-UST's debugging can be activated by setting the environment -variable `LTTNG_UST_DEBUG` to `1` when launching the application. It -can also be enabled at compile time by defining `LTTNG_UST_DEBUG` when -compiling LTTng-UST (using the `-DLTTNG_UST_DEBUG` compiler option). - -The environment variable `LTTNG_UST_REGISTER_TIMEOUT` can be used to -specify how long the application should wait for the -[session daemon](#doc-lttng-sessiond)'s _registration done_ command -before proceeding to execute the main program. The timeout value is -specified in milliseconds. 0 means _don't wait_. -1 means -_wait forever_. Setting this environment variable to 0 is recommended -for applications with time contraints on the process startup time. - -The default value of `LTTNG_UST_REGISTER_TIMEOUT` (when not defined) -is **3000 ms**. - -The compilation definition `LTTNG_UST_DEBUG_VALGRIND` should be enabled -at build time (`-DLTTNG_UST_DEBUG_VALGRIND`) to allow `liblttng-ust` -to be used with Valgrind. -The side effect of defining `LTTNG_UST_DEBUG_VALGRIND` is that per-CPU -buffering is disabled. diff --git a/contents/using-lttng/instrumenting/c-application/probing-the-application-source-code.md b/contents/using-lttng/instrumenting/c-application/probing-the-application-source-code.md deleted file mode 100644 index 95830a3..0000000 --- a/contents/using-lttng/instrumenting/c-application/probing-the-application-source-code.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -id: probing-the-application-source-code ---- - -Once tracepoints are properly defined within a tracepoint provider, -they may be inserted into the user application to be instrumented -using the `tracepoint()` macro. Its first argument is the tracepoint -provider name and its second is the tracepoint name. The next, optional -arguments are defined by the `TP_ARGS()` part of the definition of -the tracepoint to use. - -As an example, let us again take the following tracepoint definition: - -~~~ c -TRACEPOINT_EVENT( - /* tracepoint provider name */ - my_provider, - - /* tracepoint/event name */ - my_first_tracepoint, - - /* list of tracepoint arguments */ - TP_ARGS( - int, my_integer_arg, - char*, my_string_arg - ), - - /* list of fields of eventual event */ - TP_FIELDS( - ctf_string(my_string_field, my_string_arg) - ctf_integer(int, my_integer_field, my_integer_arg) - ) -) -~~~ - -Assuming this is part of a file named `tp.h` which defines the tracepoint -provider and which is included by `tp.c`, here's a complete C application -calling this tracepoint (multiple times): - -~~~ c -#define TRACEPOINT_DEFINE -#include "tp.h" - -int main(int argc, char* argv[]) -{ - int i; - - tracepoint(my_provider, my_first_tracepoint, 23, "Hello, World!"); - - for (i = 0; i < argc; ++i) { - tracepoint(my_provider, my_first_tracepoint, i, argv[i]); - } - - return 0; -} -~~~ - -For each tracepoint provider, `TRACEPOINT_DEFINE` must be defined into -exactly one translation unit (C source file) of the user application, -before including the tracepoint provider header file. In other words, -for a given tracepoint provider, you cannot define `TRACEPOINT_DEFINE`, -and then include its header file in two separate C source files of -the same application. `TRACEPOINT_DEFINE` is discussed further in -[Building/linking tracepoint providers and the user application](#doc-building-tracepoint-providers-and-user-application). - -As another example, remember this definition we wrote in a previous -section (comments are stripped): - -~~~ c -/* for struct stat */ -#include -#include -#include - -TRACEPOINT_EVENT( - my_provider, - my_tracepoint, - TP_ARGS( - int, my_int_arg, - char*, my_str_arg, - struct stat*, st - ), - TP_FIELDS( - ctf_integer(int, my_constant_field, 23 + 17) - ctf_integer(int, my_int_arg_field, my_int_arg) - ctf_integer(int, my_int_arg_field2, my_int_arg * my_int_arg) - ctf_integer(int, sum4_field, my_str_arg[0] + my_str_arg[1] + - my_str_arg[2] + my_str_arg[3]) - ctf_string(my_str_arg_field, my_str_arg) - ctf_integer_hex(off_t, size_field, st->st_size) - ctf_float(double, size_dbl_field, (double) st->st_size) - ctf_sequence_text(char, half_my_str_arg_field, my_str_arg, - size_t, strlen(my_str_arg) / 2) - ) -) -~~~ - -Here's an example of calling it: - -~~~ c -#define TRACEPOINT_DEFINE -#include "tp.h" - -int main(void) -{ - struct stat s; - - stat("/etc/fstab", &s); - - tracepoint(my_provider, my_tracepoint, 23, "Hello, World!", &s); - - return 0; -} -~~~ - -When viewing the trace, assuming the file size of `/etc/fstab` is -301 bytes, the event generated by the execution of this tracepoint -should have the following fields, in this order: - -~~~ text -my_constant_field 40 -my_int_arg_field 23 -my_int_arg_field2 529 -sum4_field 389 -my_str_arg_field "Hello, World!" -size_field 0x12d -size_dbl_field 301.0 -half_my_str_arg_field "Hello," -~~~ diff --git a/contents/using-lttng/instrumenting/c-application/tracef.md b/contents/using-lttng/instrumenting/c-application/tracef.md deleted file mode 100644 index 1ec93c2..0000000 --- a/contents/using-lttng/instrumenting/c-application/tracef.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -id: tracef -since: 2.5 ---- - -`tracef()` is a small LTTng-UST API to avoid defining your own -tracepoints and tracepoint providers. The signature of `tracef()` is -the same as `printf()`'s. - -The `tracef()` utility function was developed to make user space tracing -super simple, albeit with notable disadvantages compared to custom, -full-fledged tracepoint providers: - - * All generated events have the same provider/event names, respectively - `lttng_ust_tracef` and `event`. - * There's no static type checking. - * The only event field you actually get, named `msg`, is a string - potentially containing the values you passed to the function - using your own format. This also means that you cannot use filtering - using a custom expression at runtime because there are no isolated - fields. - * Since `tracef()` uses C standard library's `vasprintf()` function - in the background to format the strings at runtime, its - expected performance is lower than using custom tracepoint providers - with typed fields, which do not require a conversion to a string. - -Thus, `tracef()` is useful for quick prototyping and debugging, but -should not be considered for any permanent/serious application -instrumentation. - -To use `tracef()`, first include `` in the C source file -where you need to insert probes: - -~~~ c -#include -~~~ - -Use `tracef()` like you would use `printf()` in your source code, for -example: - -~~~ c - /* ... */ - - tracef("my message, my integer: %d", my_integer); - - /* ... */ -~~~ - -Link your application with `liblttng-ust`: - -
-gcc -o app app.c -llttng-ust
-
- -Execute the application as usual: - -
-./app
-
- -Voilà! Use the `lttng` command line tool to -[control tracing](#doc-controlling-tracing). You can enable `tracef()` -events like this: - -
-lttng enable-event --userspace 'lttng_ust_tracef:*'
-
diff --git a/contents/using-lttng/instrumenting/c-application/tracelog.md b/contents/using-lttng/instrumenting/c-application/tracelog.md deleted file mode 100644 index c99b31b..0000000 --- a/contents/using-lttng/instrumenting/c-application/tracelog.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: tracelog -since: 2.7 ---- - -The `tracelog()` API is very similar to [`tracef()`](#doc-tracef). The -only difference is that it accepts an additional log level parameter. - -The goal of `tracelog()` is to ease the migration from logging to -tracing. - -Here's an example: - -~~~ c -#include - -void my_function(int my_integer) { - /* ... */ - - tracelog(TRACE_INFO, "my message, my integer: %d", my_integer); - - /* ... */ -} -~~~ - -See [LTTng-UST library reference](#doc-liblttng-ust-tracepoint-loglevel) -for the list of available log level names. - -Link your application with `liblttng-ust`: - -
-gcc -o app app.c -llttng-ust
-
- -Execute the application as usual: - -
-./app
-
- -The events produced by `tracelog()` calls are prefixed with -`lttng_ust_tracelog:`. To enable `tracelog()` events matching a range -of log levels, do: - -
-lttng enable-event --userspace 'lttng_ust_tracelog:*' \
-                   --loglevel TRACE_INFO
-
- -This enables all `tracelog()` events with a log level at least as important -as `TRACE_INFO`. - -To enable `tracelog()` events matching a specific log level, do: - -
-lttng enable-event --userspace 'lttng_ust_tracelog:*' \
-                   --loglevel-only TRACE_WARNING
-
- -See [Enabling and disabling events](#doc-enabling-disabling-events) for -more options. diff --git a/contents/using-lttng/instrumenting/c-application/tracepoint-provider.md b/contents/using-lttng/instrumenting/c-application/tracepoint-provider.md deleted file mode 100644 index ce59741..0000000 --- a/contents/using-lttng/instrumenting/c-application/tracepoint-provider.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -id: tracepoint-provider ---- - -Before jumping into defining tracepoints and inserting -them into the application source code, you must understand what a -_tracepoint provider_ is. - -For the sake of this guide, consider the following two files: - -`tp.h`: - -~~~ c -#undef TRACEPOINT_PROVIDER -#define TRACEPOINT_PROVIDER my_provider - -#undef TRACEPOINT_INCLUDE -#define TRACEPOINT_INCLUDE "./tp.h" - -#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) -#define _TP_H - -#include - -TRACEPOINT_EVENT( - my_provider, - my_first_tracepoint, - TP_ARGS( - int, my_integer_arg, - char*, my_string_arg - ), - TP_FIELDS( - ctf_string(my_string_field, my_string_arg) - ctf_integer(int, my_integer_field, my_integer_arg) - ) -) - -TRACEPOINT_EVENT( - my_provider, - my_other_tracepoint, - TP_ARGS( - int, my_int - ), - TP_FIELDS( - ctf_integer(int, some_field, my_int) - ) -) - -#endif /* _TP_H */ - -#include -~~~ - -`tp.c`: - -~~~ c -#define TRACEPOINT_CREATE_PROBES - -#include "tp.h" -~~~ - -The two files above are defining a _tracepoint provider_. A tracepoint -provider is some sort of namespace for _tracepoint definitions_. Tracepoint -definitions are written above with the `TRACEPOINT_EVENT()` macro, and allow -eventual `tracepoint()` calls respecting their definitions to be inserted -into the user application's C source code (we explore this in a -later section). - -Many tracepoint definitions may be part of the same tracepoint provider -and many tracepoint providers may coexist in a user space application. A -tracepoint provider is packaged either: - - * directly into an existing user application's C source file - * as an object file - * as a static library - * as a shared library - -The two files above, `tp.h` and `tp.c`, show a typical template for -writing a tracepoint provider. LTTng-UST was designed so that two -tracepoint providers should not be defined in the same header file. - -We will now go through the various parts of the above files and -give them a meaning. As you may have noticed, the LTTng-UST API for -C/C++ applications is some preprocessor sorcery. The LTTng-UST macros -used in your application and those in the LTTng-UST headers are -combined to produce actual source code needed to make tracing possible -using LTTng. - -Let's start with the header file, `tp.h`. It begins with - -~~~ c -#undef TRACEPOINT_PROVIDER -#define TRACEPOINT_PROVIDER my_provider -~~~ - -`TRACEPOINT_PROVIDER` defines the name of the provider to which the -following tracepoint definitions belong. It is used internally by -LTTng-UST headers and _must_ be defined. Since `TRACEPOINT_PROVIDER` -could have been defined by another header file also included by the same -C source file, the best practice is to undefine it first. - -
-

Note:Names in LTTng-UST follow the C -identifier syntax (starting with a letter and containing either -letters, numbers or underscores); they are not C strings -(not surrounded by double quotes). This is because LTTng-UST macros -use those identifier-like strings to create symbols (named types and -variables).

-
- -The tracepoint provider is a group of tracepoint definitions; its chosen -name should reflect this. A hierarchy like Java packages is recommended, -using underscores instead of dots, for example, -`org_company_project_component`. - -Next is `TRACEPOINT_INCLUDE`: - -~~~ c -#undef TRACEPOINT_INCLUDE -#define TRACEPOINT_INCLUDE "./tp.h" -~~~ - -This little bit of instrospection is needed by LTTng-UST to include -your header at various predefined places. - -Include guard follows: - -~~~ c -#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) -#define _TP_H -~~~ - -Add these precompiler conditionals to ensure the tracepoint event -generation can include this file more than once. - -The `TRACEPOINT_EVENT()` macro is defined in a LTTng-UST header file which -must be included: - -~~~ c -#include -~~~ - -This also allows the application to use the `tracepoint()` macro. - -Next is a list of `TRACEPOINT_EVENT()` macro calls which create the -actual tracepoint definitions. We skip this for the moment and -come back to how to use `TRACEPOINT_EVENT()` -[in a later section](#doc-defining-tracepoints). Just pay attention to -the first argument: it's always the name of the tracepoint provider -being defined in this header file. - -End of include guard: - -~~~ c -#endif /* _TP_H */ -~~~ - -Finally, include `` to expand the macros: - -~~~ c -#include -~~~ - -That's it for `tp.h`. Of course, this is only a header file; it must be -included in some C source file to actually use it. This is the job of -`tp.c`: - -~~~ c -#define TRACEPOINT_CREATE_PROBES - -#include "tp.h" -~~~ - -When `TRACEPOINT_CREATE_PROBES` is defined, the macros used in `tp.h`, -which is included just after, actually create the source code for -LTTng-UST probes (global data structures and functions) out of your -tracepoint definitions. How exactly this is done is out of this text's scope. -`TRACEPOINT_CREATE_PROBES` is discussed further -in [Building/linking tracepoint providers and the user application](#doc-building-tracepoint-providers-and-user-application). - -You could include other header files like `tp.h` here to create the probes -of different tracepoint providers, for example: - -~~~ c -#define TRACEPOINT_CREATE_PROBES - -#include "tp1.h" -#include "tp2.h" -~~~ - -The rule is: probes of a given tracepoint provider -must be created in exactly one source file. This source file could be one -of your project's; it doesn't have to be on its own like `tp.c`, although -[a later section](#doc-building-tracepoint-providers-and-user-application) -shows that doing so allows packaging the tracepoint providers -independently and keep them out of your application, also making it -possible to reuse them between projects. - -The following sections explain how to define tracepoints, how to use the -`tracepoint()` macro to instrument your user space C application and how -to build/link tracepoint providers and your application with LTTng-UST -support. diff --git a/contents/using-lttng/instrumenting/c-application/using-tracepoint-classes.md b/contents/using-lttng/instrumenting/c-application/using-tracepoint-classes.md deleted file mode 100644 index b6d4fc3..0000000 --- a/contents/using-lttng/instrumenting/c-application/using-tracepoint-classes.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -id: using-tracepoint-classes ---- - -In LTTng-UST, a _tracepoint class_ is a class of tracepoints sharing the -same field types and names. A _tracepoint instance_ is one instance of -such a declared tracepoint class, with its own event name and tracepoint -provider name. - -What is documented in [Defining tracepoints](#doc-defining-tracepoints) -is actually how to declare a _tracepoint class_ and define a -_tracepoint instance_ at the same time. Without revealing the internals -of LTTng-UST too much, it has to be noted that one serialization -function is created for each tracepoint class. A serialization -function is responsible for serializing the fields of a tracepoint -into a sub-buffer when tracing. For various performance reasons, when -your situation requires multiple tracepoints with different names, but -with the same fields layout, the best practice is to manually create -a tracepoint class and instantiate as many tracepoint instances as -needed. One positive effect of such a design, amongst other advantages, -is that all tracepoint instances of the same tracepoint class -reuse the same serialization function, thus reducing cache pollution. - -As an example, here are three tracepoint definitions as we know them: - -~~~ c -TRACEPOINT_EVENT( - my_app, - get_account, - TP_ARGS( - int, userid, - size_t, len - ), - TP_FIELDS( - ctf_integer(int, userid, userid) - ctf_integer(size_t, len, len) - ) -) - -TRACEPOINT_EVENT( - my_app, - get_settings, - TP_ARGS( - int, userid, - size_t, len - ), - TP_FIELDS( - ctf_integer(int, userid, userid) - ctf_integer(size_t, len, len) - ) -) - -TRACEPOINT_EVENT( - my_app, - get_transaction, - TP_ARGS( - int, userid, - size_t, len - ), - TP_FIELDS( - ctf_integer(int, userid, userid) - ctf_integer(size_t, len, len) - ) -) -~~~ - -In this case, three tracepoint classes are created, with one tracepoint -instance for each of them: `get_account`, `get_settings` and -`get_transaction`. However, they all share the same field names and -types. Declaring one tracepoint class and three tracepoint instances of -the latter is a better design choice: - -~~~ c -/* the tracepoint class */ -TRACEPOINT_EVENT_CLASS( - /* tracepoint provider name */ - my_app, - - /* tracepoint class name */ - my_class, - - /* arguments */ - TP_ARGS( - int, userid, - size_t, len - ), - - /* fields */ - TP_FIELDS( - ctf_integer(int, userid, userid) - ctf_integer(size_t, len, len) - ) -) - -/* the tracepoint instances */ -TRACEPOINT_EVENT_INSTANCE( - /* tracepoint provider name */ - my_app, - - /* tracepoint class name */ - my_class, - - /* tracepoint/event name */ - get_account, - - /* arguments */ - TP_ARGS( - int, userid, - size_t, len - ) -) -TRACEPOINT_EVENT_INSTANCE( - my_app, - my_class, - get_settings, - TP_ARGS( - int, userid, - size_t, len - ) -) -TRACEPOINT_EVENT_INSTANCE( - my_app, - my_class, - get_transaction, - TP_ARGS( - int, userid, - size_t, len - ) -) -~~~ - -Of course, all those names and `TP_ARGS()` invocations are redundant, -but some C preprocessor magic can solve this: - -~~~ c -#define MY_TRACEPOINT_ARGS \ - TP_ARGS( \ - int, userid, \ - size_t, len \ - ) - -TRACEPOINT_EVENT_CLASS( - my_app, - my_class, - MY_TRACEPOINT_ARGS, - TP_FIELDS( - ctf_integer(int, userid, userid) - ctf_integer(size_t, len, len) - ) -) - -#define MY_APP_TRACEPOINT_INSTANCE(name) \ - TRACEPOINT_EVENT_INSTANCE( \ - my_app, \ - my_class, \ - name, \ - MY_TRACEPOINT_ARGS \ - ) - -MY_APP_TRACEPOINT_INSTANCE(get_account) -MY_APP_TRACEPOINT_INSTANCE(get_settings) -MY_APP_TRACEPOINT_INSTANCE(get_transaction) -~~~ diff --git a/contents/using-lttng/instrumenting/cxx-application.md b/contents/using-lttng/instrumenting/cxx-application.md deleted file mode 100644 index 786388c..0000000 --- a/contents/using-lttng/instrumenting/cxx-application.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: cxx-application ---- - -Because of C++'s cross-compatibility with the C language, C++ -applications can be readily instrumented with the LTTng-UST C API. - -Follow the [C application](#doc-c-application) user guide above. It -should be noted that, in this case, tracepoint providers should have -the typical `.cpp`, `.cxx` or `.cc` extension and be built with `g++` -instead of `gcc`. This is the easiest way of avoiding linking errors -due to symbol name mangling incompatibilities between both languages. diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/instrumenting-linux-kernel-tracing.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/instrumenting-linux-kernel-tracing.md deleted file mode 100644 index 881c013..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/instrumenting-linux-kernel-tracing.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -id: instrumenting-linux-kernel-tracing ---- - -The [Controlling tracing](#doc-controlling-tracing) section explains -how to use the `lttng` tool to create and control tracing sessions. -Although the `lttng` tool loads the appropriate _known_ LTTng kernel -modules when needed (by launching `root`'s session daemon), it won't -load your custom `lttng-probe-hello` module by default. You need to -manually start an LTTng session daemon as `root` and use the -`--extra-kmod-probes` option to append your custom probe module to the -default list: - -
-sudo pkill -u root lttng-sessiond
-sudo lttng-sessiond --extra-kmod-probes=hello
-
- -The first command makes sure any existing instance is killed. If -you're not interested in using the default probes, or if you only -want to use a few of them, you could use `--kmod-probes` instead, -which specifies an absolute list: - -
-sudo lttng-sessiond --kmod-probes=hello,ext4,net,block,signal,sched
-
- -Confirm the custom probe module is loaded: - -
-lsmod | grep lttng_probe_hello
-
- -The `hello_world` event should appear in the list when doing - -
-lttng list --kernel | grep hello
-
- -You may now create an LTTng tracing session, enable the `hello_world` -kernel event (and others if you wish) and start tracing: - -
-sudo lttng create my-session
-sudo lttng enable-event --kernel hello_world
-sudo lttng start
-
- -Plug a few USB devices, then stop tracing and inspect the trace (if -Babeltrace -is installed): - -
-sudo lttng stop
-sudo lttng view
-
- -Here's a sample output: - -~~~ text -[15:30:34.835895035] (+?.?????????) hostname hello_world: { cpu_id = 1 }, { my_int = 8, char0 = 68, char1 = 97, product = "DataTraveler 2.0" } -[15:30:42.262781421] (+7.426886386) hostname hello_world: { cpu_id = 1 }, { my_int = 9, char0 = 80, char1 = 97, product = "Patriot Memory" } -[15:30:48.175621778] (+5.912840357) hostname hello_world: { cpu_id = 1 }, { my_int = 10, char0 = 68, char1 = 97, product = "DataTraveler 2.0" } -~~~ - -Two USB flash drives were used for this test. - -You may change your LTTng custom probe, rebuild it and reload it at -any time when not tracing. Make sure you remove the old module -(either by killing the root LTTng session daemon which loaded the -module in the first place, or by using `modprobe --remove` directly) -before loading the updated one. diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/intro.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/intro.md deleted file mode 100644 index e5fc82f..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/intro.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -id: instrumenting-linux-kernel-itself ---- - -This section explains strictly how to add custom LTTng -instrumentation to the Linux kernel. It does not explain how the -macros actually work and the internal mechanics of the tracer. - -You should have a Linux kernel source code tree to work with. -Throughout this section, all file paths are relative to the root of -this tree unless otherwise stated. - -You need a copy of the LTTng-modules Git repository: - -
-git clone git://git.lttng.org/lttng-modules.git
-
- -The steps to add custom LTTng instrumentation to a Linux kernel -involves defining and using the mainline `TRACE_EVENT()` tracepoints -first, then writing and using the LTTng adaptation layer. diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-adaptation-layer.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-adaptation-layer.md deleted file mode 100644 index 5adc088..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-adaptation-layer.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -id: lttng-adaptation-layer ---- - -The steps to write the LTTng adaptation layer are, in your -LTTng-modules copy's source code tree: - - 1. In `instrumentation/events/lttng-module`, - add a header subsys.h for your custom - subsystem subsys and write your - tracepoint definitions using LTTng-modules macros in it. - Those macros look like the mainline kernel equivalents, - but they present subtle, yet important differences. - 2. In `probes`, create the C source file of the LTTng probe kernel - module for your subsystem. It should be named - lttng-probe-subsys.c. - 3. Edit `probes/Makefile` so that the LTTng-modules project - builds your custom LTTng probe kernel module. - 4. Build and install LTTng kernel modules. - -Following our `hello_world` event example, here's the content of -`instrumentation/events/lttng-module/hello.h`: - -~~~ c -#undef TRACE_SYSTEM -#define TRACE_SYSTEM hello - -#if !defined(_TRACE_HELLO_H) || defined(TRACE_HEADER_MULTI_READ) -#define _TRACE_HELLO_H - -#include "../../../probes/lttng-tracepoint-event.h" -#include - -LTTNG_TRACEPOINT_EVENT( - /* format identical to mainline version for those */ - hello_world, - TP_PROTO(int foo, const char* bar), - TP_ARGS(foo, bar), - - /* possible differences */ - TP_STRUCT__entry( - __field(int, my_int) - __field(char, char0) - __field(char, char1) - __string(product, bar) - ), - - /* notice the use of tp_assign()/tp_strcpy() and no semicolons */ - TP_fast_assign( - tp_assign(my_int, foo) - tp_assign(char0, bar[0]) - tp_assign(char1, bar[1]) - tp_strcpy(product, bar) - ), - - /* This one is actually not used by LTTng either, but must be - * present for the moment. - */ - TP_printk("", 0) - -/* no semicolon after this either */ -) - -#endif - -/* other difference: do NOT include */ -#include "../../../probes/define_trace.h" -~~~ - -Some possible entries for `TP_STRUCT__entry()` and `TP_fast_assign()`, -in the case of LTTng-modules, are shown in the -[LTTng-modules reference](#doc-lttng-modules-ref) section. - -You may also be interested in using the -[`LTTNG_TRACEPOINT_EVENT_CODE()` macro](#doc-lttng-tracepoint-event-code), -instead of using `LTTNG_TRACEPOINT_EVENT()`, which allows custom local -variables and C code to be executed before the event fields are recorded. - -The best way to learn how to use the above macros is to inspect -existing LTTng tracepoint definitions in `instrumentation/events/lttng-module` -header files. Compare them with the Linux kernel mainline versions -in `include/trace/events`. - -The next step is writing the LTTng probe kernel module C source file. -This one is named lttng-probe-subsys.c -in `probes`. You may always use the following template: - -~~~ c -#include -#include "../lttng-tracer.h" - -/* Build time verification of mismatch between mainline TRACE_EVENT() - * arguments and LTTng adaptation layer LTTNG_TRACEPOINT_EVENT() arguments. - */ -#include - -/* create LTTng tracepoint probes */ -#define LTTNG_PACKAGE_BUILD -#define CREATE_TRACE_POINTS -#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module - -#include "../instrumentation/events/lttng-module/hello.h" - -MODULE_LICENSE("GPL and additional rights"); -MODULE_AUTHOR("Your name "); -MODULE_DESCRIPTION("LTTng hello probes"); -MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." - __stringify(LTTNG_MODULES_MINOR_VERSION) "." - __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) - LTTNG_MODULES_EXTRAVERSION); -~~~ - -Just replace `hello` with your subsystem name. In this example, -``, which is the original mainline tracepoint -definition header, is included for verification purposes: the -LTTng-modules build system is able to emit an error at build time when -the arguments of the mainline `TRACE_EVENT()` definitions do not match -the ones of the LTTng-modules adaptation layer -(`LTTNG_TRACEPOINT_EVENT()`). - -Edit `probes/Makefile` and add your new kernel module object -next to existing ones: - -~~~ makefile -# ... - -obj-m += lttng-probe-module.o -obj-m += lttng-probe-power.o - -obj-m += lttng-probe-hello.o - -# ... -~~~ - -Time to build! Point to your custom Linux kernel source tree using -the `KERNELDIR` variable: - -
-make KERNELDIR=/path/to/custom/linux
-
- -Finally, install modules: - -
-sudo make modules_install
-
diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-tracepoint-event-code.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-tracepoint-event-code.md deleted file mode 100644 index d4aeae8..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/lttng-tracepoint-event-code.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -id: lttng-tracepoint-event-code -since: 2.7 ---- - -Although it is recommended to always use the -[`LTTNG_TRACEPOINT_EVENT()`](#doc-lttng-adaptation-layer) -macro to describe the arguments and fields of an LTTng tracepoint when -possible, sometimes a more complex process is needed to access the data -to be recorded as tracepoint fields. In other words, local variables -and multiple C statements are required instead of simple argument-based -expressions passed to the -[`ctf_*()` macros of `TP_FIELDS()`](#doc-lttng-modules-tp-fields). - -The `LTTNG_TRACEPOINT_EVENT_CODE()` macro can be used instead of -`LTTNG_TRACEPOINT_EVENT()` to declare custom local variables and -define a block of C code to be executed before the fields are -recorded. The structure of this macro is: - -~~~ c -LTTNG_TRACEPOINT_EVENT_CODE( - /* format identical to LTTNG_TRACEPOINT_EVENT() version for those */ - hello_world, - TP_PROTO(int foo, const char *bar), - TP_ARGS(foo, bar), - - /* declarations of custom local variables */ - TP_locvar( - int a = 0; - unsigned long b = 0; - const char *name = "(undefined)"; - struct my_struct *my_struct; - ), - - /* - * Custom code using which use both tracepoint arguments - * (in TP_ARGS()) and local variables (in TP_locvar()). - * - * Local variables are actually members of a structure pointed - * to by the special variable tp_locvar. - */ - TP_code( - if (foo) { - tp_locvar->a = foo + 17; - tp_locvar->my_struct = get_my_struct_at(tp_locvar->a); - tp_locvar->b = my_struct_compute_b(tp_locvar->my_struct); - tp_locvar->name = my_struct_get_name(tp_locvar->my_struct); - put_my_struct(tp_locvar->my_struct); - - if (tp_locvar->b) { - tp_locvar->a = 1; - } - } - ), - - /* - * Format identical to LTTNG_TRACEPOINT_EVENT() version for this, - * except that tp_locvar members can be used in the argument - * expression parameters of the ctf_*() macros. - */ - TP_FIELDS( - ctf_integer(unsigned long, my_struct_b, tp_locvar->b) - ctf_integer(int, my_struct_a, tp_locvar->a) - ctf_string(bar_field, bar) - ctf_string(my_struct_name, tp_locvar->name) - ) -) -~~~ - -Make sure that the C code defined in `TP_code()` has no side effects -when executed. In particular, the code should not allocate memory or get -resources without deallocating this memory or putting those resources -afterwards. diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/mainline-trace-event.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/mainline-trace-event.md deleted file mode 100644 index 58979e9..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-linux-kernel-itself/mainline-trace-event.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -id: mainline-trace-event ---- - -The first step is to define tracepoints using the mainline Linux -`TRACE_EVENT()` macro and insert tracepoints where you want them. -Your tracepoint definitions reside in a header file in -`include/trace/events`. If you're adding tracepoints to an existing -subsystem, edit its appropriate header file. - -As an example, the following header file (let's call it -`include/trace/events/hello.h`) defines one tracepoint using -`TRACE_EVENT()`: - -~~~ c -/* subsystem name is "hello" */ -#undef TRACE_SYSTEM -#define TRACE_SYSTEM hello - -#if !defined(_TRACE_HELLO_H) || defined(TRACE_HEADER_MULTI_READ) -#define _TRACE_HELLO_H - -#include - -TRACE_EVENT( - /* "hello" is the subsystem name, "world" is the event name */ - hello_world, - - /* tracepoint function prototype */ - TP_PROTO(int foo, const char* bar), - - /* arguments for this tracepoint */ - TP_ARGS(foo, bar), - - /* LTTng doesn't need those */ - TP_STRUCT__entry(), - TP_fast_assign(), - TP_printk("", 0) -); - -#endif - -/* this part must be outside protection */ -#include -~~~ - -Notice that we don't use any of the last three arguments: they -are left empty here because LTTng doesn't need them. You would only fill -`TP_STRUCT__entry()`, `TP_fast_assign()` and `TP_printk()` if you were -to also use this tracepoint for ftrace/perf. - -Once this is done, you may place calls to `trace_hello_world()` -wherever you want in the Linux source code. As an example, let us place -such a tracepoint in the `usb_probe_device()` static function -(`drivers/usb/core/driver.c`): - -~~~ c -/* called from driver core with dev locked */ -static int usb_probe_device(struct device *dev) -{ - struct usb_device_driver *udriver = to_usb_device_driver(dev->driver); - struct usb_device *udev = to_usb_device(dev); - int error = 0; - - trace_hello_world(udev->devnum, udev->product); - - /* ... */ -} -~~~ - -This tracepoint should fire every time a USB device is plugged in. - -At the top of `driver.c`, we need to include our actual tracepoint -definition and, in this case (one place per subsystem), define -`CREATE_TRACE_POINTS`, which creates our tracepoint: - -~~~ c -/* ... */ - -#include "usb.h" - -#define CREATE_TRACE_POINTS -#include - -/* ... */ -~~~ - -Build your custom Linux kernel. In order to use LTTng, make sure the -following kernel configuration options are enabled: - - * `CONFIG_MODULES` (loadable module support) - * `CONFIG_KALLSYMS` (load all symbols for debugging/kksymoops) - * `CONFIG_HIGH_RES_TIMERS` (high resolution timer support) - * `CONFIG_TRACEPOINTS` (kernel tracepoint instrumentation) - -Boot the custom kernel. The directory -`/sys/kernel/debug/tracing/events/hello` should exist if everything -went right, with a `hello_world` subdirectory. diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-out-of-tree-linux-kernel.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-out-of-tree-linux-kernel.md deleted file mode 100644 index 2eecabd..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/instrumenting-out-of-tree-linux-kernel.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: instrumenting-out-of-tree-linux-kernel ---- - -Instrumenting a custom Linux kernel module for LTTng follows the exact -same steps as -[adding instrumentation to the Linux kernel itself](#doc-instrumenting-linux-kernel-itself), -the only difference being that your mainline tracepoint definition -header doesn't reside in the mainline source tree, but in your -kernel module source tree. - -The only reference to this mainline header is in the LTTng custom -probe's source code (`probes/lttng-probe-hello.c` in our example), for -build time verification: - -~~~ c -/* ... */ - -/* Build time verification of mismatch between mainline TRACE_EVENT() - * arguments and LTTng adaptation layer LTTNG_TRACEPOINT_EVENT() arguments. - */ -#include - -/* ... */ -~~~ - -The preferred, flexible way to include your module's mainline -tracepoint definition header is to put it in a specific directory -relative to your module's root (`tracepoints`, for example) and include it -relative to your module's root directory in the LTTng custom probe's -source: - -~~~ c -#include -~~~ - -You may then build LTTng-modules by adding your module's root -directory as an include path to the extra C flags: - -
-make ccflags-y=-I/path/to/kernel/module KERNELDIR=/path/to/custom/linux
-
- -Using `ccflags-y` allows you to move your kernel module to another -directory and rebuild the LTTng-modules project with no change to -source files. diff --git a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/intro.md b/contents/using-lttng/instrumenting/instrumenting-linux-kernel/intro.md deleted file mode 100644 index a6fbc6d..0000000 --- a/contents/using-lttng/instrumenting/instrumenting-linux-kernel/intro.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -id: instrumenting-linux-kernel ---- - -The Linux kernel can be instrumented for LTTng tracing, either its core -source code or a kernel module. It has to be noted that Linux is -readily traceable using LTTng since many parts of its source code are -already instrumented: this is the job of the upstream -LTTng-modules -package. This section presents how to add LTTng instrumentation where it -does not currently exist and how to instrument custom kernel modules. - -All LTTng instrumentation in the Linux kernel is based on an existing -infrastructure which bears the name of its main macro, `TRACE_EVENT()`. -This macro is used to define tracepoints, -each tracepoint having a name, usually with the -subsys_name format, -subsys being the subsystem name and -name the specific event name. - -Tracepoints defined with `TRACE_EVENT()` may be inserted anywhere in -the Linux kernel source code, after what callbacks, called _probes_, -may be registered to execute some action when a tracepoint is -executed. This mechanism is directly used by ftrace and perf, -but cannot be used as is by LTTng: an adaptation layer is added to -satisfy LTTng's specific needs. - -With that in mind, this documentation does not cover the `TRACE_EVENT()` -format and how to use it, but it is mandatory to understand it and use -it to instrument Linux for LTTng. A series of -LWN articles explain -`TRACE_EVENT()` in details: -part 1, -part 2, and -part 3. -Once you master `TRACE_EVENT()` enough for your use case, continue -reading this section so that you can add the LTTng adaptation layer of -instrumentation. - -This section first discusses the general method of instrumenting the -Linux kernel for LTTng. This method is then reused for the specific -case of instrumenting a kernel module. diff --git a/contents/using-lttng/instrumenting/intro.md b/contents/using-lttng/instrumenting/intro.md deleted file mode 100644 index a75227d..0000000 --- a/contents/using-lttng/instrumenting/intro.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: instrumenting ---- - -There are many examples of tracing and monitoring in our everyday life. -You have access to real-time and historical weather reports and forecasts -thanks to weather stations installed around the country. You know your -possibly hospitalized friends' and family's hearts are safe thanks to -electrocardiography. You make sure not to drive your car too fast -and have enough fuel to reach your destination thanks to gauges visible -on your dashboard. - -All the previous examples have something in common: they rely on -**probes**. Without electrodes attached to the surface of a body's -skin, cardiac monitoring would be futile. - -LTTng, as a tracer, is no different from the real life examples above. -If you're about to trace a software system or, put in other words, record its -history of execution, you better have probes in the subject you're -tracing: the actual software. Various ways were developed to do this. -The most straightforward one is to manually place probes, called -_tracepoints_, in the software's source code. The Linux kernel tracing -domain also allows probes added dynamically. - -If you're only interested in tracing the Linux kernel, it may very well -be that your tracing needs are already appropriately covered by LTTng's -built-in Linux kernel tracepoints and other probes. Or you may be in -possession of a user space application which has already been -instrumented. In such cases, the work resides entirely in the design -and execution of tracing sessions, allowing you to jump to -[Controlling tracing](#doc-controlling-tracing) right now. - -This section focuses on the following use cases of instrumentation: - - * [C](#doc-c-application) and [C++](#doc-cxx-application) applications - * [prebuilt user space tracing helpers](#doc-prebuilt-ust-helpers) - * [Java application](#doc-java-application) - * [Linux kernel](#doc-instrumenting-linux-kernel) module or the - kernel itself - * the [`/proc/lttng-logger` ABI](#doc-proc-lttng-logger-abi) - -Some [advanced techniques](#doc-advanced-instrumenting-techniques) are -also presented at the very end. diff --git a/contents/using-lttng/instrumenting/java-application/intro.md b/contents/using-lttng/instrumenting/java-application/intro.md deleted file mode 100644 index 91c28e8..0000000 --- a/contents/using-lttng/instrumenting/java-application/intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: java-application -since: 2.4 ---- - -LTTng-UST provides a _logging_ back-end for Java applications using -either -java.util.logging -(JUL) or -Apache log4j 1.2. -This back-end is called the _LTTng-UST Java agent_, and it is responsible -for the communications with an LTTng session daemon. - -From the user's point of view, once the LTTng-UST Java agent has been -initialized, JUL and log4j loggers may be created and used as usual. -The agent adds its own handler to the _root logger_, so that all -loggers may generate LTTng events with no effort. - -Common JUL/log4j features are supported using the `lttng` tool -(see [Controlling tracing](#doc-controlling-tracing)): - - * listing all logger names - * enabling/disabling events per logger name - * JUL/log4j log levels diff --git a/contents/using-lttng/instrumenting/java-application/jul.md b/contents/using-lttng/instrumenting/java-application/jul.md deleted file mode 100644 index 7f1e829..0000000 --- a/contents/using-lttng/instrumenting/java-application/jul.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: jul -since: 2.4 ---- - -Here's an example of tracing a Java application which is using -**`java.util.logging`**: - -~~~ java -import java.util.logging.Logger; -import org.lttng.ust.agent.LTTngAgent; - -public class Test -{ - private static final int answer = 42; - - public static void main(String[] argv) throws Exception - { - // create a logger - Logger logger = Logger.getLogger("jello"); - - // call this as soon as possible (before logging) - LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); - - // log at will! - logger.info("some info"); - logger.warning("some warning"); - Thread.sleep(500); - logger.finer("finer information; the answer is " + answer); - Thread.sleep(123); - logger.severe("error!"); - - // not mandatory, but cleaner - lttngAgent.dispose(); - } -} -~~~ - -The LTTng-UST Java agent is packaged in a JAR file named -`liblttng-ust-agent.jar` It is typically located in -`/usr/lib/lttng/java`. To compile the snippet above -(saved as `Test.java`), do: - -
-javac -cp /usr/lib/lttng/java/liblttng-ust-agent.jar Test.java
-
- -You can run the resulting compiled class like this: - -
-java -cp /usr/lib/lttng/java/liblttng-ust-agent.jar:. Test
-
- -
-

- Note:OpenJDK 7 - is used for development and continuous integration, thus this - version is directly supported. However, the LTTng-UST Java agent has - also been tested with OpenJDK 6. -

-
diff --git a/contents/using-lttng/instrumenting/java-application/log4j.md b/contents/using-lttng/instrumenting/java-application/log4j.md deleted file mode 100644 index 916fc08..0000000 --- a/contents/using-lttng/instrumenting/java-application/log4j.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: log4j -since: 2.6 ---- - -LTTng features an Apache log4j 1.2 agent, which means your existing -Java applications using log4j 1.2 for logging can record events to -LTTng traces with just a minor source code modification. - -
-

- Note:This version of LTTng does not - support Log4j 2. -

-
- -Here's an example: - -~~~ java -import org.apache.log4j.Logger; -import org.apache.log4j.BasicConfigurator; -import org.lttng.ust.agent.LTTngAgent; - -public class Test -{ - private static final int answer = 42; - - public static void main(String[] argv) throws Exception - { - // create and configure a logger - Logger logger = Logger.getLogger(Test.class); - BasicConfigurator.configure(); - - // call this as soon as possible (before logging) - LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); - - // log at will! - logger.info("some info"); - logger.warn("some warning"); - Thread.sleep(500); - logger.debug("debug information; the answer is " + answer); - Thread.sleep(123); - logger.error("error!"); - logger.fatal("fatal error!"); - - // not mandatory, but cleaner - lttngAgent.dispose(); - } -} -~~~ - -To compile the snippet above, do: - -
-javac -cp /usr/lib/lttng/java/liblttng-ust-agent.jar:$LOG4JCP Test.java
-
- -where `$LOG4JCP` is the log4j 1.2 JAR file path. - -You can run the resulting compiled class like this: - -
-java -cp /usr/lib/lttng/java/liblttng-ust-agent.jar:$LOG4JCP:. Test
-
diff --git a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/intro.md b/contents/using-lttng/instrumenting/prebuilt-ust-helpers/intro.md deleted file mode 100644 index eb780ba..0000000 --- a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/intro.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: prebuilt-ust-helpers ---- - -The LTTng-UST package provides a few helpers that one may find -useful in some situations. They all work the same way: you must -preload the appropriate shared object before running the user -application (using the `LD_PRELOAD` environment variable). - -The shared objects are normally found in `/usr/lib`. - -The current installed helpers are: - - * `liblttng-ust-libc-wrapper.so` and - `liblttng-ust-pthread-wrapper.so`: - [C standard library and POSIX threads tracing](#doc-liblttng-ust-libc-pthread-wrapper) - * `liblttng-ust-cyg-profile.so` and - `liblttng-ust-cyg-profile-fast.so`: - [function tracing](#doc-liblttng-ust-cyg-profile) - * `liblttng-ust-dl.so`: - [dynamic linker tracing](#doc-liblttng-ust-dl) - -The following subsections document what helpers instrument exactly -and how to use them. diff --git a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-cyg-profile.md b/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-cyg-profile.md deleted file mode 100644 index 61af565..0000000 --- a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-cyg-profile.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -id: liblttng-ust-cyg-profile ---- - -Function tracing is the recording of which functions are entered and -left during the execution of an application. Like with any LTTng event, -the precise time at which this happens is also kept. - -GCC and clang have an option named --finstrument-functions -which generates instrumentation calls for entry and exit to functions. -The LTTng-UST function tracing helpers, `liblttng-ust-cyg-profile.so` -and `liblttng-ust-cyg-profile-fast.so`, take advantage of this feature -to add instrumentation to the two generated functions (which contain -`cyg_profile` in their names, hence the shared object's name). - -In order to use LTTng-UST function tracing, the translation units to -instrument must be built using the `-finstrument-functions` compiler -flag. - -LTTng-UST function tracing comes in two flavors, each providing -different trade-offs: `liblttng-ust-cyg-profile-fast.so` and -`liblttng-ust-cyg-profile.so`. - -**`liblttng-ust-cyg-profile-fast.so`** is a lightweight variant that -should only be used where it can be _guaranteed_ that the complete event -stream is recorded without any missing events. Any kind of duplicate -information is left out. This version registers the following -tracepoints: - -
- - - - - - - - - - - - - - - - - - - -
TP provider nameTP nameDescription/fields
- lttng_ust_cyg_profile_fast - - func_entry - -

Function entry

- -
    -
  • - addr address of the - called function -
  • -
-
- func_exit - -

Function exit

-
-
- -Assuming no event is lost, having only the function addresses on entry -is enough for creating a call graph (remember that a recorded event -always contains the ID of the CPU that generated it). A tool like -addr2line -may be used to convert function addresses back to source files names -and line numbers. - -The other helper, -**`liblttng-ust-cyg-profile.so`**, -is a more robust variant which also works for use cases where -events might get discarded or not recorded from application startup. -In these cases, the trace analyzer needs extra information to be -able to reconstruct the program flow. This version registers the -following tracepoints: - -
- - - - - - - - - - - - - - - - - - - -
TP provider nameTP nameDescription/fields
- lttng_ust_cyg_profile - - func_entry - -

Function entry

- -
    -
  • - addr address of the - called function -
  • -
  • - call_site call site - address -
  • -
-
- func_exit - -

Function exit

- -
    -
  • - addr address of the - called function -
  • -
  • - call_site call site - address -
  • -
-
-
- -To use one or the other variant with any user application, assuming at -least one translation unit of the latter is compiled with the -`-finstrument-functions` option, do: - -
-LD_PRELOAD=liblttng-ust-cyg-profile-fast.so my-app
-
- -or - -
-LD_PRELOAD=liblttng-ust-cyg-profile.so my-app
-
- -It might be necessary to limit the number of source files where -`-finstrument-functions` is used to prevent excessive amount of trace -data to be generated at runtime. - -
-

- Tip: When using GCC, at least, you may use - the - -finstrument-functions-exclude-function-list - option to avoid instrumenting entries and exits of specific - symbol names. -

-
- -All events generated from LTTng-UST function tracing are provided on -log level `TRACE_DEBUG_FUNCTION`, which is useful to easily enable -function tracing events in your tracing session using the -`--loglevel-only` option of `lttng enable-event` -(see [Controlling tracing](#doc-controlling-tracing)). diff --git a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-dl.md b/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-dl.md deleted file mode 100644 index 625a752..0000000 --- a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-dl.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -id: liblttng-ust-dl -since: 2.4 ---- - -This LTTng-UST helper causes all calls to `dlopen()` and `dlclose()` -in the target application to be traced with LTTng. - -The helper's shared object, `liblttng-ust-dl.so`, registers the -following tracepoints when preloaded: - -
- - - - - - - - - - - - - - - - - - - -
TP provider nameTP nameDescription/fields
- lttng_ust_dl - - dlopen - -

dlopen() call

- -
    -
  • - baddr memory - base address - (where the dynamic linker placed the shared - object) -
  • -
  • - sopath file system - path to the loaded shared object -
  • -
  • - size file size - of the the loaded shared object -
  • -
  • - mtime last - modification time (seconds since Epoch time) - of the loaded shared object -
  • -
-
- dlclose - -

dlclose() call

- -
    -
  • - baddr memory - base address -
  • -
-
-
- -To use this LTTng-UST helper with any user application, independently of -how the latter is built, do: - -
-LD_PRELOAD=liblttng-ust-dl.so my-app
-
- -Of course, like any other tracepoint, the ones above need to be enabled -in order for LTTng-UST to generate events. This is done using the -`lttng` command line tool -(see [Controlling tracing](#doc-controlling-tracing)). diff --git a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-libc-pthread-wrapper.md b/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-libc-pthread-wrapper.md deleted file mode 100644 index c0c126c..0000000 --- a/contents/using-lttng/instrumenting/prebuilt-ust-helpers/liblttng-ust-libc-pthread-wrapper.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -id: liblttng-ust-libc-pthread-wrapper -since: 2.3 ---- - -`liblttng-ust-libc-wrapper.so` and `liblttng-ust-pthread-wrapper.so` -can add instrumentation to respectively some C standard library and -POSIX threads functions. - -The following functions are traceable by `liblttng-ust-libc-wrapper.so`: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TP provider nameTP nameInstrumented function
- lttng_ust_libc - - malloc - - malloc() -
- calloc - - calloc() -
- realloc - - realloc() -
- free - - free() -
- memalign - - memalign() -
- posix_memalign - - posix_memalign() -
-
- -The following functions are traceable by -`liblttng-ust-pthread-wrapper.so`: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
TP provider nameTP nameInstrumented function
- lttng_ust_pthread - - pthread_mutex_lock_req - - pthread_mutex_lock() (request time) -
- pthread_mutex_lock_acq - - pthread_mutex_lock() (acquire time) -
- pthread_mutex_trylock - - pthread_mutex_trylock() -
- pthread_mutex_unlock - - pthread_mutex_unlock() -
-
- -All tracepoints have fields corresponding to the arguments of the -function they instrument. - -To use one or the other with any user application, independently of -how the latter is built, do: - -
-LD_PRELOAD=liblttng-ust-libc-wrapper.so my-app
-
- -or - -
-LD_PRELOAD=liblttng-ust-pthread-wrapper.so my-app
-
- -To use both, do: - -
-LD_PRELOAD="liblttng-ust-libc-wrapper.so liblttng-ust-pthread-wrapper.so" my-app
-
- -When the shared object is preloaded, it effectively replaces the -functions listed in the above tables by wrappers which add tracepoints -and call the replaced functions. - -Of course, like any other tracepoint, the ones above need to be enabled -in order for LTTng-UST to generate events. This is done using the -`lttng` command line tool -(see [Controlling tracing](#doc-controlling-tracing)). diff --git a/contents/using-lttng/instrumenting/proc-lttng-logger-abi.md b/contents/using-lttng/instrumenting/proc-lttng-logger-abi.md deleted file mode 100644 index f208842..0000000 --- a/contents/using-lttng/instrumenting/proc-lttng-logger-abi.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: proc-lttng-logger-abi -since: 2.5 ---- - -The `lttng-tracer` Linux kernel module, installed by the LTTng-modules -package, creates a special LTTng logger ABI file `/proc/lttng-logger` -when loaded. Writing text data to this file generates an LTTng kernel -domain event named `lttng_logger`. - -Unlike other kernel domain events, `lttng_logger` may be enabled by -any user, not only root users or members of the tracing group. - -To use the LTTng logger ABI, simply write a string to -`/proc/lttng-logger`: - -
-echo -n 'Hello, World!' > /proc/lttng-logger
-
- -The `msg` field of the `lttng_logger` event contains the recorded -message. - -
-

- Note:Messages are split in chunks of - 1024 bytes. -

-
- -The LTTng logger ABI is a quick and easy way to trace some events from -user space through the kernel tracer. However, it is much more basic -than LTTng-UST: it's slower (involves system call round-trip to the -kernel and only supports logging strings). The LTTng logger ABI is -particularly useful for recording logs as LTTng traces from shell -scripts, potentially combining them with other Linux kernel/user space -events. diff --git a/contents/using-lttng/instrumenting/python-application.md b/contents/using-lttng/instrumenting/python-application.md deleted file mode 100644 index 1159856..0000000 --- a/contents/using-lttng/instrumenting/python-application.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -id: python-application -since: 2.7 ---- - -Python 2 and Python 3 applications using the standard -logging module -can be traced by LTTng using the LTTng-UST Python agent. - -Import the `lttngust` package in your Python application. For example: - -~~~ python -import lttngust -import logging -import time - - -def example(): - logging.basicConfig() - logger = logging.getLogger('my-logger') - - while True: - logger.debug('debug message') - logger.info('info message') - logger.warn('warn message') - logger.error('error message') - logger.critical('critical message') - time.sleep(1) - - -if __name__ == '__main__': - example() -~~~ - -Importing `lttngust` adds a logging handler which emits LTTng-UST -events. You do not need to get a special logger for tracing to work. - -Note that `logging.basicConfig()`, which adds to the root logger a basic -logging handler which prints to the standard error stream, is not -strictly required for LTTng-UST tracing to work, but in versions of -Python preceding 3.2, a warning message could be seen indicating that no -handler exists for the logger `my-logger`. - -Use the `--python` option of the `lttng enable-event`, -`lttng disable-event`, and `lttng list` commands to target -Python applications. For example, here's how to enable the events -produced by the Python logger above: - -
-lttng enable-event --python my-logger
-
- -Standard Python log levels are supported using the `PYTHON_` prefix. -For example, here's how to enable the warning (and more important) -events produced by the Python logger above: - -
-lttng enable-event --python my-logger --loglevel PYTHON_WARNING
-
- -See [Enabling and disabling events](#doc-enabling-disabling-events) for -more options. - -When loading, the LTTng-UST Python agent tries to register to the -[session daemon](#doc-lttng-sessiond). Note that the session daemon -needs to be started _before_ the Python application is started. If a -session daemon is found, the agent tries to register to it during -5 seconds, after which the application continues without LTTng -tracing support. This timeout value is overriden by the -`LTTNG_UST_PYTHON_REGISTER_TIMEOUT` environment variable (milliseconds). - -If the session daemon stops while a registered Python application is -registered, the application retries to connect and register to a session -daemon every 3 seconds. This timeout value is overridden by the -`LTTNG_UST_PYTHON_REGISTER_RETRY_DELAY` environment variable. diff --git a/contents/using-lttng/intro.md b/contents/using-lttng/intro.md deleted file mode 100644 index 48a6e69..0000000 --- a/contents/using-lttng/intro.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: using-lttng ---- - -Using LTTng involves two main activities: **instrumenting** and -**controlling tracing**. - -_[Instrumenting](#doc-instrumenting)_ is the process of inserting probes -into some source code. It can be done manually, by writing tracepoint -calls at specific locations in the source code of the program to trace, -or more automatically using dynamic probes (address in assembled code, -symbol name, function entry/return, and others). - -It has to be noted that, as an LTTng user, you may not have to worry -about the instrumentation process. Indeed, you may want to trace a -program already instrumented. As an example, the Linux kernel is -thoroughly instrumented, which is why you can trace it without caring -about adding probes. - -_[Controlling tracing](#doc-controlling-tracing)_ is everything -that can be done by the LTTng session daemon, which is controlled using -`liblttng-ctl` or its command line utility, `lttng`: creating tracing -sessions, listing tracing sessions and events, enabling/disabling -events, starting/stopping the tracers, taking snapshots, amongst many -other commands. - -This chapter is a complete user guide of both activities, -with common use cases of LTTng exposed throughout the text. It is -assumed that you are familiar with LTTng's concepts (events, channels, -domains, tracing sessions) and that you understand the roles of its -components (daemons, libraries, command line tools); if not, we invite -you to read the [Understanding LTTng](#doc-understanding-lttng) chapter -before you begin reading this one. - -If you're new to LTTng, we suggest that you rather start with the -[Getting started](#doc-getting-started) small guide first, then come -back here to broaden your knowledge. - -If you're only interested in tracing the Linux kernel with its current -instrumentation, you may skip the -[Instrumenting](#doc-instrumenting) section. diff --git a/contents/whats-new.md b/contents/whats-new.md deleted file mode 100644 index b4c629f..0000000 --- a/contents/whats-new.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -id: whats-new ---- - -LTTng 2.7 ships with a generous list of new features, with essential -additions to all the project's components. - -Dynamic filtering of user space tracepoints has been available for -quite some time now -(see [Enabling and disabling events](#doc-enabling-disabling-events)). -LTTng 2.7 adds filtering support to kernel events as well. For example: - -
-lttng enable-event --kernel irq_handler_entry --filter 'irq == 28'
-
- -LTTng 2.7 adds wildcard support for kernel event names: - -
-lttng enable-event --kernel 'sched_*'
-
- -On the user space tracing side, the new [`tracelog()`](#doc-tracelog) -facility allows users to easily migrate from logging to tracing. -`tracelog()` is similar to [`tracef()`](#doc-tracef), but accepts -an additional log level parameter. - -The new `--shm-path` option of `lttng create` can be used to specify the -path where the shared memory holding the ring buffers are -created. This feature is useful when used with persistent memory file -systems to extract the latest recorded trace data in the event of a -crash requiring a reboot. The new `lttng-crash` command line -utility can extract trace data from such a file (see -[Recording trace data on persistent memory file systems](#doc-persistent-memory-file-systems)). - -LTTng-UST 2.7 can rely on a user plugin to provide a custom clock source -to its tracer. LTTng-UST can also load a user plugin to retrieve the -current CPU number. This feature exists for very advanced use cases. See -the clock-override -and getcpu-override -examples for more details. - -Python developers can now benefit from the new -[LTTng-UST Python agent](#doc-python-application), -a Python 2/3-compatible package which allows standard Python logging -using the `logging` module to output log entries to an LTTng trace. - -Last but not least, the new `lttng track` and `lttng untrack` commands -make [PID tracking](#doc-pid-tracking) -super-fast for both the kernel and the user space domains. When one or -more PIDs are tracked, only the processes having those PIDs are allowed -to emit enabled events. - -Moreover, LTTng 2.7 boasts great stability, benifiting from piles of -bug fixes and more-than-welcome internal refactorings. - -To learn more about the new features of LTTng 2.7, see -the release announcement. diff --git a/images/export/concepts.png b/images/export/concepts.png deleted file mode 100644 index ded3487d6d3279f397b88d44337199fcbeb94659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36697 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 Fe*)JSh*tmr diff --git a/images/export/lttng-live.png b/images/export/lttng-live.png deleted file mode 100644 index 541472085404de931d55fc467db84d6be70a99f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8971 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 TT~_puEEr01>avy6W?}yeUdT>} diff --git a/images/export/many-sessions.png b/images/export/many-sessions.png deleted file mode 100644 index 255b4cd82ea1aab4901e7c8bd1872f76b045617d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12226 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 EKW1DC6#xJL diff --git a/images/export/plumbing-27.png b/images/export/plumbing-27.png deleted file mode 100644 index cb877fdef882fe0a1575c5bd99b3d656b9217787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49389 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%0AIY;y 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 diff --git a/images/export/track-1-3-4-7-10-13-15-16.png b/images/export/track-1-3-4-7-10-13-15-16.png deleted file mode 100644 index 68ed9250b67f1227255c4b354c9d70aa6c27ff96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2711 zcmai$c{CK<8^yX=fDOBgi#rr+tD{`#HYIp4dSd!BRdx%WKZ&+{ajU%$c$gaQEo0H@Ja14{tl zgdSsW!OFy#$=$I=jD^kbs(l~;zz+H~P5`p;5XPb49faK-D_^%eA?N@sK+o0J1uJUg zjdsUcV$rT){vB9t001aqWT1B=baeHFnW<0+xV<|`A0VQ{g7U+V&{Is7e(cg4Iq8pX z7_oa+qhw#^)>(Sg@=Kod9t6Un-j~i4d5OkU7H<{w8?*IU2@*taJxagP670iKP=ys) zJ*VWi61A!5e-EDBrQ(~pL4Sa3N*&dne7;9-*o)H7!Vl;+&Xy&X66)r0j=fa>vnsa} zD;$PHqt}uG6^=ZE|N1PHV`>WK=O3B!@4OVvZH<52F^8^e3U1vG;evnCi-$_ZF=S4T zJL8r0OK?sQybuj%RX6>m+;}#zK_xL)-+*h!gtl~Iy(>w(6dGMMTvNOfE_$Z9Wp=Z& zvU19*c_}=czR7KN{sZe*L{8qUcl#D_OTyPuf+k;kHiKiQrR6>vG7=5DyZbh)f_euU za+wb}z2Hdl(`(M_oGY>Ie4|!k3{q++FIQ1l=YQDF4g_XrXJ3$$n^%jd!Su0~IOket zCP{*Q)|#7RkO^e;_(ED5&xtzX{BT#_Uhnr14@oZr-Thhz`GUurgCRBRzAyih(8qm* z$IYv!;MZ4IZ=z7-gQfm_6+^M95#`9kD#H_;`nC4%A7*A|Ha5x<%Uv6}4!`;S%vk(7 zv%T;4&esI}e3Hs_M}aunC=%akkff9?tbsxz!*`Y`lar2f)yq0@3)9ul1uA@! z??o|p^W#6l|E@(@oHDN(P^d8}Pc}5B5Z;2g)VJ7B66qYZysA)+(`Y_%-u3S^ng%a& zcqNNRzq0@PC$%qCRaN`@`-N>AP=Zg5kag!rLZE1G7j?CLu8 zdrwtW43!h|liM;aLYBR!H)cSI|IGA_k4Jo;gb~Hg5KqYFWUk-0u$N~K&x4fPVen1VuP94PYM!--*>Iq zvzU?Tbo#U(WFUJE?a8ASQOW~4>6#K|m)PmGAfhvRV=F6aZ(B^>+4kZ|x6DosoS+}p z)6+%%P02u%9Sh1{Ld#V0=V%p%=Z9i*Vi)->6pUW zm13bs#IlOQpG|{v%EFTHg_}rO7I+IBhE9KG?|iCGRo>;WIij$UrQ>|W%c%!*v0vUk z1T^N$KOd{$N{=U+6eW;1z=2S(N5QE#n?GZ(7{l!fcxA__GvzL9oP@Dbv{|lcMqf~5 zXedNT(h_K;3|5hTutdn9t`2w-2RyCg{^{isf>}3eILn(h))S$n7BqM5IDK4pjD|kq+(VWysqI+sa>`;GP6&g+ zK-f27Sx3)UR7<`tYo3>n2rgXUdm^bW)Z(PB_rMFXom5Z;$3?K%k9w(UVUv4pr zuV6JZvOfx4V@Ca)c=}|a*8~($#&G#>qyJ*T9~}H*!5 zo;ME#hI66tfjmojdFR8(gjYJ=4DgJ-Ff~2u-U$h->u}vFYaIbc3(F=r9F1b1HmHf= z6aEX9|8rlMmGb^1IU^&ZsHiAZdwnyM0fj+SR|y8za70Ux7NX+3qJwrFCex-W-m?VS zJ+aQP|KT!uN3&!_Q-|@@Q&bZLq_;qBPEL-E?|dsFdGeUHq9J6`HajBS5z4y)jm9C~ z4NuCwB;8lDQb6%6J8XMh+E#G+=QF0`?pR1wah@=jVczHdAz+mtr#L}VOKa%sSJ8>T zMbB`YW@K5(U948+!9>ZSpN6>Ywf&UjW7-zs3NZC{_&KEi?daLv#gSUP3^xEq#x68@B+{Xucx$Qx-etAVl_U~rCvSjiV7x~1sB(}A z4hrI*7ZBuzVdT;h1L;Mz-;O^xEyZ-!1PviILnk?%$GL#mq^-=}#Wq=xNUuVn zP-8msU;}g9J zjz7kDmd0B&Q>q1pBu1&Fr3#eetFH&qr`IH<1Wq=+dWGonz%{*IpBww6BqMl{5QA6( zt3t;O{M+WJuLZ=2ErTpnH zU%qICtc&7C$Hpj$m6XLVS~3c9JwDIuxA0-U^)XsnT0~OBe)-&M``LGf5BEBT)>7Bp ztHHbW@x;s%i1TMyr#cxm3u)KA;9>J>dS#-wr!eiBd=DhPf5G|sZlm=PGV)c2yUB7| zdg;nl`PHXj*zzztEwKT(i2$W9j=$wD&4HM1>eM#TpIgv6$Soez5vjRgIDk zT|eHANncN9$&4bpv4BF43G4q#>2=XgJ2ptoXMfXH<0Q64$qo#?S6S>G>1K0a2{6IA zAMFWUJP_oz23@#t0e^kb*RgW2^p*6qVxnq*T6AF55~$-S?PIA82O=5UKd4qmKFCC=wGFxt5;b!>zv<^h zW!xE6Mo;v+E&5*^{Ef=rQRUxmA92OFs(8lEHq)$ diff --git a/images/export/track-1-4-15-16.png b/images/export/track-1-4-15-16.png deleted file mode 100644 index d2ecb74f4bc4cf24ad1198514a8ea1c3a9009598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2500 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 diff --git a/images/export/track-3-4-7-10-13.png b/images/export/track-3-4-7-10-13.png deleted file mode 100644 index ba4015294a5412169c760bd3bb11ca4e18a60329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2647 zcmaLZc`y|29|!PFDaE2(yUuK(vrRodHh1N_$dxFoC6)VF_a-?y zd@WK65$o8tMP!j<9U))MnD1|X^PBn2e4h97%rnn3&&>13Yd(pV7Dm7$;zs}g0MHnT zum%A3>F%zrc(``6?ZX}8-Rbakq+>7uz$^4;>;pW?0qt&rLk!R%Hi6zDVb~j90A0^O zoY!&VYgivIYcH(l&7dwX?cIwL#t2}Zst4;CYnDmNN#xzz50efLX3U&GGzYs zk$yXgW2OCi@)QWSf9-8=Co9$yd&)Z5s(%Y&uJc0y4fD5SSrC0IQkb+bS9 zlz3S7v$AZQxcr~8Y>N}TLK3vj@qf8986e#>Hov^_w`+i=WGVsz+RgECS4r;V$DSyS zSHtwAc`Rn3WM?=(@6lQBuB3XgsIZ^EUr$w2@zhTA=+F@I^;!X+?E4E8>V2e}4S+*fvk?%iN)-;1`E3Zwt!lER4-Of)#?k_b*Q%vZiU8au0{ zqm#ycR(sYHayT%5JpFV*;Mhw$XXm7=$&Rdq=faLA9gN2N5l(3Ii}6OjnUHsAME6QZ z-p*k$5X3Mc$P^zxd<-$HA$Wb!_ z0X_fQqw}RgwoNCRP}{k+)7=$}E#S$H@+*|&IlQ04pJDcq>r6sVb;8eEzb#u1cAbnI zyWw*6J0p{kWgmQiq}5m3N(z0TmVBykT#|ORw>Wz#g2gpV*q&=J(F4gyNi$7gFT_u( zMeZ~cr9xF5A(H&@da?&hpr=FHL7nX5&!X*%sA0wJ_+qXGRywsLCLHM8DH3$3X2^U{rylYVcz1#2fm-hQ-9 zZ)3i`n6dHXFFGrmL?V&N`pyYoo@|~M2sfd;KdcRH4lDU3Tp%|ffom<7JwWV{7@fi>ixSi(Hwz;gubz49D25)qjNpc(6MEBJ+RVKyv3V4;TI` z0rUE<1m(pfi4Nmc&t)>DpY3PrkhBV2Xqj%JHu!^H1ia)6R}R!51LNB?@pwG0h!Nc9 z+jO0?v{W0ec+R4%!}ZAeg_?{Z%$P}WAE*IO6<zB7W@X`*Zy4L1NAmLwU5^e7tRnReRt~Oe$;j^4 z?;@8wtLo{c5&a;J*r4*2guj&B#rhMlDGi-0Hx~rK~#M zP%;D2tTs(a#gWc>tF`$i_7-GQ8n57Co77}x%0VBym9yPGI%}DIHX{;@I**sI;9W?)-!E9RVJrC%3xGk zLy{jY1s>|exOwVMxT51TZLyn7ChJi^IY}Whg>c&D%ka|XN2fQVK@C#=rc@u7ymh`` z$?@+F2Q+NzSwabYmQBR@xR|s&S^Ax|LxRc{8WH4_k$%M~>wK3e=0ZfvI6^uHQRs*1 z3Vu_`ScngYX=r>tr1O&%zf(H8U06Q%xU?B|b{k`i-?-_gSE;c}&40AnLv2sAz20Z9 z@!30-`Dhdl=$i=vL%&S4;+!5{$nt4jIX@@f7IOdu__m`z!uw9`;cin1FgCD2RO-3k F{s$`W0PFw& diff --git a/images/export/track-6-11.png b/images/export/track-6-11.png deleted file mode 100644 index f0a2f76c6a20d7a48bd4916c2cee1fc67834dae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2466 zcmZvec~lbE8o*Jfa!S-jbHNO=MVs6*muF}mcOAD3b9VwaTnJPYH8UD@G;>YG1(!-R zC(T_!LM4Z?kTJ&0E!QHQp+GG_MNuEUnfJ$>_s;q5a_%|zeD|Dtf4}?XT=H-N9t0f( z002N2XZyFFaGE|THfSZ99>0B}g@Ym)*Hs?{Wm>In{h2~c!ILJ~Ya z9AFcM4hh$CxdumsUk-bVlizY{+}(mEkGyygLVvMe<@a`evTBC8 z|I{z*2Rmc5rhn2ub?AH|^&D2&RL1ts<rA)3tqO$-XhGKZDHKX`Gn25m%emVP3>tU z4o6$^@N8S1rLY%jN3Rzdm*JkZNaIADN!iVs1@YDd4Rv#kv3(KCxb#zFGVcT|2CKOC z2-+wc)mr8*UZ=C!?Ajf?4b2AZTK9ekQ6}>k5CC!CTI1F|%1-cq1$D30b_mftM^&E_ zuM+3DD>LQPXpQLAJqsHMZ`HIbKQFEBlUT%0Oic6+eMmSP=Yan*7MpUs-N(nLH^*KZ z#q&X<+j`0;+pZ>IN(=}Mi4*OdvZo+T&F7ygE7c8w==lD<@@Hi7-jJ{m>&dx3<3YiN*Slk62Q&&$paxWKf9R3QVAM&>G!U&7SjzAz9H4Wi!5UYUD z1MM02FX`#)i;&2dO#W= zwXogpM}xV3Onzy0C)x>*!C**WlH+3Uo9cf_mFUGKCr_=WvUG2yrlwxJ7rIme_Ow?! zl}_MJxDvxqdVwOYe}E@BVuHN8F}HEI>uwD%*io?yaroh}>o+gm@v1_=vKXV!g-JRt z^sqDAv1;h)M*mWXcPN*Ti7bEl!}ha;ftdCEHv$Unwc$DqnaaEIY|Iem-P|FC73-kd z-9MIxmp3Y3_>@@Xw(}`6>XikOrz9N4pZyIpieAKJpvR|~^AP#uv(afn{%hN6gmuvmcYj4#!e%n)lZ&S7tV>2CQ{7 z{}>?4%l?lHzNYv~2LDa*moonLMRM?&FVhWyfq}WXxid2}`uh4-R#xlE{I!=$@j3SC zF$e@=O>fov`*4;!8jV)q4EFt{giVtTK?`{yIy&kG12(m5JT6hnx;=Wo-Ssy@K6Y|) zvV>7@#d|x3GD5iq869hy6NyBNh9>6b+3&vOio;1c(LN$SXmDPZ|EQlHiAF0-@L$B^ z@e)t19b@GBO8ii9oYTct47LZ7wmZ255~vGpQ6SKJx72uC@mf1Nk04Cw1dOCWgM}kWn^SQ zf*VGqK&bUT#3b+3ybTU#eWb#F2vPjQFRZHt_SzqAYgMF&Sy)=SJ^WCk7!5CdKk-td zN7z&K$VrruSB)xEmdoN9&hvP@!=7b*vZi3F-lrvIdF6+}L7U>+R;}}ct-|XzZq$*k zb7p2)Pb_(LTGb7@63?;;1`*as&6*{JE+^Q}e;8Rr-MDd-d`P9@X{U)}=gG!z!kfIS zImvu7xs_Cl+F@|-<;&d^#tq)jpveW;$QqL5dvYzLbA6a^IYv)f?0CNl1SV-J!3~Wx zm6>N42A#8nZP`2l>pZ_N#|$!iArBeZ{O1AP3{r61P?I9)6}aB*%CAyc?#XIZbXA*u zBm+W_dNldU;%P@td%=;BQ`3(E8ov!Isxn7srA>rZK|x1<0|J5jcFZm)bjWuVO%Vm~ z*IQDoqNXri`IE@gw6-?Zh%UaJO4T6VzEj3>a^~XOojW>LYQ99~-^%C;Jx~ovDv)iw zWT6Jc>V9~fZ0Qjf(o{Gvs|?L%xIv*%M%Z_u^=I=eJ~XBC?2C+LKp@bMsZuXO&Y@7V zz3(bbTC$yn?A6py))P7DSrY{}(w~?>Ak6q|0msg!FbdbQs5KMI8ZYo33W5v2qK%{s_SzVJ$6DO2#f0{!5> eyyABap8~`c)>d+@%jYEZ6~M*8!@kuPmi}*v%*!tT diff --git a/images/export/track-all.png b/images/export/track-all.png deleted file mode 100644 index 075dd3d8b3972e01c2bb6e3477b0deb5e42f4b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2480 zcma);cQhO99>=3v>$PXBs;x$~Dy0Y#)E=dpsGU+`k0=f5t<*0D#TdNZ%R& zpo5(4Z!?`cn~4J$s_9(E|UF)n6Y^)Et6E?G%YiY)V1a@u2((ALo#H6Ex&_#VEBKmz5wDSzu zpWJr)Qfn7g8=uhLy!axY&;`0?ZPD)a#xq($CL8W|XV(hBuY~gjPcyJ9F`C`nz8>jb zBX`S?Fj=8ZxT9hrF&Hr)G5F`Iu-lEz$hvMlrZRZ>&gw!b=BWLXfWJ*f(#j`>XD`&Y%EUX*z{MEoUAbS5X1g9kc+>!T6+``t%^1*-;UMcB$5 z{ZzEGv9f_y-|^2;hJQplT^RnlfuIiic*#gNibigMguPY$t-T&-XOp}vYUMPdk{%k4 zF(_0gjW1I+DU{j50y%|4%JnBQU%Wo@76-p3@9RqtQo5gcZLl=)gsd+vp2AlSO-10d zpURaKfnmo~irU`kvGmGG|Jv_e`ncdUNe)qpk4!jqhPf7$>nulZP;I564T8&YvZc$X z^5H=5BXkrirZX_WuqauM-}-ps&S67*bX=fE?&q1nz4c>%H3o-b>4Qh=XgTU!&j2@h z8c3>%)g*#y$6?9NN{alP5WW>5?msQJFd9_){+xkts)pdlNC$#eTFS8682<7z)`+EJ zV6kR$o#f@RbqVNAh)JrAt~4_)ulOpQFg_Gq=iw8;y1}y1aJomV`SKVT3af7Aw(>8i zhZeLyAt`DaoqHKH)6|PEP0ZpqEw8x#PHP-)851M@mIy;*B2}K(W64%F_B@1}>6feg zL&^dDH=;8v#6`)1@8;l1KFu{&ZLoI=-99+TumT)LSfl zGvB@m^d>r1WJy2&!T(T5RD=krueQZ08#uMYJc@Vi^I8)Pl{#ILCU~7^8)s18Qj$2| zTTSyXN7I8^YSn8A6?xVFVi6W@99n;>slB7cdtNVPoOZ)rYi<{94`n+WNvi@TV?2&0RgKs^<#01-U>K0XM!Y>NP$i^fT>HB8={SCP8*x|q z5%4w(kCNazd2a7xAKy6-#McjSqegu)GFSVUQaCNJfFJGU{&?K9ZFfeH~ z1lAfV$;X%leX$)+9SoDRq`ji zbpHkTFS`E&_%FKu2K?^~_}k^2%@&@&wW!Ex-7rOR|j+NQ|&z_4g&E)+;h%1C`BA%m#X-re>S#d!sy~>P)H^SX(j=FpXkb z$a`u8D3p6Z_UlN z&V^l@ReoSy|0N$Z?x%&Np;~le6?W{|dduwI<_U^kJuqRf9x!9?^mvV}jlhyY z(Mz;SzH$SMMeKs(&g2e#56BRjwG?T4Z≺a1?Y@U&*_3H2{4DGsDuAw;$Fsc zNc4OtbQ%o@kL2+4|CS#Xd2jwk=_TmcS6{Uz|?j2KF@_we8O;?pTFI!N`@G+zw}mNu5cZN9yBlNxYWI%2BAE-hy8)cL^pOX-cl_uL;PkG?IC zx(3S?@D3ax@_1H+Y9eID{7YrZidUC97yeSxl!J};Dx(7?NaRq4q3h!GEq%w zy`kDWS`o_`IvtI84#gs`PIiqQh3+Z|+0SDsAa#erC31 zoOo5^5kGzV{>h>c<#~>3`Nm|q%ETJN*L~DZ(KCm&?)<`ev-eZ}|`EY6)|h&;QqN{Ks`T mGxaknvs%|^nVJuv2PB+hJfBeizUi#n0vH=u=vP8rqW=jpin&z) diff --git a/images/export/untrack-all.png b/images/export/untrack-all.png deleted file mode 100644 index 860f2216d0c35be39f9f5850037d3e7456803ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2158 zcmbuBS5Om(7KWp&D@qAXkd9QPgVG66NeB=K5|9=ngb;91Km!B>1wocb7lQPJP7HmK zA`n2NM5=hwR8;x0C`9d1sH7;z3ZCAcp|&pb!im2e{%D;E9v7 z^27MxkT{Ij{d;{lQvl%PPb7-U$@FhIQ2- zWQE7*7W#d;L@_b3i$5zKMLg!jLwcaYs?LyOiG-Z3)M=;#@Kaq{W{xQ|zT3FP`eI8{ z6Vcw6>t}0ob2h2KgznvtdJho_{`^V{7~-`g5q~)vL>Ht$Jo= zGOLTr?`y_qN)o(plk}uolxjIkOY335!Fn2)b!*f>clYw(piNz3wp^$!%CB7T&!@;l zD&1mZ7j;QW+SxDv_M@lTVo9PpWC!wd=u0DAT_FbitZl-lKjB$&=S56ROpNBuD^;=D zSRQi+rSkefqEkhWg@ep^zZq)qM8cq2wpv4GyLlF{c((5jM**jM#Uryc0Q^GZkn6MBA9bnFbQMSJN^Fd$wHGzev*klWD3?(cV{OepFI@=vV*olV4%`pS zsx~7dByEeiRq{=qruMm>Jb6;fz1@p^yCaG{rtNo`Nke*7W?8Zr6M4Ij&_(gc!4{w4 z*^s&k=>yJ#VkoaV91fQ?d*GqI0Gc?U5G6)@X7P2g#Tdn@Oj(W?G;{Wl-*9G!lmwx5FKiUuXYAfW%+8!K&WDY7D2@R|^!fGirj|heEB|MQ3 z{f~~n@=gbGbGnqlV6a#$6%~~u1+iG{y2vIzFF*gw+S-P(t}YTZ5FQx`rsN(h^pUOt zIc;NW&kW!!94&-En4{5W)VH25=dVWWY?My=_Ka6wTy^@6P2kbkenv1bFsSGldH>$| z_2Tj#u3>(9pvmpCv4l4)cZk!|b7Bnl`1`kS`uh6)pfs_XjLb|OF+5*>vk@4~X0Zmg zM@L874$bbh=AoVL`}$E6}uM>;#N;J$xMp>i@BQGIcP*Kg5k zSnNC z%NEE2zDm~XZwa%rT}1VVjG-~Y`r67$VrcvV^!efx4&_b{?Uc8(vm-&~?rj?_CpN2= zjlVN;adA1n`(q=2wMZ_n^t`@A5-X?rA`k`>+fi5%bXk;AR?*PZoFg!P7j{YQwai#Z zFSj|9>hgXpCC|%OE-$ zC3|F#k;oS;>!)$c+I59hMY09Fy)V;j9M4^vi6H528%TL{M~mfj)x?~ZLSJgGyVW!~ zt8DS9*8j{A!U?X(XjPy-^hr7AfnJ(+s*d;LSi0I<@k98Z?@M_8!M(1)aDg; zbTRHMjH<#zkDQsrAS*XIalsU?a$LENT2|&Cd~4??0gK@wd!tX~qVyyNZCA7w|N8r! zLpVxOBDvF0<@wztK(GA$_^D+3b&ejbEH*o}+{?=K{P)hW;A^69hOSc(x#Mf`0@`9< zG-v0=sdj%5vSYA{njx9kI2 zPxV!fFtSaN|7(APsWd?{>G#hc*zA;my?+hl9y+rlJL>=MB-m4X1=yTZZ+CoL=za7n O0IZ-0NcB~Z=zjnj5H8FB diff --git a/images/export/ust-flow.png b/images/export/ust-flow.png deleted file mode 100644 index 77c158a172fb04dee560bb7cde36c03887025209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24052 zcmZU4WmsIz(k;O?xH}2KU4wfF?rwt<+=GYU4#C|mxJ!`W&fu=WJ;*Tl+~Gave0G1# z1Km@5PxtQHU2D~$e3IhX!@mW?%4F={-JoJ-{j0o+Saw!df{y}k))pdn| zLBoChyn)HcB7$}jyGiS~sXJP_c>-K4V8qQGO)aQC+XJjD)GPqzUd|&HLNG9ffuE(s zHNLK#W}{^#Yqmi)RpZCd-)ywrT@G%IbZm*~F_sO3HGDUZC`f(#~JDk5B$^v5^nAq&R1rg)OMk+-8fD zgVrZ0py?FF8kuKIf&HeSP-RhxVj2V*b1#jyxa2T054pMPZ>ad;)(PaRCxv{*5Oue$ zJY0taTD5|OvPd!b@k73?;SUU$321Y;%=7jbj!LRFvVq7PU5?%Pof_yg+D@*#_I{5r z$-#KxSkFBB)K`HISLeS3HL=vFB#^0JdnJ$=u&9Gy+l{!8=i%Ifv679s64%AWPF%&i zo70<%RsUOAH{i3f+j6JV*^%~oWf)_TSnwhGmoJObY&C|2^NWsSk8Ak0UkX8vb~lmz z5F<@o;mcju$E4h3)`{kNQ+NBut7Sc54Qd1$DXYI~6DKdYv_II~NqI{|HkXJ>FTFK3 zYpW)_(w{qj6&@LPE(bJ+G}DVyqXtqi!m5t1wOi{}!jKe3u?cZK%n*tu5RAG8JdGW0 ze}e1=V19Hn;XZg6D>P#aJ7@X5-j+|}{ipn(fO4awU!TEg(1uQG^KPZ6te^mBbl_5H z*e7DuX69VucU-_#m^|5D`+Sh?D#zWo$Cj?N9-2gZBbmAh@!yT}S&zc1ht3hk={cH= zV~r`?hvI8*T+HurN7kF~r1>%IGQJmi6+FVtK7*~Na0wFY98q9&I6IIiRPCZ4yKGQ{NI%BGh* z3K0R2GCDLVY*F(x(QT6q8Osg+25NLV{?y9(_E$Qq_mk3ze6cI-}SGxGd76%c5tk z*H$B)36RpR>TJ!#H-$p3chDsI$T&NgY?Qo$y~Yr^f>RFy&kRSJ1}aw}!Di0IXIBpSmNH}MMu3&q_M_@bF= zX-i8yXhVpU8TE5k^gR3ncQbA=+sp7TpqIJv!=nj3uT?yqzHdg!eU8N>Rzv>&Pyiff zElXbA4H2?Xqj7aKnz5@ht7bprYYQ#*%Q-Rpx%PS`bMSJS>pC7J+omGQ-!~Z(G(FG0 z;3SzM7Lor0V5wo%2@dLrFWu#r<=1C&9CLJ6{8fX|Q!vsfU=(gJMHD_9rFyAQ7?=I{ zhHYHueV9teBFcUO9R_&X@`yoSL)VgK;+Jzqu4aU}*I6aWcl?5QOTV)p zH(mZpf9tDzZyR{O8wq!MYWX!lqKeg2GC&3^am8e{uT85M{Av#vnDaf=Z$Qpap<9{4T_=j?0FnE?V~WA18|73o&}!ajc#Q z7~^g4(VH%89V4QTfc=mfbqad81sN*0j|6+-zr`gY)?7DnMf`558*81g&QF!AHgYaz zy?0-hjRN!EZ*70d{R}QZ5$yG^4&syzbB#mjh^r-4XrYBLbH2Y3c!Sp_B8N>q)>agj z*Q|0vPk1#DVC2<)vhn!)!dDO3t`ff5LY%lQj(wA!0(YsL$gsx8Vx^`dPLy)5r&qE! zGp&g*<&h&f>|W?=@j+~h3$-`<-UQtqpkmWYDTyyHsf}$dPN?Sb{H~qt-Bk(;c@ip+ zaIfbYAL=5F#8KE5)p(oNp0EkSO&v#Z8{FS9sVDSb?l7t4faJxd6_wZuWKl2`QQDTc zGX1_!+6KG}#&Cg{1T_5{rGd$TShV&V^hBt7%(&IpZNOOj6i@H@&(yLnM-#JL2clP! z?I(Z49fCpe;^lvji^lwP;fd^V-A?aa4678e)u>E2nX%}GE0HjGl&JLZ^x!cex^V>5qn@PfZ+%{L7{rv92HCN` z_#-sqCV5m6{yh(X&xq5-k7G#tM(0-(o`uy&EN6uvH+m)KkDQo8miQa?cSfBV)^UIH z&j=t$LiGGO4)qG?MW3Ter}=QQiK|adPeVFx1rh|CqX*2AD_tfreTw?z@|KMj8RI34DM?p`gj)FBWTA}3-h1!ZZjw0jj*_HrJrK| zHe4d(^?NzX-uSGGJY6na4`A#YukG@}^P|EA2z|$)j*YkU-SPmF2lBo1->c9?y*chP z60pe_I~7Xhn^Z(#UAtZot0DTshyMo*7AG=8Fh8JCXd}E5-JWfDc5ZD@7|xi-*V8$O zQPkz3rykTvdn40MFu!;nRz8)b++}x}ud70xWlMmyXOH@3PmY+=f(Y%*6zrox7L)c^ zy!LS+Cw)B(s7&S%(#Tc3Lx%(p)DC}-T0%dwi=)7SE@9nyS5%Wj(Fz*xGn*Jl@^4c+ z<&=nDwksIx`kLr@paT>ohT#x)rI$46HCO31H#%D3Q_qhG?kaNsK_b+Qk~y>kEvV>3O!+y!j&haB~tF<$23JZLo1o zt!D`ZsAYED6fR~-^cf+v5-CqR*-cEZu(H`fml7nD=Nlsjy*#{am1Kk8)@N4KNKG|- zVX3ZDWTpOS-r8qpe}pk+2D+>T#I_K2I6!T!@_l|>_rY&KVf$z{Eh^!fmVQg6E!5bt za}CG<4Tmjyujn_JA%PLh(PzK2zFkPwv%biwNEi5ch6`5W^uUAh! zh|o-43i%b2p72)$*-VhG4eHmL2maGDna8a)fLa9oy;tKlHGC$l=0puL2`IFlW`y1a zJtxj%^=kc>=VBXBuf;K1PUaOv>zQS(=D3X(ioA5r*+ZA$A8TB*VgR$}s*Y8NHE&8h ztSUBg0&(g4T9M;yP~FiOv)4Yd(bLQON8cP-D8Qy zSd23!;^YB5S4};~nElQlS1G!=rsf4(Y6LY#;myCUt*e$Ts(J6`R%QfW#5D@G1^&2{ zj$88Ysm`uk)-gr#@fqo&%DpGJJ7U>rVFPcZv@a}pvlNN7yYEPSR)|Kj>_gP8nK`!{7Dgr_R=8Ca{?J%3`$gL)PR<%;<)9C zZ3w)up?b+YAiZg}!QiyIfm>^|WzeF%ajA+gsqk0oP%p4mAu$Yx%kC{Iw_H_nd40S2 zL8G`cOVn(oEIrEcbHNg0O_ZQ!-?g(iDntDF6loXdGL!2gCrTEHEm>VWNzR0Q^1D8> zZ52ZL`t-m7GmND&Cey_zP#Qz&NAe@nNETuNm?*PtFAHXs)S=a%rY=qW=W|Ru7p_&4 z?LNbe!!vlCkQfZ+$Y#bVIYB;;y{k^fLjz3&clV~E2s~K^Q~#afy5G7aXeTL_Wpi{Q z6?)c1Wa`*_Pmy9rMbEQ!2srI+DjN9qr#v3Td0d1Pd*X*63}?)y_J*o&I-m2T2!^~! z&8n%uzj#-!V-qr9FL)LQ+$(7A3|3Y;krqDt&0YCu9CNwbnSQD28g%zm@a;%m{BzFF zONT&nh0V=V=My6HaUGF}s}-p}TON3lvBX#oG-04BD;Y|8D_0;?tGC1_=+P7{Pv3-c zd0Iq*OJc}y_=l5(?7-sdpTwLml39zIbz3=R3!2nIJN%CGbySs+x2*{2)rJ&kV-Nh0 z+qHsfig?VV9!7NX7$e0YSZp;lX z2$5_wtfY>pS}^p5&G`%R6`&!YHTS_Z1B9plVN5cLgFdXMC$y;- zZ)fzb7Ndu&FR83BO0Qgg`;x0b_n zOK_8g4l;7HES(glO8$PRu&72)g)|UW`PP7#C-AEB1inYdZchh_W>r;EEJLINY1MIc zxEUp(TPmv2Fh=Yxy4~BjkPJ|kcF1?d1`B~x;$XP(5)(V2VFTX^jTh*yj3)Z+tP|7~Qvx%Pk z6n}g|fU;gr4zn|%Rw`l>=Tk@FuO030tg-mRSzBizFT!UT&AM0F7@5%2fDT3X_huSo z%(&IWcJ9x`nx^iOCt`A|s1a&t{a-1;S}mX$HOGbqzEu`AviI1F_)&6VhT8)g9q&6^ zRyS}dU4mlb!e_);D{)#ROg*LWnBwSFD8`C}q*SzPMfL|oz3?yd1Fx2-_Mo$qOH{~b z;Dzs%Kvt)rkFX$qQTrr`DwR}=e`RjkLVz7Lfd z6HM*EZL175ZB-FN=I+;Tl9OswGd?t_j16EEsDTFLE;?P7#pGe^%6LS@OIG{#0qzYb zCs%bByLg!wZ03tzdOn}z6xN!CCbIm63yl0QS2jwY;zQtK+f9ES=N=Awze7-i>3A5Q zpWRq*^7HS0^GVw85hLREVp^X^uQ9?{yVO82?`ahQXY6MjtET+SYhRaM|wK!|+v1bIvl71&-UGW6X} zpHA(%L+S4B^4I6S&O|Fr1};2ozEiG@c4+mN(@>o*o#%FZTz)q#3>H0~4ZfcINSm=e zGvUTsjr42qre@=`#&y8L>>13ZB-nG%_kwv%*vsL%?kDtgnEP}=9riYQ-yp!tO<_+( zcndc4Eu8zQr?M!aW)j!~=;3=)=c@c!zu1lWbXlFS>$2(d$NBDBrNr~0$!D=B(0)W| zjv}QXWbo)GU%i-A_0%Jm->xRqh!HqB8V9{+n+2cKDXrgTCFbyEtX#%+g zpHF^$f~L8~`3$yn{7I1ss-ymH5nYA3tjMFZb+};QA$gGt9g3j@(roQDoy?5Fy?Mzd zy@*{{?A$?kys4S=gmj;uU;%S?ux{JvF^@;Ew2}B*jJn2xK7TyXqK*S_DbaZq#~6Ehvj(`1yN$1jtuam06w znIeIwI9e{rebCM@9p8iW;Cf_Yf*l45jm2?)8v+1*cru2%2bq{jrq3|RX5>7Bv^ZSh zbLxiYA0yiaBRe~eY`$AKHHrZ( z@Y?l&n)%Kzca>vaI|cnbJDXJXQ=EwqH}c36&np8`$7`)HsE>y)@%73CTfp4F&?)kB zb-S5*!ha|4`8E%b2&iqq$?@JTsXTBf-%N3G?l=e1Io`;rV~Ff!)IaaL=+ym`5gv9x zG_#^4^^wb*YoDGe26*jEV2@LHtwjBocwEj^hv1Ps6a-Uf=VqPPfBEjs6%a zwLIG??_>qcHWC0Wn(<@U-2ym7dhTSj0y!SwFGLDCHlc|gpEcvK5@zZ_k@1JtyI!st zkt>o?Stn;*Bgs@G8*8dg{_VC)1+VklQ}t-YUq$r`qT0a24t9QrhO4rcE+dDfL#UpS zt3y5BYFaB&$rqh&esUPzo4;gC-}Fyz5(KA1{42Ope5Q=(cmISr2K|wL{j(0tUHn9L zKL>h$80=~+O3ie}7_~y!{6IxeqN8d0kz9O%*N1)P2Uox1Sa)&7J+U*l^WoQwHM70{yKQZT^Z5v>G_hu-2IWn>F*k8{A)U)>kj_Tcs-mc2$u^`-Muxm?i`1q=rNlNN5B+|q0aag`yyI$j1wv^ zZBqr{!zjk0@y7A#``%crjrXbP>W`@EPM@+HTeg&d9m_*DtqRw)tXlGN$+p5Skkc$H zd+ft$%iIu)0hzlLiTsjV(4jhE_VTHbU;107%JK1Y8 z3j)VcqZvuZ6M1#fZ4zZUm^z{g%8IV_Pzx-jn(XKGUo$q?EXhVi6Xh+3ZAG@Fy!j=LeQD*Pk$run33G)L@CEIIO5#9JR4q!TNBMhFaB z4UhAFc@U*t(Uz)|sjsOM{hcvQ3E8u}r|GVo&aYI>I;y3r&T;9G?r1uY$l}UDTBK#^ z4b~CP&pK4OjBeq!lmFD|x4ai6AePZ@*5Hk^A7&NqLbW+Zd>-Q?t_oF@(j7_d3^Lux z$RvGG-#vs*`+v?HMpz@=6C-^G0X**AzZd+Le}!DA8Ft2330Vj&TkU_SpQJsQ&M8x$ zd$$4$3gPZ;Hv_Rov)Wlu6Ke5&SPm*NRad=N4C$~tRur)t^7Hgv*G4`G^dbzhRe?{t z#ux_?VCMwi2Gmw62mcj$+-8TpWl{+Jtq}ksnPL zh+x+}tqGoHKB4EuV!QvwLw)Q`vz`;YH5S?)x3o!Ljl1?@6{4hc7(}rMrptGdjk1zj z*2jax!`|z?<^pHTzp>?_$D~wU6#kS%3dBbH=C`{iKRfv7SN`|Jui*NR3LUb~F)S#? z+Y#IENaK=h7?T{i0;m%AeX7DSaIsUb#Mcb)Tu zy;w*ctf2oM1C2s_ z1*2-zEWgQmaq>U9^gFQ?-B0>6(qd#7(b!yN$76EKRgZ~~xGk}lpJv%&3{*>E^5%Q8_Ii=nzJZSn18x1DPW+2V)b8LgnkK6T7k5RjHX4K(#SskvGqV6h zcXw%yab>ZywlT-M6=#8j!lsULte-D$=@fIqCP|te{>+yWg%4}tgTbi)z$oz`?4183 zMt7&UCn1G_NJ*yEUc_@e53%x zU4hJOnocsBm?}Os;#TNuu~k(E+ixfjI{|x+3w3{N6dwvW9$Be>N3)ez3Z&Yq><#X< zP=4pjE4(3&K>Q_nGE8vOhXD0M2PIXsPi6jAU*k}SNzB-qj9sg|3ipRfb>YUOi0;y! zv+_0W%AN@E@!G(9Awk=oUZ*gL5fPTJ&lLCIg|15 z#|uIx!_A%)_i^68??=2%4^&E33rY^ht8m{&hoMgYVp->E;KUFV`AGU^BCR+m4~;-N16-;q!c; zf1N~$-?A%LMY!!!1NOQv);j#!lnM+2{v0NId*~RyEd8*J3NnQ^x9`kJUeEQq(QU98 zcPgrS5VqFM`)3oupljU8=pdp=%y?1j+Yep-%0B`;La+Mg6|Hj0T-sfYdyHCt^VodSgi z(B`HX#hi_^tjeAY>e{8+E}Ml(8xfDQ=T)yPy%bWEzba46cmQ_=`ASNd)gknf$L%rB zA)sJyn>`s_T|bL8b6Gn;=#I<2Qc-j{rb7On?$i-g057>n^l8>8aNXZvB$#EfnRBaq zb>|@Z*YV|2#>kvFyS3*WaX>ZhT@vM4KVnZC-O79Lr2jDk2(t0jV623e%d7Vo{jAqA zYd+O+)ht4{%P&Xya_Ii(_7c>pJ*Z}P^-XuXSg9o@#G+@tmnuXfR3UIfjWuq?Ew5D} zaGQBJ|EwXMp4TZAoh(hLOBcxOF`afHn65phpZ0;v**A`d_r5Qkf5bIW_|bBQKEiF} z(^C9dKmaBw@3}jK;E;9IJ<&@J7(9jrGh^Am?1}=kWiVbIjeH6{F!w=BpPArhX%sdE zG~pR=5)ZTM(sAwaeH{Fx8wy%v9x@jer_L-;M3ir|y@^^+TZa7*YLQXi!9w1kb=uX- zIlMrj-wsp&a@-p?ZxsTBN3__u<^vVZ=+xP#73kAU`BbRL75T|qxM~@?(>KWI1wu{H zOTsOJKxtW~U(_x4eqB6xzavcfyMwNU=_ovthsC7&&tdFC&4`<_HFFMj{Yw;pPm8`88(c~NPY z|AlEK^EFE$j7e`?_&_I+2ZiEz$gV9s9nK54B>^2pKbcmdUQ-h+nMN_qd=5F4{}{QE zMtWnBFT4N{F>L|4SCW(gz`#Bk{2zkic!aH#P+e!S(PDPfyDe8e)X&MG>EGE0H66L4 zQNMAg)vqle?PLOb^M+OAIqpT2Kuu`Q;@t_9&m9^i=U1L`Xj9(&aLj+8agn%?BK)sh z1ypBw6;l3PY6MNF{jWAu`#^rxYyR{7zuQu!>RMX7t-`U`KiPh=6-R7D7_Ar_kqG6E z?Xcj%?)<4*v6t7>kN`=a&I45V!9UJbwOZr!*LjESF&vmY^{ZAHcO=hUL1sBng3uMN zFdU-U+d61;A+p~uI<}*Xi%9xsqX_FK8+0`0c&HuXXCvqV6Hy4E|L&qa^3XX8?s377 zQt^X|!39l57TJ$F1gAf>%8};@p*a|rfnYKF(-JJ`02;$fE+gG)>MJYl+>02}pgp^< zJ;Kl@QaS23XU(or)&-?TWXtT2K4=+6`g|6TC+uJX`;I8*uTn;&iXvw%qylA=2*|qU# zG49gc{F5$?4#l}y@v-rN=ps1lvPa)M;#81U7!9ojUs#mKC?Qy28hi)lZL8rD_{+)F z8hUI@C#t=;Z}Z5A0cD5ZIWX4{CCm#J|Gx8Si@PNM8gY5aBV{G>FAJ1ci#M+KS<<|J z+NTrt#RKNMtG%i-nE%Ot{l{r^Dqi?~`B+VC{22|72p0|BA87n=V%=Aw_yV5aVOwLu zY&h@Y@;;XC77%2-SZB%*Iq$GGn3oN(Z?4nS6d}K2|1(@zu$*c@qIq*pKF`N1({SF- zrFY$;{rr;fiSjHC^0LdII$?Pf#Wb5lKUFz}dQ|7eK5~d5M`k~+fsuc@_MT(Ro8WKKcI#UxZl-crCf@63;D~9H*`c)%E=u;=2 zyd!NT#1hE@uby=6k$z>pIa#OMn_TK(=ycp;syWR6=dp*-3cz`rv||0GUTmkxXrn^+ zPE31lh5eA@k>S|d%IXC7H@io{JKvX*G$8ilZL6iQ_+&R=>wWn>Qyf?Gv|lVg+u(o>AAv$-c@Yd(Sq0$o9Y*2`Z0%C< zQ}sKdNV<6xGolc52KS`KvPE`ejP+RdOx0T3eNOG&dIL9$k>fgEGrqM~0C}#W)R@@S zE~(oo9E=eQ8bVNOu`v@6epD1FvfWg#jsqR-oMxoN_S`?kIcC{%3}?id95HURyMA^X zuOF}&(1K_fx1YC-hR~u$qV4+*@$H%!z!iP6s*a3TaNQ*iMh9~dcGH5zkz@Eyy+XS` z^F6V3$XsRY67r1_(fwW+VvTT8(JF(wHZ;BXwo!;E*x<}NIt_I59vgA{G()1K7sQN> zgN&eW#!j8~!k__lQK;w<##1KD6dr{QuU&`C_WBGHC`tY+oD^Kgqg7<~GH1@$bY;9u zjPCjdO<(#W5q#hCW@aDYLSM0}i(Vl?$IKOpTK+MsDh>E8D50a6GuE)DqmOF}iu8U+ zJ`Q;i1nK~F3Bu{A1el1(VX2qz?z1akM-kP9@KtJj#D>1dN+Cyv2}le{4#OTbFEJWw zZLG-YGj^R>%`-=pQgrN}yohSSt}I$T#9(1YBwAg9Cc8LL z(Nv-Y7Ii$Ti> zsJcGWcM)s~ZPOXo{H{MJ;cdl;6g8C*LzgX4kKCAkUNsZ8`?YdFb3SBptWGWOT=kYf zF55GyMrjV4c?x5LW<4p9Hp6B@w#4n4*0&JQr8A8C3yJ2cK&o<*y__ZsPr|<(3H6y3 zL2YVEy@Bw8oj@Wkye=?F8Dis@zGaz5bDbHF!)@(0?g>}>3&=W`DZ z0%u19AuP&|8OGBdcnTatCLS6}!8pBPMy#r`eH2^^5-v|YgCA~-Ij!XQ2z#BePtx^B z_6Z$X6szsMFuUo3&bI|*yC`YU3kdaa_aAod%wakgn8kcSyd2-$u*pX1Cp;YO{Rl#^ z6cRY#*W{43Mg!|Yo%9+NKOm3IwtSN308r1TB*^0 zyH3-sepzlys8aVzfUvodGa6`B~1a^uV(GX zA^7KJpOK7AKl@@#M@+rKuUBwo`ie0(9!{gCCu1@-aizFCx>Z;k-i(>pri>v@WV`g+}2?V#oFP(~=p_I$EkgKkr__XM(w3Xj=yc9k{ zLF@5kSwLqj|LJ9y=1|N^cR@#Pjs%j>VrZ4B`ov~Nvj}9-DErc&SWHen0(!K8*uhN6 zB0w|h2cj!p%e(=dxmNkhQ5z~$eV4bOXYv`JM`Ce+!hRaM8PWU%NfYww||5F6@ z|F{1oi@s8e*V^d+$fQzk0?>l3pw%6sd?;X0%Q(zFES^ZN?zwIg+K`}TXWjU@-mD=_ zt6|)4M2;BZ%63Fy5%SnNZy&U_u+{9+GT&asDY7e~ExKP`6nq>t9BiON8*O_EIyX~# zY7lzi2GmlYE22UP4>W4Y&Kdu^*r8*B{I4#p9}Z#jN<_@iIQ9=|&^yswXp6Jx zss552`46w4(N;j78+1U0qF1RXYmypSFyq+hsMe>9@6cE%6$|ZIQYRiA{kirj22nEP zI4U0Y$VB96ic2%-kxb=TX*L#nb#vXY1cw3r?UG~n;c%qUY8dFG;qP%mU&+s|aMMaQ zHLCSAw3OFp}{%zJkk=-6hmD2 z_IU9ny|+ z5RtWXHyC<&FDir&VyFqf)ZxNO8}fsFp}T$IAkdE2xPKAJOPCo zitFFP1`0krp%p@&M!DH;uvcylv4@e}P6lf9^-mDK+6JAMe3J#gBMevx=-x(4y?6VV zdKo*VIl%EWcxCd`H;HmRBr*xv)-HMU^}E`v{!(H-Oo+OFz4=nzqNF0%od$kB^z8Pg z5;%t|J)-u+;Z1-=<1|j2>v4U0YHlO zZ-*p!JKMk@7vdW1*K!9B_@1b%-(O7PpP#LA6Sa_A3HAQ$VrK8Kpd${cN?q8MUCY5B zgj|ilv(kON%BP)Jv)o_#9b-|=H7Kb1y;IndmCAmj)Au#1IbHlf$#Ac+a&Q zco41zC@j3J&?junph%=HgM&g`+&PqEi;~aebE=!zAKg^EC8WQ2Yyv?hP_Ma#6_1AD zt@x&l$UfmG{Vv;UtiWxjRD5L#mH@?!>^AdSq89aO>uanQ+K~bHdVm<|P*up^WOI*4 z;Xr;fmlDLfnYj4Z_gwtEg7wtbz_lu%L?=$?O{h-X<^ZP%0X(Sl2(N2U-w<)3JSaR$So}EQXp2{z zHdlit@f;LYBPM$+yQohU^D>)ct*Ab76!IXLCQ`>fZXF%9M?Nx@i}k(@KWpe%YE66H z|MA|W8>Aq=xPIVifv=B=DNYs_8U#f)m@81HsrA&?q2L1qnt@5`{GX-pkVxRL?L+S& zdT>)Q%tmx;_8essf6VmwQpB6<>KdhS^(k8GYdQTd3p1a*=m|=~x$?jJS*F9FDcP$s zkwL_(kbWT0+;YxKqV|L&W*O-tn~&jg`TR{71I>S2KsF;ncPW)ve9~T_v9YhCGb3z{ zpIPYL%YAvnZ019dPK6%W7tNw-kaV`usb3sVN9liKR>BHJV~XA9R{NI;|zrl8g{wNcarAr%T0m@jE(=jY%$z6Tpg7 zU2520UX_@4>Q+qpttP(weik+E^LY!81b{AIg-*lG-7f)wW+w9c6h+#82Zt}g;4@ECz)iD{UfJdj_*HIy5$97J2ME&dXxAB2-;A7Td@+s|ilpWSt}CD57G{Q)oOE)iSQ&G<~?s!0Yx z$lZ{a=gds$ji!(<^t4?K$kWW!`rr87bc#I_-(M@HQ~BOac*CFP`Wd8h?skoAa#dHh z(ostt*=Z%QMdROs6$m5(W?O*|Rvvi7iW`?z*H`0a7cCo@Zq8FwE^j~baBQ_iQIi;P97PA26$)y?BQJpq1sI;}{gm3#h+A`m+P-V|NiBFA&# z(Xi{Gq<d!I*G)_*w94Rezj&FG885*fs)04C*4BnrY{XFhsuTB~L56~Lw#OX;0O zAFbAe)_84}|BV8r&=mK_(m(o(lZdECIax`b`_N5;OA6Qa$Uv}L& z_xd0Q=X|T)2uyJXCEvf0hYurF!6hK5VFmZH%(h3Vqz4aKW`yOgSykuS3IA2Ne(c+< znmAH^aXfD|2>NJ=ds<~k_av$deU}@mH2*0Nm>xl1PeEZFR!M8PA#e`i-F6!*jepKqUXP+cTwg}!f3g*%9Y^8G+R*=x<0xwE z(Bmiq#FilrMy}-aL+=|o{pn?cqhRuXw2yE9(LNZtRJXE8LtF{7*D|Y}C|la? z<5x-6w9cFLS~Lg4)((z$g_4s-74Sr$v{PvSrQI9MLHD9d5s*Q(h6OGP8HLspBPXa* zT`jcGaXs;{5u`|1K#!3G56jK$)vuuR?lBT1r$b|DK@)}hf3%OX@mC?I%@nql*JBzv zIh~${J4V~hCa(P-?c=BvI;12hX*pa$)zQ-06Zyi8Rmq794eX?~fLkyDcW1N1=;mkc$&!X%g^PT#A|ZJ9Z|!2)PRzbur~Qn{kO6;8)B105f)Pr`X>OrVmu%CAW}Btov1l;y z6jbrZ<+ZD#_u2fG0&>3|9~s@Hf{)23vR&FX!!l8#3i9iqo@ye-?K4ySlIWUJB`3YJ z1vcdB`k_U^{y~fCDX05paXM5n^XZ~u$hcLT!gAfu>Siv=-`zuF(7Lj z6+5$vpS}XSfc}I}(hY2F+&>T31%Eo)MO&`BTQ%-G);v7FixXL)gglR^7yK-YUFgGq zJ@rnn)%hTIvrdaygdozJdWi-{3)sQKRTAbQnG5))O@M5lgtWPA{PC+3S4i;RmYbT+ zN7fo471&ZrpGv}~&!+)15}(r~B-6h!FpB9i8#d7te}&zfo|-G;z=s}-eU%?@Z!NtH zZh=;x=-P~aG2pdcfV;uDqS*q%Btld?C4t|?tqX--446wZtrG!SZLU8S;Gy{6gy8dY^C17as_yl-nfpZqJ|B4m zv;q;O&1$&TlGcUY2B6YKMY;ZkC=(LKC8RE9x)sX8u?t+w4inX2+%NB-?{;y zG)z}MGBw)`)Fo@p{}Fujp@%%A{!hoI5tyY0%O&6V|CMpx(QtO(9)ATPCR&0KM2QHZ zi{6PEy^lItkPyB18e;TlQDX#&FnSB4M(;#t^v;alnLG0S?!D`-``^r3XFbm|=b3%Z z+28%yUzEhHYx}zDmOmTVTaH+li~|#v&=6WtPUcRU_a<=&W4-$mcn;5u6&|aL4gh?N zP3mIK2NwnP01I86IhL{FurF&Z7lQ2dl0|f$*|nVVwEV@>{FFzEtY7ruxNQgZK_Ra^ zffwAhsU&ixQh!AP1)XCUqU^&}WPu4P<%canC<23bz&)idPFIMEL0%oc#2JR$YYC5T zSvy)61$!B2B5!NsvNytC$;{)3B4Li|zxXcY#aw%>)v-cXa~tg1eiVBD408QoA8r@+ z)hlf+e7|(IYJ}~hF*(+&Hv9X)-q@Xp3sP7koi8%_rWZ=5L_yxfe#n({`MV-{Y}<1; zJ@C{VPd<+b2_)Pc*Us0ax5wxSC0=&Q$5T5f*$q1HZac8VK{pW~_3CiyQv-2Rl~71Y zI;7WHl_8RJ@MHbg`^1!KdL)^aD^R!CTII{BPLbLpMFr?L@j zH|6Z1s@%2ccWc8QZpXtycMJaB=)RG-nf4YUs`9-dcGv2xT%+Q!&(mlKRcX*y<%4Rd$=aXC=2&7<&R<~lIEmOZ%1T$pvwtzb!FC>{BCBS zea(Cq{WFHR$3y&C9mPu0o@hJs9^bp`B`;Vq+?!J zeM2Cz7gj4UPhAqIQH5v}g3&<7xI%H~uGn7n0MiD;v1mfe!Ep;H_w+4$l4*BEmhnY2fYknqyhWv4$T!F^vnt}u8BD_}NZp(_Q?Tz+ zOh!`FsL~^oeZ=WZaT<op9A1_04CQTvo_dc7o7k6Ru#y*6ex{$ zQm$UVuN)F$*&&##4uZ!*U+Gg&ka7D0c0QG{fTW{Qiv{hY^v$bFU|_$aD`r0L^?YuI z8IaHKk8>&HocCi|NNM1DMvplHt=_ry083TSXNbq@QPv1P!Ig{DoD3Jzx!cGBZHh;r zCoI@FY`vjUK`g{cxNtv+qMdUV$wajI;$VeT=tVr$G3{C?Rn2LW6Ldel!)(F%M?xug z8I(0;M0%I~lo@>cCq*oBbTL)(r^hU`%FlPSM}X2FSqH!E3#W#qlir+6kB{_I2a>=& zWpy=sn$^msQsy+DmiS%v*haH0)|4IoSR2Vu6Uy=(kwyF3`NJ0`7bQM`8Ke<6;VixqdPUk`t`nV0cl=ITjh{uhoM z0=G0z6Y3R-_s0HgpHj2tPFB3%;bK}Vv8Cdl9TR&Hk^-KC1Kj2X8#^p|m#eG!M?MH5 zhV3!84A^S|L^{LFAMd$k+fAK(Pzq{YUD7VR8eZ$!UzMr5)LoL;^oVnIx7YeHcjhkH z#J_E%shK#`s7=-#*CfpL0s3T?YJ04JI@5It2etghVx6Yz;Ay`3#*{>VN7B1`7ApTi zj8%*M2iwS4O1&p0-t+dQb;X52^*w>#Uen$-)d=MMNb4C-;p10Ajo=}V(9RrWor2Bh zr2~iAajdhgX8!%(^7g2F+>J^StU#^|7HiTQVYFlPwF6xFzRj1Fspmr)vDff|7r!pY zK0|8}QzR!GTxS&n>}0EBCW1ppXok}G*Bx(COR%M#7^7LG2q>kmyKf+8B1Bk3H0@`M zABoS}MCLsAzlw`5G1Hk$>{6XS*Y3?1;n-Ek7MKBNpl1n^TSi}B+$pL=r8L=trEB8- zMnH_@{VjONjWEDrZZmv}xkK8-1sq5+SyBc|X0O|=73m1_%WIG73M*f%-QI4DXiLI# zu>!AZD1qp|NS%*a(s^G}I+AO&u;myxr7A}uB*ib zPKa11@2kjvSF7cv+CGREcH3G~XXDf}?N8&Yr90zOaXoV;gH@Ysw`n_Be!$5$Pdq2_ z9<}WMlx`YGxe5!|Ezh)hXYi11!g4D8q4h`1CyK`uZvuo**~S59y<97bHOTyui?^fq zv>^@8#KbJ$BQ1@M<7D(wd#4nX(-cC~^4;zA#i|ubpkpxT(V2PLc$3Gj74`QF{`9+01{(A^FpmmbOj+bK#f)6fo>Yo<0Jo_e zebt6qGBb8ZqfJFTWi)jRaX9Y@;k5QQ45@;E1QeERU%*M~-;HOiw3^O=lJj+y;U|dTz z!VlIJaaCa`^guc`KZy0yN!z)c3%8^&kwuEKSIn@!(&Z#a-FU-1(v*9l;dfdQjiE-* zbxj_>vj;Wx?R;=X>lwv-r&lCbbZVE!d>D?kd$}n#yEVDE{X}pTKT&cAvLgEyL%sCB zv_BFSFbdGbU#PoM%K=+|A81+~CF*muZ8b}nK7M~H$j5(KVOcV$UZ^%CVm&?~1co&Y zC!5kXNHH^Gn)c4n7ax9L|CPDs<$}5ICm!pi@k;A8*7+o(!Vba8F2%!J6+9$-NO$eh zeb_fJBEg03sgZ8-_givvY8@Ekg$!4;JhT!8#t+ z{}jTI_1ZYRjOU3qHy&Mj;z-JZObh?%Qt;uTeA6z~+6IK6}8e8P*khgiG+uEDv zIH^bw#rm?rulI7M?`95umtRhNQ}(lmoeBx`b6r$kSEP*|LP!=SuMKxOA$uLxb{{k- zi~$|3Co-Pt9XOW$eTP7Bw~zQJ`t+Ofm~+$N0GE4&h^$GJD5D0g5epL`($(tz;lRYF z#ck^&&Jr)QXR}D2ZAl!bE`7AF*{>ye8Sa&PA{%Y};)}<-xMv!}bL+497M5ont6)-; zd5ctH?6jE!bG+s`5AJsjz~xF?$#9D!@kX4%34xPjJ$eh}!jG3B5@Zkq9@$6MnUPn#9X8HQl*-eSLSU8OP7`>@lIh|H z?{<9hWFl&w_NHqLP6c-3LmJI12JznlU9i8nA;UfmtXe9uk>I$oXuMvFC#&f}C!!;o z+E>kdy*MXTZs`izU;jcv^w0fiY^>M1M=V`j-iBXvd*qa?)v|r^jg-S}d#e8^gcu0O zl?Sz?v0CdEoa-I`26B1zMi@(TM`*eoppUXiVx@x)mHL0CKkQoX#Uwqatj(C@OT1Jp zTKH5*@+kVMeI|{zYik+K!t#(E0PuRp)2}#IOk|N9?%Z?-5c&Rjl_WnhUhSt?v!`*t z>KH6gpSU9&t~eb*dp(A93^enq6=W@ULpFMw`j9@eW_-mE#c|ytcnf;`S3`D}o#Beh zs=HcL?()18XJ{mGI<9F)O}wr#6%L6*+gbck~G&O{Mo0A^$ z<^>fORdf8r+emTx;g=TXzyS3J6YFdXl^qkk6nadv2R%DgZuShTwM>a!E7`qC0kEsE zO)X#w3Dgch?-AgxNZ9?vfDHO-M06yaLiz4`4?zXbbP|l;4eH zQm0HBmLP>5_ZmTf9citYB~7_2*8={r1o0w9wUG`Vt!ac-xTaHlNkU5$}5?1H0M& zfgaCHsVXF6>kXz^#_c&cMkKMn@Q^Ko{GFg&LP$ttyek04$4%0n?PWk0-t*yj>#oeFivn6)^Y}%x&(+ zgoR#pHBDKf*>q9zd_L8GvX_2;WY%SJ;iO=bo0l9aP-}$j#ZIk&TpawC2+W+?D{d17 zlpAhWDbEiwP>Tkz)AIf1`u_T>4Fs5svu1t(B{>H@desF^IsgG=71Kc+vg^2QLz9kn z#{>{Qe1&`U>kK(AQo;%AOs>rf?8IMU_j;e$UYs&MheRn;BxC9;8I*kZ`Qgkopo8=J z2s*y^W~JFTIx69oFC~uFCDUoawFwTpNoZm8>UQieJ^hZhUiktq&AKe!juc*Y3SF0L z`e-0|XIKRaA8|r0n2*<9PG3O?4K<)M?y@iscP`_N0f%`{O}ezWcbrfeOLRA{G0c|l z$tiTU-NWR6iE^gFzlmc>;$=r}_S$<4xqE_F4FFN52eb*j$HZi=_}+ zGVbvk6^V|F5Xj!;a+-$0_?o>0&#O#lESNBbO)c3mFS+!JY;h0N`zgbkK<|abMzqy) zlaWl56T<#@AAKfAoboQ@kW%zF}zaNwq;eCHxVZnE$0V{+H7D3xwYV@SQ=={|CbF zbjH8H_)JbkMMdkLb2Q2PQ+R?#B)oo<6<;D1)BeiW*$R>`x5EJi;PUJM~P zbN)GdzrLjP!ktI9AjLdi78t{Yrv#>2G67) zvQeSgZ^iR+;U66&8z+|l&2Go3g+;QM;hQ=VmFwUF{-#+WblBlzXr3?K(_|DFCd2xO z%7b6Fl&|TL_~gFv@ofMqa4)?VEhLkF$Db4$V8HCPDeNwJY~P1E!DOt|o(|C|@Je>7 zvA}+g3RzhRTZ)t^pf!ztfbr)f1?Tpo_7K04t!mc4W)vcjgJd`xhSG?ln~U2?pLqH; z5n~Dpt=uf-i9=!yId>tSzWg7k=HJ(4GL$EYR&_g3DE%}6Gsu|qrWx`Ez?wSH>z^0y z(%^q>Me!L#uyM7?n0j8t-3k}oPCV7Ld~L~ReZ9H40xo zCk=h-x&)fadA3auq9PZWXB%$WcV?U{0=S16l7-D&;6tn9>oKl#)cE8AX^HEb)y%*P zMYro8T^DE#B97McZukOPuBya5LlV^@jeX>sIQ7S5SRTXC{L@X3!V-Dk3%@|^6NiC^h2lg>U3 zQcAw?Id0ZUk@+C@YUg61c~KC%56ZL~$WBbjYafZ0eR3xn%Rb=d*87J!aP=nOVf&`` z2=k0ybIJHoEkB=tHjDK<{)kBeKshqaeDG!PMs|RNk4<}LmG0Ll&I&6abFy=OZazO@DvIwII#t{y2%5McIcXxm@|lW z=AH-ErWkOTUG1h>tRMxEu>qRyIS3Y3j1^YGKrepDC+t@sAWO6ckJU`7k~CS~D2W9a zwIQT;1fPN392&=LddNnhrfn+zfy9h_I&l1H&X_&1EM=AyNAw zQ{N3$(zkok-eTzEBTS13#y&={c+=W43&-v`41BFBnfK#WI1hsy(NCIRlYuO8xlc|# z`5~}o#v&Tc>7sk|o0bKU&A(5mMC`x6%)xBU^P!Vj8q{8!EmenUqBjwPFDX}iM_%C2 znKOCP$Y+^F;16>*ifjZfHRPOK1ynCemr{Pr@^a%lX#gu4QPsJ#f4cEegc%{atIeMRHV$RHJR3Z|hmmZrwvI9dEsIhk4kiWGyr!#jPA0F$IfyUa z*c~&6w%zpVDsxseO!0mCuBsoG9$vdr;v7hBT4&1v9* zNjEtGTrycZ_nTY@Rk>tgwj?HQ1o$_(t!a308=O7i9EmQp{6Awmoift<>BH!Q@meAC zKr=Vh6BTA5$t~aw$0a8Ea-t9c<8{CqwV=-wA&HhkH9WD(Z?PVc?y}&9v2kV(^GbI= z(nuI)#CQn8Z0B4~)cpdu&aW>_v6e3{Bb6a`v%YfY#7>jBnHnnD%>mI*eR)Rii??QVaqP1Wd0k$Zy$_41X&-x*9hoX&K zN%41U%;wix2e<{~760@DrRy{Nz)o3`M0{HuuCCk82kLaDzgcmqaReE9JbiYKyPqh^ z3nkKCk4+Qu{K5E#_$eDMAPo2mk>ev5JOQ6CGNxeU(C%ckFOlMa&`9VjsayBObJSW9HclbO!78A4(!xh49~mAS5ku>SET_uGG2Gp4ds%t!$gK zw>5YfJ0cK!(muqutGSy)YCp_Aa1)usUHh>0us3G^5u4<(`&i}dJn+RY6g8dKB2;=h zU5&UjSNV8AjZ+KHED{K)WLTl}ka!bw6RpY}AmjaY*eOQy{+4IL?=wO60LEuq^R8p? zTgljJF=iCt?CF+S^_RC6E5ZViw1`xayLTTng Documentation -cats: - - id: whats-new - title: What's new in LTTng 2.7? - - id: nuts-and-bolts - title: Nuts and bolts - cats: - - id: what-is-tracing - title: What is tracing? - - id: lttng-alternatives - title: Alternatives to LTTng - - id: installing-lttng - title: Installing LTTng - cats: - - id: desktop-distributions - title: Desktop distributions - cats: - - id: ubuntu - title: Ubuntu - cats: - - id: ubuntu-official-repositories - title: Official repositories - - id: ubuntu-ppa - title: PPA - - id: debian - title: Debian - - id: opensuse - title: openSUSE/RPM - - id: archlinux - title: Arch Linux - - id: enterprise-distributions - title: "Enterprise distributions (RHEL, SLES)" - - id: building-from-source - title: Building from source - - id: getting-started - title: Getting started with LTTng - cats: - - id: tracing-the-linux-kernel - title: Tracing the Linux kernel - - id: tracing-your-own-user-application - title: Tracing your own user application - - id: viewing-and-analyzing-your-traces - title: Viewing and analyzing your traces - - id: understanding-lttng - title: Understanding LTTng - cats: - - id: core-concepts - title: Core concepts - cats: - - id: tracing-session - title: Tracing session - - id: domain - title: Domain - - id: channel - title: Channel - cats: - - id: channel-overwrite-mode-vs-discard-mode - title: Overwrite and discard event loss modes - - id: channel-subbuf-size-vs-subbuf-count - title: Sub-buffers count and size - - id: channel-switch-timer - title: Switch timer - - id: channel-buffering-schemes - title: Buffering schemes - - id: event - title: Event - - id: plumbing - title: Plumbing - cats: - - id: plumbing-overview - title: Overview - - id: lttng-sessiond - title: Session daemon - - id: lttng-consumerd - title: Consumer daemon - - id: lttng-relayd - title: Relay daemon - - id: liblttng-ctl-lttng - title: Control library and command line interface - - id: lttng-ust - title: User space tracing library - - id: lttng-modules - title: LTTng kernel modules - - id: using-lttng - title: Using LTTng - cats: - - id: instrumenting - title: Instrumenting - cats: - - id: c-application - title: C application - cats: - - id: tracepoint-provider - title: Tracepoint provider - - id: lttng-gen-tp - title: Using lttng-gen-tp - - id: defining-tracepoints - title: Defining tracepoints - - id: using-tracepoint-classes - title: Using tracepoint classes - - id: assigning-log-levels - title: Assigning log levels to tracepoints - - id: probing-the-application-source-code - title: Probing the application's source code - - id: building-tracepoint-providers-and-user-application - title: Building/linking tracepoint providers and the user application - cats: - - id: static-linking - title: Static linking - - id: dynamic-linking - title: Dynamic linking - - id: using-lttng-ust-with-daemons - title: Using LTTng-UST with daemons - - id: lttng-ust-pkg-config - title: pkg-config - - id: tracef - title: Using tracef() - - id: tracelog - title: Using tracelog() - - id: lttng-ust-environment-variables-compiler-flags - title: LTTng-UST environment variables and special compilation flags - - id: cxx-application - title: C++ application - - id: prebuilt-ust-helpers - title: Prebuilt user space tracing helpers - cats: - - id: liblttng-ust-libc-pthread-wrapper - title: C standard library and POSIX threads tracing - - id: liblttng-ust-cyg-profile - title: Function tracing - - id: liblttng-ust-dl - title: Dynamic linker tracing - - id: java-application - title: Java application - cats: - - id: jul - title: java.util.logging - - id: log4j - title: Apache log4j 1.2 - - id: python-application - title: Python application - - id: instrumenting-linux-kernel - title: Linux kernel - cats: - - id: instrumenting-linux-kernel-itself - title: Instrumenting the Linux kernel for LTTng - cats: - - id: mainline-trace-event - title: Defining/using tracepoints with mainline TRACE_EVENT() infrastructure - - id: lttng-adaptation-layer - title: Adding the LTTng adaptation layer - - id: lttng-tracepoint-event-code - title: Using custom C code to access the data for tracepoint fields - - id: instrumenting-linux-kernel-tracing - title: Tracing - - id: instrumenting-out-of-tree-linux-kernel - title: Instrumenting an out-of-tree Linux kernel module for LTTng - - id: proc-lttng-logger-abi - title: LTTng logger ABI - - id: advanced-instrumenting-techniques - title: Advanced techniques - cats: - - id: instrumenting-32-bit-app-on-64-bit-system - title: Instrumenting a 32-bit application on a 64-bit system - cats: - - id: building-32-bit-userspace-rcu - title: Building 32-bit Userspace RCU - - id: building-32-bit-lttng-ust - title: Building 32-bit LTTng-UST - - id: building-32-bit-lttng-tools - title: Building 32-bit LTTng-tools - - id: building-64-bit-lttng-tools - title: Building 64-bit LTTng-tools - - id: building-instrumented-32-bit-c-application - title: Building an instrumented 32-bit C application - - id: running-32-bit-and-64-bit-c-applications - title: Running 32-bit and 64-bit versions of an instrumented C application - - id: controlling-tracing - title: Controlling tracing - cats: - - id: creating-destroying-tracing-sessions - title: Creating and destroying tracing sessions - - id: enabling-disabling-events - title: Enabling and disabling events - - id: basic-tracing-session-control - title: Basic tracing session control - - id: enabling-disabling-channels - title: Enabling and disabling channels - cats: - - id: fine-tuning-channels - title: Fine-tuning channels - - id: adding-context - title: Adding some context to channels - - id : pid-tracking - title: Tracking process IDs - - id: saving-loading-tracing-session - title: Saving and loading tracing session configurations - - id: sending-trace-data-over-the-network - title: Sending trace data over the network - - id: lttng-live - title: Viewing events as they arrive - - id: taking-a-snapshot - title: Taking a snapshot - - id: mi - title: Machine interface - - id: persistent-memory-file-systems - title: Recording trace data on persistent memory file systems - - id: reference - title: Reference - cats: - - id: online-lttng-manpages - title: Online LTTng man pages - - id: lttng-ust-ref - title: LTTng-UST - cats: - - id: liblttng-ust - title: LTTng-UST library (liblttng‑ust) - cats: - - id: liblttng-ust-tp-fields - title: Tracepoint fields macros (for TP_FIELDS()) - - id: liblttng-ust-tracepoint-loglevel - title: Tracepoint log levels (for TRACEPOINT_LOGLEVEL()) - - id: lttng-modules-ref - title: LTTng-modules - cats: - - id: lttng-modules-tp-fields - title: Tracepoint fields macros (for TP_FIELDS()) diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 0000000..f03fc12 --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1 @@ +check diff --git a/tools/asciidoc.check.conf b/tools/asciidoc.check.conf new file mode 100644 index 0000000..9b748dc --- /dev/null +++ b/tools/asciidoc.check.conf @@ -0,0 +1,31 @@ +[attributes] +note-no-anim="note-no-anim" + +[macros] +(?su)[\\]?(?Pman):(?P\S*?)\((?P
.*?)\)= +(?su)[\\]?(?Ppath):\{(?P[^}]+)\}= +(?su)[\\]?(?Pdir):\{(?P[^}]+)\}= +(?su)[\\]?(?Penv):(?P[a-zA-Z0-9_]+)= +(?su)[\\]?(?Pcmd):(?P[a-zA-Z0-9_-]+)= + +[man-inlinemacro] + + {page} + {section} + + +[path-inlinemacro] +{path} + +[dir-inlinemacro] +{dir} + +[env-inlinemacro] +{var} + +[cmd-inlinemacro] +{var} + +[tabledef-default] +style=def +def-style=options=("header",) diff --git a/tools/check.py b/tools/check.py new file mode 100644 index 0000000..187cd1c --- /dev/null +++ b/tools/check.py @@ -0,0 +1,173 @@ +# The MIT License (MIT) +# +# Copyright (c) 2016 Philippe Proulx +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +from termcolor import colored +import lxml.etree as etree +import subprocess +import argparse +import os.path +import sys +import os + + +def _perror(msg, exit=True): + print('{} {}'.format(colored('Error:', 'red'), colored(msg, 'red', attrs=['bold'])), + file=sys.stderr) + + if exit: + sys.exit(1) + + +def _pinfo(msg): + print('{} {}'.format(colored('::', 'blue'), colored(msg, 'blue', attrs=['bold']))) + + +def _get_script_dir(): + return os.path.dirname(os.path.realpath(__file__)) + + +class _Checker: + def __init__(self, infile, verbose): + self._infile = infile + self._verbose = verbose + self._has_error = False + self._set_paths() + self._pverbose('asciidoc -> DocBook') + self._build() + self._set_root() + self._check() + + @property + def has_error(self): + return self._has_error + + def _pverbose(self, msg): + if self._verbose: + _pinfo(msg) + + def _perror(self, msg, fatal=False): + self._has_error = True + _perror(msg, fatal) + + def _set_paths(self): + self._indir = os.path.dirname(self._infile) + self._imgexportdir = os.path.join(self._indir, 'images', 'export') + self._builddir = os.path.join(_get_script_dir(), 'check', os.path.basename(self._infile)) + self._outfile = os.path.join(self._builddir, 'out.xml') + + def _build(self): + conf = os.path.join(_get_script_dir(), 'asciidoc.check.conf') + os.makedirs(self._builddir, mode=0o755, exist_ok=True) + cmd = [ + 'asciidoc', + '-f', conf, + '-b', 'docbook', + '-o', self._outfile, + ] + + if self._verbose: + cmd.append('-v') + + cmd.append(self._infile) + res = subprocess.run(cmd) + + if res.returncode != 0: + self._perror('asciidoc did not finish successfully', True) + + def _set_root(self): + tree = etree.ElementTree(file=self._outfile) + self._root = tree.getroot() + + def _check(self): + self._pverbose('Checking links') + self._check_links() + self._pverbose('Checking images') + self._check_images() + + def _check_links(self): + sections_anchors = self._root.findall('.//section') + sections_anchors += self._root.findall('.//anchor') + sections_anchors += self._root.findall('.//glossary') + links = self._root.findall('.//link') + end_ids = set() + + for sa in sections_anchors: + end_id = sa.get('id') + + if end_id is None: + self._perror('Found a section/anchor with no ID', True) + + end_ids.add(end_id) + + link_ends = set() + + for link in links: + end = link.get('linkend') + + if end is None: + self._perror('Found a link with no end', True) + + link_ends.add(end) + + has_error = False + + for end in link_ends: + if end not in end_ids: + self._perror('Link end "{}" does not name a section/anchor ID'.format(end)) + + def _check_images(self): + image_datas = self._root.findall('.//imagedata') + + for image_data in image_datas: + fileref = image_data.get('fileref') + path = os.path.join(self._imgexportdir, fileref) + + if not os.path.isfile(path): + self._perror('Cannot find image "{}"'.format(fileref)) + + +def _parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('-v', '--verbose', action='store_true') + parser.add_argument('infile') + args = parser.parse_args() + + if not os.path.isfile(args.infile): + _perror('"{}" is not an existing file'.format(args.infile)) + + return args + + +def _main(): + args = _parse_args() + checker = _Checker(args.infile, args.verbose) + + if checker.has_error: + return 1 + + print(colored('All good!', 'green', attrs=['bold'])) + + return 0 + + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/tools/docs2json.py b/tools/docs2json.py deleted file mode 100755 index 66977ff..0000000 --- a/tools/docs2json.py +++ /dev/null @@ -1,326 +0,0 @@ -#!/usr/bin/env python3 - -# The MIT License (MIT) -# -# Copyright (c) 2015 Philippe Proulx -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -import re -import os -import sys -import json -from termcolor import colored - - -_TOC_PATH = 'toc/docs.yml' -_CONTENTS_ROOT_PATH = 'contents' - - -class _Link: - pass - - -class _IntLink(_Link): - def __init__(self, section): - self._section = section - - @property - def section(self): - return self._section - - def __eq__(self, other): - if type(self) != type(other): - return False - - return self._section == other._section - - def __hash__(self): - return hash(self._section) - - def to_json(self): - return { - 'section': self._section, - } - - -class _ExtLink(_Link): - def __init__(self, url): - self._url = url - - @property - def url(self): - return self._url - - def __eq__(self, other): - if type(self) != type(other): - return False - - return self._url == other._url - - def __hash__(self): - return hash(self._url) - - def to_json(self): - return { - 'url': self._url, - } - - -class _SectionInfo: - def __init__(self, path): - self._path = path - self._in_links = set() - self._out_links = set() - - @property - def path(self): - return self._path - - @property - def in_links(self): - return self._in_links - - @property - def out_links(self): - return self._out_links - - def add_in_link(self, link): - self._in_links.add(link) - - def add_out_link(self, link): - self._out_links.add(link) - - def to_json(self): - section_json = { - 'path': self.path, - } - in_links_json = [] - out_links_json = [] - - for in_link in self.in_links: - in_links_json.append(in_link.to_json()) - - for out_link in self.out_links: - out_links_json.append(out_link.to_json()) - - section_json['in-links'] = in_links_json - section_json['out-links'] = out_links_json - - return section_json - - -class _Registry: - def __init__(self): - self._section_infos = {} - - def register_section_info(self, sid, section_info): - self._section_infos[sid] = section_info - - def _resolve_in_links(self): - for sid in self._section_infos: - section_info = self._section_infos[sid] - for out_link in section_info.out_links: - if type(out_link) != _IntLink: - continue - - target_sid = out_link.section - target_section_info = self._section_infos[target_sid] - target_section_info.add_in_link(_IntLink(sid)) - - def to_json(self): - self._resolve_in_links() - sections_json = {} - - for sid, section_info in self._section_infos.items(): - sections_json[sid] = section_info.to_json() - - return json.dumps(sections_json) - - -def _perror(filename, msg): - s = '{} {} {}'.format(filename, colored('Error:', 'red'), - colored(msg, 'red', attrs=['bold'])) - print(s, file=sys.stderr) - - -def _pwarn(filename, msg): - s = '{} {} {}'.format(filename, colored('Warning:', 'yellow'), - colored(msg, 'yellow', attrs=['bold'])) - print(s, file=sys.stderr) - - -def _get_files(root): - files = [] - - for dirpath, dirnames, filenames in os.walk(root): - for f in filenames: - files.append(os.path.join(dirpath, f)) - - return sorted(files) - - -def _get_toc_ids(path): - p = re.compile(r'id\s*:\s*(.+)$', flags=re.M) - - with open(path) as f: - orig_ids = p.findall(f.read()) - - ids = set(orig_ids) - - if len(ids) != len(orig_ids): - _perror(path, 'Duplicate IDs') - return - - return ids - - -_id_re = re.compile(r'^\s*id:\s*([a-zA-Z0-9_-]+)\s*$', flags=re.M) - - -def _get_sid_from_file(path, c): - m = _id_re.search(c) - - if not m: - _perror(path, 'No ID found') - return - - return m.group(1) - - -_ilink_re = re.compile(r'\[[^\]]+\]\(([^)]+)\)', flags=re.M) -_elink_re = re.compile(r']+|\s*)>') -_name_re = re.compile(r'name="([^"]+)"') -_href_re = re.compile(r'href="([^"]+)"') -_classes_re = re.compile(r'class="([^"]+)"') - - -def _register_section_info(registry, toc_ids, path, c): - sid = _get_sid_from_file(path, c) - - if not sid: - return False - - ret = True - ilinks = _ilink_re.findall(c) - elinks = _elink_re.findall(c) - section_info = _SectionInfo(path) - - for link in elinks: - href = _href_re.search(link) - name = _name_re.search(link) - classes = _classes_re.search(link) - - if name and not href: - # simple anchor - continue - - if classes is None: - _pwarn(path, 'External link has no "ext" class: "{}"'.format(link)) - classes = [] - else: - classes = classes.group(1).split(' ') - - if 'int' in classes and 'ext' in classes: - _pwarn(path, 'External link has both "ext" and "int" classes: "{}"'.format(link)) - elif 'int' not in classes and 'ext' not in classes: - _pwarn(path, 'External link has no "ext" or "int" class: "{}"'.format(link)) - - if href: - href = href.group(1) - - if href.startswith('#') and 'int' not in classes: - _pwarn(path, 'External link starts with #: "{}"'.format(href)) - - if 'int' in classes: - ilinks.append(href) - continue - - section_info.add_out_link(_ExtLink(href)) - elif not name: - _perror(path, 'External link with no "href" or "name" attribute: "{}"'.format(link)) - ret = False - - for link in ilinks: - if not link.startswith('#doc-'): - s = 'Internal link does not start with "#doc-": "{}"'.format(link) - _perror(path, s) - ret = False - continue - - target_sid = link[5:] - - if target_sid not in toc_ids: - _perror(path, 'Dead internal link: "{}"'.format(link)) - ret = False - else: - section_info.add_out_link(_IntLink(target_sid)) - - registry.register_section_info(sid, section_info) - - return ret - - -def _docs2json(toc_ids, contents_files): - ret = True - registry = _Registry() - - i = 1 - - for path in contents_files: - with open(path) as f: - c = f.read() - - ret &= _register_section_info(registry, toc_ids, path, c) - - print(registry.to_json()) - - return ret - - -def _check_non_md(files): - ret = True - - for f in files: - if not f.endswith('.md'): - _perror(f, 'Wrong, non-Markdown file: "{}"'.format(f)) - ret = False - - return ret - - -def docs2json(): - toc_ids = _get_toc_ids(_TOC_PATH) - - if toc_ids is None: - return False - - contents_files = _get_files(_CONTENTS_ROOT_PATH) - - if not _check_non_md(contents_files): - return False - - if not _docs2json(toc_ids, contents_files): - return False - - return True - - -if __name__ == '__main__': - sys.exit(0 if docs2json() else 1) diff --git a/tools/dotlinks.py b/tools/dotlinks.py deleted file mode 100755 index de9b30b..0000000 --- a/tools/dotlinks.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -# The MIT License (MIT) -# -# Copyright (c) 2015 Philippe Proulx -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -import re -import os -import sys -import json -import graphviz - - -def _get_section_infos(json_path): - with open(json_path) as f: - c = f.read() - - return json.loads(c) - - -def dotlinks(): - section_infos = _get_section_infos(sys.argv[1]) - digraph = graphviz.Digraph(format='png', engine='dot') - digraph.attr('node', fontname='Terminus', fontsize='8') - - for sid, section_info in section_infos.items(): - color = '' - style = '' - in_links_count = len(section_info['in-links']) - out_links_count = len(section_info['out-links']) - - if in_links_count == 0 and out_links_count == 0: - color = '#e62739' - elif in_links_count == 0: - color = '#fae596' - elif out_links_count == 0: - color = '#6ed3cf' - - if color: - style = 'filled' - - digraph.node(sid, style=style, color=color) - - for sid, section_info in section_infos.items(): - out_links = section_info['out-links'] - - for out_link in out_links: - if 'section' in out_link: - dest = out_link['section'] - digraph.edge(sid, dest) - - digraph.render(filename='linkgraph') - - return True - - -if __name__ == '__main__': - sys.exit(0 if dotlinks() else 1) -- 2.34.1

E)1MUgTbY-BH1g}wr*_hiVt57r<#~2wO@Se;D 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 ULi!HfW&j>{b&YP9-ExTf9{}tpIsgCw literal 0 HcmV?d00001 diff --git a/2.7/images/export/plumbing-lttng-cli.png b/2.7/images/export/plumbing-lttng-cli.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5e24a6f027576663afc5855f4e23019d4efbed GIT binary patch literal 41622 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 b8v|(~ZSwvjP5^A| zVEuA$mQ>|7OfyxbgOstt;L8!(O5hRi>adQT(*9X?JFGJaTMqX+gIm;R2NCX3QUZrE zeMi!wo^tSLAWXoE?NH?qc*R5ps85i-qj_=95Qa9%|NVdpAkH2h4pjr{W3E<{d|S7Q z;-`#*E=StrMpX$*$2R!anXBG`<$=e=( zw}-u3>Q5qN@B#e5`iA3Yo4%kU`WL5Tyx|0X0szy8;V*X}l|>fFNmJ5G8gCuS<5P@boWrI>ug~MVKJB}^fLxIm zeMeQIqe=sCB5s55YxFNHF)=|QR+zP%!VnSw!8vmd6b0G=Ar=A<38dffq@MxJWe)B?z?$JKVEB0RiZ@rLNy?9uS-`w0xA#t9M%>l(` z*aA*wC>NlpNYAoO4@8xoLuFKsxQH+%3DocG_2J74K^GZe_0PZa5b!JWHa&pUfgt{R zbZwT?T@9tSJy3jd9w>A{{R2X69I;IWu&ZW@!qsweaA0-~FLYjjK2S?sT)bm*s+N-i zn)>v~hEzPZCt4GTV8G8h#I0WJ=SRg&m)K8!FPn4eFLZzp{{556_{xPjbu+cQ*Xt1- z@CIqRgohWD!AhF!E=|0d`tLKGu`1w-T{^lakZ5x|FS8A}lpf^#n|R`#YoH^6gytRI z?Dv7$jnXd)ZwLU#{C5;wyp(&urx%Y8`*0=kVxR$c_{-NGq zd)$QvT0Z$9>3!QB!dSug<3afTo5z0)hMfOCk77>*F0M&Yu+~X30@)T;6R>&r%XU)J zV&dU|y3D-`#6db<)OPf87N^_f*mdd}fg2AtuQAwP2z}un&Af0$=!LtivtG_v+#V#N z&P1pTIJo;rdejv)D$;%=&GqHBw>nFE+mV)=0?ifRdjke62Nhw2O52H|kj06x+<>zR zWE-)lj0#V!cyixMA|2(PUDz*l@i+{5?IqWr*f?`K+i#lOYeDX>Wl&!FJ7ELn;1&w2 zMX$W02_<{mi&Uo*LKkx6i!pIGJ_7f&a8)D(QIj}1Ot=LOk^D${3}G6!y-@i4J#CW1 z<~0Yz>e^*~y=dGlj$WXFFq;kbAoUA7L=he z&7&uh!NE%i1Fm zwf{^!|KuVw23{#v-m+{;3m=TWE2zEje0m(H{dU%=)1!dG-IX7AnF6J#CxV&+{xk+W zmuVSHH6~dnP1&=e!TOh^)|NL3pq^uTb)8)7H-l)xvvfzqyO!+MZQ|DG>={AhdVW5} ze0+S#(eVKR0df8P{lV(G?x%qYaMXJfE0DG+JcmX6Gqj2Ltg!>;k2yUz!`<$-e zkM9egiA3NoJ99*t{Rn#U5uX9UUycL2{nY8~P&4SIvp0VME%F?)o+P(Ue_)0bQz%A< z0MZAxjQxun$Q8!q}|yt88hJqnZd+ zm7%4a+t*r%qJ3O_KQ1*9tE?wW;UzAXA+sYZA%r@5S`@q5E&Sz{zOBJ>ps$y2>S}5< z?q&X+Nx3F$nb{#VD)%7?(q8Ot@&Kh3-H67bw@#3l7kNhSm=Yl029_HJR+c;51L3V2 zh&Ly1xHtyX>3~Pw_j0~)S|>sz!7}7p#fPS>Zgu{ugNI)f@DKSFBty#D7I6cx7HWa%eV2hjac1Yg2_sWoal< zn|g9dPU;e*9OdHBi^(O>HzfDwxl7ih)yy#%SRD@UimiuuBL**n@7?QtCp?J+i9hPK zoG}#{H-Il?{?+;UUjm!NT1km(_9`)LVJ(&Bm zte_jQ*sf^FFCc)JuWD|#9r%J$DYh&vTSoy)dSI$-#GkyRh3-zHio;)Z8_0onBu3o& zC);QLLvKG*RVy3GEVxLc>PFpG4 zVmtA$`LOBoK=bifImg`ZPK8*7x#xRq6Kv*1c=wOAV@7ajG^OGHUOS_G*8_eNH5CQc5ug&BCDp zw^k(we;VbGXOa_|leh3dk3`4@y4JSh(}VHigwWGh>VLkKIO(qW325p#9FM_Q#JNmg zg)Mf*k5nshmh~7}TOLrniDgB*%pDB`=%d4G$kri{<_&X&GJ60?pWzRkbLBR zNn&EKE6I>5)L!KJ^ohb*Db6x^_cnHE7X+Afrs*6JjwYc>3}`6f0F7T4bD$O+iQZ}fsL5k67swIo5x8FcU%DBTFCd*>;=`3ogW z!VjJJqm5t+#R3ysnS_>G%hEKDH%gCJt)+;omGGJ8Oe{12sfgYTZaltSyw>P#-d0eM z>VOUzXt?MHl#_CWUPnC$)RBY;loigcUQT&har^NkJF+T`8@UjuXf^q~pF^o59`n^t z!Un=*^~aiNOcZT3W0O0}pTh`sXyy>P{(bs=3@AFeRV+chw-q^!Ui%(Z>ZJ8#25_&0eY7V* zjrHOQ_sfXl1Q5y{jRaOEHpKQ9O=3r9qNS|j1H)KW@`XOb=%jq8_uKTy0mo_MLud7f zG9EkUvW%G=%&Ya(0m!CBt#AuuBz22~u&&^bHgX&j>%_>I1H|g;+bYfS<(gi13DlBC zx2LvM^;Kpw$wdcx8^3^M#N=y|m7mYno<@$UrR&=li{?)NM-MRBnAAV{9@n)Tdy%?C`-n|E?-R5GzE#(bmKoUBTEu~Zgt6(&7=-et*EFem9z>ytI9c@*SU?Klip5;9FsjP=|5ZTX_qsAl z^WXXb1Yo0i92y}|1)o&2o+=ezUVPCwr5Tx!_B#$v6#Ng31>NB;&l=9J>}CP$s?vEW zI=}JyBX`gS@Vo&>9FG|JmmA=5XG&L0V%K>69k-?p5@=;{N#2F7d`~Mrg;-AXR;T9$ zIB}kG_s=(_N;y#vT$64<9Ub%DimZXh+3wJmr334p+0wEQS|3{jq<0YE)g7ae0)L6r zn-^4dj5`BV=~+^WvFD?E$q9_cAE=I*lCuA% z96Bln2J&^gp}J^|=^H{@^&dU&-JsFstR2JEK{b=d@AgW%^F~V9>TVzq+=q<+>C*+M zEAv*!^gws|r;wkP9m096b-lU0`c=HQ|n?cwMCaR zJu@jU=~oJs6+scKe{bzdp0&}rK|2`W#ySNiE-Ed`7D-MHNe^R9ypZ|uyw?Vdm+||K9y7q z((;sFH?rGYr7Mx7*eB(48$g@jz!=PmeDvY(no_;B|CBR86KyvhS*@25@GyPAtwVa-*N8~2^ zkvLD6-!ilE2|@ENJb?HWFTcc;YYp=PnZk{~3d)zMgfV80zt5@`_y8d?HcS;xx&<9)O{pnVpWXfso;Q-_RQ9pygwfq!dWPh&G+ z@L9iH6=oI}!L{-2kE88c8a^ljq*j)$;Dva1V-;d+E9IcO5*)+QW-N;N?r1sMsQD+~ zesgWhyQ0Pi95r4%sO^?)9@NK+N;$djFX?_Kyz!6=7&EZ}=gVHBKSS{fb>|DoSMI+1 zUE-Fi0%)Qd+xi1R70uiqq+Thenkcw-MwwHr#u5M!h#95$@oDUbySjpFIi`iE*je_V z3@Pbo{-VxxtkTN#8OKbq?H~Cz2p?0b)a3gCiukopOXY$s1&*5lKSU-90g|%7E%C8>XpaE9YlF(z%VcuG=;ki$7a)y)bIXOlR`-( zJ7A)Bt+!Fx1kG;)S`L`Jo^eotui9`mIvR9pbh>Kfy*GH?xFgYru}#06(?syCAE3Cr z!c3T@L6pa-2{mw$bemUQC4-PbEnjc&+tG61UtW=bT12tKuH>H^GtFN`*>txMo$NO= zFoUD+!t^PU)+PHohU_ybJklIj278~GE(u2Jbg>Nkc`(cMJ#g(Kwe~BKhdE6D??o77 zguCzQy+>6s{NV`v-I3?X0dz1JAZ>mVp`BCU8~OU_JWFy1mW{xsHS~1e$l5Lup}fM< z)gh{G$H{!8*oNFSnx&FVVJFocU#xKGhrbB|gmeylT}z71J@P0ebYf212-+VHTOueho!y@1Yq-5Lqg@6`e4WFJ)-QX}C0971gquC3lni z%qJGRtm?bMa_q-+Nj67RRbXnLs0`fQTyPB@LJz)&i>lQ%k?{Jyq<%Xm2+(ZiEY#iZ zZ+q+l{WO_inIta9pDizjiVx{SS|?c<><%3~U0nSUu4o#O(^IKZ-S0?XxL2tyfy< zo@0xgvqY^pDN+*EeHr2Fl>oR0K$Zt?JL@g>`3%YTRPvv8qC~gl%H`XU)Eo5X3=&Z{ zENg!(KNjKoJ>fXTa3`kFmAf~7ukz(%A(5T9B-*PQV(1O1;q5PzW>732J0YX|Tc6W9 zcON_I#t;Hbc&1x39(B<8Bohe#mBIJtOHcn03uMOUsvbxW{8loDP^wX3L5>7NwQYBkj8z74*omzrzfX6;`21D9#yaM#k(9oxO%@+;YqLADRD_}X0k?*D+_Hq20d5Eo ziZ;5nAPclfR%~4QS!tIYGC`U;FU0CO-~!{8z8PEw5zeWusustAe1K6jZDJ|D&U)oN zz3zrbPVD}h@#D;*jqau0ZnY$9qWre~(5CC1ujDm}B#OY6I=$VudA$zpzw1zde;IQy9CG+V{3EPFiV}Qm?0MhG~Cac3IEICnNL*>Cz(dUTC(A*`a>u_@m} za7?HN^t0y0MI()wQRb8=8~qV#=%jB0oE5z1bHj@S>Wab&@AQy@lN5Xe;SHklK7yYc zow;*5A8r*B;ueUE^~?t+&!?W5l0q#Sbv19xZ|G2EV4g}qty(K<*d?H5Sbxzi2Obh{ zW|R%4I0@}k{_3RR^47Ty3Yz_fn_hHPxXMbJ$PT2_zU}|3+?7v(VwA3DeKpA?0H~sz zvHmh|(ZOomj^@82K~{+z!N79Rqb6OJs<<=c;}qU z2^^E!z_TSid!F*xrd$|%r20|jMD=mt1Rch9<|H)&ajMP)*N#2 z7kU6Zv^}HV)9@jM;R5-A%6FbvF`GWgIhmfj_3Tcz%8L*Ww@j()As@rSlJUW<^V7Th z-ZQoKN{zRSz#}}a2!Hn1yk!<0;}Ew+RP-*C7?z<|g`!PX_12hohEC;cZVqIsEGc{P zY%hN-{L50hZKo;L!U>Ie5%${9+ydTma_Htqd;4CbgpId<5vD`3 zNY2fE^bNUf+dZMxM$>^}3}Ea7+-@$n<_th^Y2l_@g*>e>nUsE8{o`=Vt?q_P`Pjlb zx&WTj&i*MUy>8gst&JXqm$>S_UwCvlCc78@CoMoK6r#Suxrc#FE9hkdrPmQT`IkWB z)&HX=_lvJ7EWKw4F7dZpcZ`p4)({3|gswklgbrJLJ|0^@*UpNeVaM#R?}JYU0-8-? z)~we&r|XPj#54C&$E0usHxcrVad<}x;Li7$pEv4>nzc)}6l9Tylkt2Z8*Q~tg-bEm$x~!$q=1O^+UNU57cQ(#>_0npl`#!{?pep?dK?Vl zR7(Pfm4e5?B4e$$Ae>;?=iCJ2h{^|#W78WqCLCvmA9zzfkL8r~VWFdh#pc!hOG|@d zaOWJ(Z_fe-cTtomT4RR$Q5;sEJh&@WSz3X&Rr6@FjiXiX8(rKx$KqH**(w!?OFMy6 zAu5r#jrVQF=i!I%el;zT$S(7@Q(%CNV^m%EtJtN1_m-qtaS7|Ji?m4>MRl`_O?)UD z@#fE(Y7)Y0?A!X%FRvqo`Z2%`ix&fir=6%CYh}IvE1>=El<9O1RZUp**|q8W^pFKr&6BC--e`Ww;_n`o%<`8}Hs}bPiEFwt zidKK&$HT~1t$kA34T_WsbXB@TTiOL*ajRl|dJ?ZOhD@Wi>BdLF&c%}cJ?-$X<FPX zdRIN;;yOwN1=m+D*r3_qaj%q581MB*0W!HOa+l}L0rMm3`g^>94x+1IDTjJ2z-jx zwLW7NTZyx#+4*($@NlwORn_-!tI2nJ=HtopKsi~LfzKapw*LHT-VQQI2Z+5rg_T|= zeh&G2>0@%^A_Tdx@FTUY{SZ%Z70Tl{fiHgs^fe7<6ba#3bOJFE3gKQut`6-tbQpLA zo85+6N4j)C$4XNCVFo4#Rf~ryb5ph)pmwCwK8`1u3rB6y;Xb6vzBu92?I|K7GX1_6 zmI_*x^|3}H?zSV%Y6mjwZA-rndLR4<*&Q6gI$MelRvpBfrMSSjZt=h+2)E*HtcN{J zDBBFWhUy<2R1g>q1oQ$9Xb$)j9WVHT)K@F^BNj>EayN1g?8lMvI|!2)P&>o`Y_(>a zRc53b?a+@kf8`1HpI}CLZ)KM_^j99gvEZ#qeACL~`Je!A4|*!~^3`tD6*TI)zn+`Y zlLomGiDv~Awch*A)+MEWygF@h3v`6i3~$J3x9UPz(LW;{N1ZOC`iy4S&L$dIpW84q z^>^&4$%sR|%e>_u77&WDfLGy6y|^1s5ZxOb1HMuo;l2Z-#y74J@BD6WN^9b1#_e_S zRLg;N_QSPNgq}>7CDK)X>+~aee)SzU&9vHsGgF=SY3llWW3pm4+U%$T?NHx0;a%v9 zgqowoVZ`~dabMk4@mTCt&OivPY;l=_#vV} z`$gBQf#!kw<(j%u9ns2Z*@p_n{&LLr%a_j+tokS?uAn=YdQ*AH-TG3LWDm;{ByXd} zxPWtGj}Ch;&ixX!`IO|fC^Vez_VcHdhThTp69!{h>7p6?zSUSB25Roopl{TuozFr(ai9Rq2}7 zjMeRE@HWb7ExV5wT?~n^B2V(F0k|ax2}WXX5a<)Mghhi|<2bm!Ydrk$#&kHMT8o_)JZdmoHR zTPgPEUkxxYUT(2YWA&{90fQ=C`LkoKerB-OlFLe?HH(pb#-7!-S?f z6svh{R>SU(m^t)cHp~>rN=% ztHAS!cNX1(bxt80y(6<{|MT|`#|PBYs4E>Ie}4CoZ~M2v5-$z{WR4n-?cu*xzZ#^I5V%HyT1=n&W$_uijOm$Qo8PAs8Z z;MgKts^iGwK+X91?<7II-gIvYqw*|k`PotI)E~mkhEFzP`S=vv*(w$P?TS zEB^BWoX;FVj>UCfEm--77(>qV;QAjsiB_JKsE1qejD+6?D}n@<-_$WL0q3^f z%7@DWAwQq~-28mpFbtY7Ei;}eQ6Z_O@#ITi7F${gT<-fQ2-n<{r2=qEv4bAR?R64J z2Dz~^_2|`qv_J1naQ65RH~1n3>*?lZhx1Uz7{1rwC(Ph$Avc{SvQ;azn?ACyV$w@+H0%~4=*ulDm%?=&VIhzy|7l4Ep>@caVYt4 z*Z=UuAr8i3&Y7GDAq}mD3LqRT&C%So zbBE0!e%P98fR>dCV6zk+pS!N*S&_XT(fhX3I6`oO?mLM%t{7mKpRBW#!FhG0O zG=k&bTy;m!y%`e*lgE&V(B^!SfXhBnT5Qe{55Oo_Ryv6G7HqY+KUAqVf}@qKO)zqT zd?3MNgAHDSM6dg0Q;$tbwip~_c3Z09fuu;sCafT73HmO>y;u940%4T@tOK~Dv!RuV zSr^vaN@5CQyFFQ12yE)$RHpJ!-_-OPY+I-PGcB>JuT1 zG_q9{Dsd4|ZZB|~$0YDvw-Ael_R=~@?fR&R+EEH9FQV#F{BQo9=>}m^=#2dVh&-X9 zDqAMFh3G${d;bU-djh@f)NnIf2!$Red-1lewj$3)`v{RB@3QV?yX=DV9cA{kT#Nv9 zq>4Ud=#Hnoxh6nDb-m;*G&1eO*s#91GA`DnM3KT0@~%aV^b?1`P)yj(-mxmD{@W-@ zaBoZJa_sKrn;V`shjkC;S&ScfY?4hbbD5;H5Qk5G<(<5gdTUynCHCbpPk@b2Q*)Or>dhk6slA_LSf?$7P<@)t%P1yWi_WPQN7%vIbmt;vP6Q3j=VA&w1lf_Z#P~%{H(!c#0bp-|o6c;UMY0Q5>kJ;+JdZ>b%_Lq9Wa|X z=#gXINx1jGh2wZVjb;|DmwaB)%~xw&>HLSKtFW?^54Ogayp1lkopIA-fSM=S!?a%W zTUn5!(2N=taPILX7#7jeH?Xx|I6pA`?yljJZ&p2bvLkV5hb<`n6h^lfux`T;TuhOYRRkYjAl|;9SEDwafIBzh2r&F^zj^GM`iioqkh*_jRxHjvjlJwpSwWM(}b zcON&1p~5D;wOFdmyW9ccgRXh3=Qe~W-!lyCKWTMk6jlxv#TSG$De;}efXb3P@d1!Sd$m#sdI4{`ZL?u-H=zCJfh=IBdpW?F|mhJBaskUPJS*l0jE-o(T zdFm(x=qgy{`R|>T-_(c48|9op0kFf$tI5d{VOI8g%4fABsiXFMeLHsGoQ(qjW6OEjPdLa_@?F;Yi{hk!_T(Fpyo4G~yXO@YTrCBnJB0H6w=1gfbyHer z5@c2tY?k4|T7?m`$<6_ahMcw>eEY1_JOn_@nvIc46wvi0M#30D`ZPizXL!c3K6elu5Il`LhfE)Kzw%@~^l^%Q zTX43BI}Uz+9)LKu2vXjvdX)&wO90N_zf5v{BSqs9sSZifLW^m_GhFGJ4_WmStH`wE z1KMPn?82@LAdZ20uEy)V&_O|o=3TGzQ15Z+Gau0bQjvtwp!31!_7@=4RafvQg!$po z;Mw$G>bnE##Pg%!x@41Ad!LoOi9lc?9MDoZNhGCV4w8_K>(OZr{XBvIJdMktw5H9W z07t0-$Ta&mdT@pmZiaoR(sSO?ZrAJ>Ms~kJQxdpQJv$AI`r#y4>?D)h7X@=fnbJ9sm75=(>X*LOOCZ2OCrH zxCIf7Tir_Tm4mG0*AYjt<|bD=<>MWJI0Sf#exxwC{nL%r4;^upa(YxUZqq9n%B8%6 zCHGW1%9n)Vf?K%bm=@OciADhFHJ1mbB)Wn_epCRy2jNG+7U+X_Lb}uty}nFp=YRH= zd`?U8aGgcf{ZW&%Xb;QY)#Z4rjvpPo9VsuvfMKks&2c|A;Tx>nPif%)pea z90DmU0~Aiij=&mSFE@*2YKLfDh{q~{?sj(;Wam=W^>q9>mzDW>tRaH+@H7jU(EQqY zwjMqCf{p5?Eb-%uA_WLjD<$fL3xG>fAJ^xqIEtJ#i@C6g*S)nI_A~kDCe$vI}LM7yu8&UI$?1O11 zPJ`j*BGO-{p;b-tA#>VSTY8o{5smyN;t-QleQ*tG|F!OhlUWkAt=Ymqph z_oKx;X##5zK=Y61QxXcoM%9^9(@h5Yp_Z_bwxx7SaNhKG7jQ)d6zQE7L!|jVsmEKQ z21pJ%nhQ*&1Yj!RdSE+&%Gr)lz}bN`w?|HTOcu2t0ctgJH%o%Y-EI-3_5;_AUb6p` zFu%T(YS)aOqp^&zc_C_fJgW8Lj-;RA4{MLEX-fA#8OkOj=~ygk?32R4%q4g05KyrL zfHp-rkx>Vf_7FDaBqAN*>a7Rhkx zYDsz5-A`l}BN}TS{ul9d{r?b8ijc0SA#ufC&-WcP6?+DeMY zN)~zc+7-?$gi)^_b{v(82$VOE2p)3ng;~D{WXPCvL+(t*#l&NFDn;BPwl`H;`VF+F z$<4n34b{VyUIZw?)m~3&@B-pQ3dg1I7Owq^aEAHZs;?yIIYC5`Dv7>^S+%9X@c*x< zE02e=ZQJ%jLS>1zS49lyfU0%W+(G1t8cYR##UU-@kvS7Rj)8SCF3H z;ZJ>;2TVxo*rNTUb_J9gR=z@kh$RUdS}j2$JlDdt+BaSu_ODiNXIN$32+qavhx?k$ z9s>e|J}@`do{<>kU8r@%&g%R3Hsz>?1MbI z4milb@E97uWbiuK*NO=5IflRAa($JvFT>UnHJ$U~U6KCbG8+_?GD(jmLg}~3&+hFm zx-L$Y6T#cxyN7(jHj|MInyHVF5Rx?%^Erl{+jOC+52_4L-s-LL%v)$4Lri; zIlL)bDXceM5^iF81!l+mxMvsz1A;X8tH9*_vxkRsK{c~cabp#UG<{{R(;ccyxgG_q zTMvDbn{~blH!>quqLYB0UjY1j;*EOnSWwPom;}jmv?HV#dyy9wF3k37jK^pu^#H)Ha#`9Lx8Cl>yP3Bv=sKXO|hOE(_W zA)N%WCM969@)ckmPH?}s{YoNb;-2Tqz+}@+p>hS;`t{t_^~qPml-Kb*Z~ui(9x!JB z>*l6m&iZM#8Mt!4>Viu|bGMYs+m6=te|JL;O{~@M4OI;IlJvx`*w>0aotRZeekc`L z$UIh}>hQh>r9Hze0G0vpR+pfIM}pbh<94#U?=7aig|2|daL?xTXEktf+uDVi7%U~i zO3^=z5s(pHP+G6-$~q}!5IHi427h&U~V*5c)lHOZ-q}N zWuQyQc|4Y3)*R#(zjeTUH@5a@JDwhaQ)QVK)gi> zO{_Y+H$21<*6Z`RwtL*SX@RC6A@Rkn8(7$%2L*DVyxs@ehj1pY?$d6C@*C&x_a)*B zlpgCWhdFw*!dro{d}RYBAn-`~Lpu&J4KHYii&r|+k*&a?qq&QA!h=|*1z{?^XItFv zUOV;qzgHzwhKTlZZ6+5#6$_g}cZ%1Wnl9|`4L3p_uL|#dbHX=gScqY*M-^^;_ISPh zDp5u?cDk~@YbytwsIabFoTna}VMG1CAW6O-51O_3j6kPWKd;~FyA9?=F7UD3q+eN| zdyM1!+ZV#fE%&T-0~^}=_WS+U+Sj9YQ3&bKzhq{3O;w{w=N8!zGe!F~5+HeJnvE+x z5&--jIslY0KP$&I;rHY?){VW=FMPLvN0B-69@JMFTi#mx#Q|dSE^GF^c8>v^$5%Rq z%VrBv?oSb;yvWQHE%GZZy3pb(aMdNky31I6dbEhCR%bwjq|M4zd1A8_HPqDyxq{JX zbOKF#@%`6*4^<7bTU*K0ovG2$v4VN#v=U@;Rn}~4*M(2Fl>jn=KIOHWYZmdcdhTUo zO=GS!?aYSa=LQ+^ieG>xyc2^mWw?;O8LwnxDR-=OeluLlAQU{`8F#eexj%u7E!FaiF!bj6wZ3_ z{fc{hd!#5&6emIoY2XkA^m|cid~|;IOS;S<5@!(gy}-yA7m|KiWe&)fnL__e!|~K% z$2^tmroU`qk-ukrZ<*(f*&&Gcwgy2iX8*)8J7(N0_u*LA24ZehrhY}EDZ}0 zYz~!7Zlmg|!{+7!!;9bW_6 z=mt-6l&n-1dJ$<_VcjHp1S|p~!BALGf%VTbf*D=mUL7X6YRh(W!Pc_S*Bn(9rc;sv zd&74rAOA{zh}GIEtt9#7fGZm#2HzTT1=V$cc4zZY!9GJ34?bwmb=5#pLniCo+H-(; zI>VJ7MBYI~6)bC~b9Cq(!OIG(U|4v;LM+|wQFOyZLA*q>VmpHq-cRT-S_dydjjgwE z!__iZ&jub#(WD>DD|$_U-6_VpVeZOm&PZtPQ~a zhavH*acRr$7oicj%cX3+8(YJY)JDeK54JkBh9Btk`~uSMdZ9k=jmokUaHxrm$Db;3(~A7N|lyf-i0xCY2{@oqCN8TC$;cJH34+lR9`)r}1Dn*~Nh z+uHVuv(rp@9Q%cc$XZ)gGFHH?Kvr za{M-j;wJ(#0WA(dAi<#r@Vi;8;NkgnofHoI+79CAP)#&; zs>jFY8cT_AAJl!Z((P+g@1gjbPOq0_~kM>)^r`$xZYW{DS|vJ<-B zU0$Xc&*^rLTL}pS?erX}Ltj+IR(19PIUjf|(h=W$*Be&>Xf$vDT8-JIi8lbM%|MS- zEuj?cn?9V>01|B;f_fUb}{MJHI2Tj6r~9>0XZ>$uycxS`96p{7h`K)Tmo<;@Y867 zKU{uy?7>ox6dc`PP6qlKzAb51@D6J&;_eI6{Mn~}b?le`5;2Akr&(2NtdD+j#>`*y zUwF1Kfdwr)A7ZR9mC(hgx|hmqx|TWfZdtY|PCbQS*F&|6A*FGtFq!p_%*&!Ch9luC z4Fj?mI`Hnk7LkyL^Ef?)4t~p&%+eVY>zu5d`ilVis( zpL-}O}okRUygSz@jMA3dN$0HwPeu>AzO*k#Bm@>U)eQ$wk#!5}ShDDOvh|3Z2Icj*RT=^!~Wo<|M zFU8>|b|Ij$_IY09M>~jFmx3j5W2oo(?L+d|ST6_4qnYGLDcQiM#HTtv?3{*K{hkKX zjzXY%bPuS?`qlAoaGkg&LQP!rx-Q9~{NLI=mXJZuUgyKw>C_Vvo_nW}SGr}kCvOF$ z#s-CIP!#Q+6$l*W=)v;vE^;5oaULecV(R0Fo`Hh9Wm`mZRD{BUZIMEB#HTk3}y;uR1avE9hdO?TXSS!V$gI=qpURK zZcjz+$)R@o{Z{t1$cI4sspxLJ;WoWKO3}~d8VpD^MZ7g>s+z}UgGz3vW?kQ$I-oqD~2P)d>A2^4@n8i999jMF+H>nR z?5J{Bo7hPW_d4r_x&3X~Nk}Dn^3af>`{(A&F)-h4=NCrvS70?HH=5{sZAV}Rz?~+a z>)Phlk32Hb8ZEgl&VlG(&$5qcp~oXE z@8jQv7tkMVYQORzxUQfurL1zp_KDCaSwdBK31jYN#esFSCDXjpvs{R^D_R4Tz)Vx% zSX&B;nP+fo_rw(=?mVC!hEWGQrxevre<{_W@xBKVDavmYSt_m9T_$@==E_BKmr&Os zgiVA$=CQfhQ`T(cA(344-6(p2blUUaP zkupL4foq(L01}H=cU1Y#UpJuf+y#oeW)P$lcOA_^_|_HxdI#LuA4PMP7?K)edA-e%NSvB4vf*%s+67s`Y-HGFbc?RHII%@vX0V4e z8jFiwIOSu)c7Tmto_5Cf07RDJ&jHh1Q9=}q=5wx*YeVd3{(TyqmCm8v-oPl>H>?!b zw0t(OQ77TsF%?_9VhnUs!VvD&yk%@2m9i(q?!te%VfH zJGuARoG1I}{57<*S#^xD(g!NASwP8@1RBwEo~x+OcD$7TE~joO_Yt_ zfusK=g`|>Z2B$2Fd?^{JRc)^Mv$6!*xCR26#~}@?;IS|lNw0qzKGnrzDLPcM&3U!N z_^~x^7o2!orww$>zC3RrRBo&2D7#n?k7RT(!e_AH;52WKLNGs)j^NZU{ZaNRR3qeE z8SFm-z^+ZT2i20(y*d3C$ypp-*qP3#6+hX=;D?_nh(+&Oe;^D*D1SwLB;sdXz)>P! z)Vu4&Z)x^T{5~ZG?2JDbIj}3q@eXnr+Sb0Kk=!0{KUUKT;^tvw=2kmSP;L2xefN!^ z(}(9(s^B>|4hLUnE%;gy4otKxE_G-Iq(?xv1Mt!`(3cmKc}yYxX?Uqh6#?SSWsZd& z9g>$+nN0Muqu@g>m7YG#6A-3Z&amH{{B|@Mue;Sh;j8-OBKg4EMLpQ44ii+qkAYQA zoasJ2Ja8(s^Yrssr{g64uA1?SNzUMXYGe>n)!Y`xUGw>+OLz(8@|_3T-8h|Y_ew~z z+7&$@8~iz2Ply*eE1o%Ngv`sVmhd-DE!tj88*4}02+m&9!sT{lKrTtQ%>5#&m`SgL ze-<^QPrU%94e3@q0~*FiNbLW6&kMLCk~ecR??mF!(_04~tJmqdM+TaAjU#yi2|$?@ zqpPc{wUwH5ASqf07yEXkbV~xS$EuBX%Do95q(q)4v0D6MfY6BEyW|TjN~i+p(4C=q zwNWjBuok>F@}qHeZKtvPe!27F{>QzS&ySM2-CCsf7j{~=j_fy6D5GbCflrYK*?0bD zS|Z?E$NIHc4Zpi2K7%Msfnc-mflf})B`#_4*D-Ar%>KKBn}?W1)o<@otWZ&i!e|Q5 j*Sc2;LkO*_m-dApUGwA{4l?+Q1NgJCaxwJmIp=xqbDw*B?s2@<*VSY_&2yTHii-8oL-nUrR5UQ) z55mL%{PNtHYKe*}E98;7nt|WQa%~{eZqR)0wQYL{xYXdo_2a1o(11Gp^40s8u^uLQ z$FEa8HygfxS$OgIVe4%j`FoG8uV1_$`a(yP&mi zC}BKa&`%~5nQl)Mm{zW2^}6POzC?acCy#sA$<#wITmEB#{DG_F-5FDdRm>o4wQOZL zWABi#SG0Qb&9uU|;*dkqe(WW=yW0n3{4rv#N|ovIi!=8=4lqm9=%>oMPuE-GycXDh zIucbR>UO3jZZ;2>IYeVHnCZPu(#cTArn4_!w|%!GlgT32k?mh|UJMKv@}Ip2T-0a1 zCVnoXy-5fhIQ{dpWJqU(8f8jBoUPSIZ3FbyEtDScET%7eSar}#9ds-0zsp~~J2mi7 z=AS`F0hceo2n87wb#=DPV#qD61ATmH_Z(eDYJ9#7jo?~$)Vp{hn5bcn0VB6iZf2q( z4HbmBXg61jTSuLQyZ3C~w1Bj(VUbgu3Ru6cie2QWM-v?d|JT!zezzbLsI_hN1 z$#rTNK>VvauTFma9{pkMbtveCJqw|3BU^$qW3N9qV6h>LHmI?Nh2!5$jMKy0Tk~0Q zTm6j@jIf@;mX?<3PRk>YwVjzbTG%V@>oezodv?Xzb?wb-sz91PE8E}%^VtxH#r)ik zqf@uTFn11^ip@pEe}-g%A&Sk~r@*}XveCGjAlJ6d{DV%3dT{XF2LKTe6^G@LHhvMS zhx(r^sslEiovb7q+Cc#aJ8R1%`Gik;8Nz>tZ*g_zp2;iK@=Y%f-quS1rRmXL8D)VL zCeC#xPQ1ou)qD!Yl*E-8IOqxpS1^63^-{WnEVv{8Ul(yr9%$%JojMDu2A_$z*oFlF+P01A_gtw zB>k*TUlGtqWk{Lr81l) zl=U(c4%N6Bjp}52xbT%OSL4^Y(Dt-^FO!y3@rQ-C+|ERM_Rzuah!I+xf3?@BA6oY? zw@Ik+k*?1t#;h-7&n0HY7IqLVf&xtP&Fhhe;ob=6`x3BvL8Z$4Mcg6{AsN)Yk*3)R zp*ueR=gRy%*yaa1o+fSaHQK>%J?ZVS@aviUL{pzjHa;@s&3{6*RPdH?_x>lO8N=;% zBMFnrr@x}fKUvH?+*&J^R=oTZ4ROCkab{_n8BWKcm^D+yjVryKKP7}L$;^5ZJhctI ziKd2Fg8;cg^ZMIxzD^U(jSpmISxj(Vx*s1HHjxU#-zWR^ZWnseCe@Q}$>jA)u_?}8 zGcBJUS_j{8)aW#Op;0;M_LJvUyb52Le4LHZoQ^;lMK7GsG+l-KVllj<+71zEeezSDM ztt2LjIoEb*kkp-Hw5`N2vOhdHEQ8!Npw2B+gyh&%q7%S zoEq_|VTgh8l6LAjZf;d7SasqJr%{?IIXU;UzTNlieV+tbu|5^QmuCJMCDN2^=^F5e z=i0JI0S=`n5f0G84C6WH9&2otIejPljwF-IF0M6sotN%V;H{cf(PR?n{7Bje;SMtr zkW{TVAGc@5${p#WSK4LSi%xI!VqG|X^tR9$eo?YcFYtoGx2d&eYA)BlIt03XKTf^PPx@hAInX3NBJ0ZphFQG25Es|aV>hH_9AVU$&|0Q; z3pb~v%n*qwDB-h$bG4rAfG~=VlPY^u_S6`ii+h}Y$cj~?8Tqi>=0!cd&AtgnN*B)oC%bb8YX63Uar#@e+oHZc^IDB?R=)+ zWQfkv713GTXTlrN{X0X^u55ixt^sx ztz!W==Eb-5eQ)&)NEELq{Xiyf_C@ySy;EO3px0!hxg@B;bai9X;i=4$a0NzxkCq3< zPR?N|UZLY%Fzz=+oBqL7J>M~y;1bEB|GDmw3)_ot2}mZ#{CF{7jg^rG-HV)!-6ol6)0)3ftb9)^Yx+khzo-aiPHMTLGU3?774wYvKc9}dQ^eHOXei%U-!XoHo9CNR zu^FOv8b$2bq^WXRzJtTK6IB#+*tWeW_x_Yrm$|laj;>_XC~*@r&D+V` zG8O4|o{?MkiWHYqP#UC8AL)v`qx>X`0%bGZU(3Ru*TuX3h-+uw0=->ZpbbMkI^c_fdV7Cv7YS?AAXHuIc&a z?OG(cg+fXG2UU$Eahj)McVP1Y?p}7R0J=(6Sd5PcwcaS$JYikgrBLZ{?(+!KY~D}- zxYTv017P)O6g)OU$0a}o0LA~psuTVBkDdYAO;Ml|tkJ+@O(Ex>NS^#yRv68FqLNa# zz||hvRdo-N*y)g8p15`gPu+7r+*p|2Yh{qQ56mfl1|A&~JtkLsuU}i`0>*F@lIt6a zuvlJ|+wEK?C!p*XmCfJ90c%o!K5u>Y9{cT+aqmqBaf9WJixavkcrEbt?8s?^*jed9zzw^t`dObl`+GQnF*v zpPC>*=v|v~*Ut`~3G6@g4BT6iLB;2k6y8~aH6PRxSKvL2#Jy5F5c4_nyzJCygdeobld2wQuet}j?X$!95{j;S?j zH?R;_sRq^dr+dRe#mfpS{bqRRx~{8MMhB}r;Fu2){gd*r&NMiPi#s|iI#H7bwl`VR zd%a%OHrpe);YZt=-EUZ5D5%!fOMK^cjhLvI+g!YEy0ZCfPi~*Be~KNLmxv(H6E@Pe z_PY0DR-GD>+sIQ_H9L=nzvcv9oLv=zYj0fWBla>R%R-KQ!r~4Uz zISTmrO<(9Q?Y4NTTafA?vw>DL+GtbYmD+Fl!Gz8~4P7CDa)sr4f0P$ZWc5Ug>ssf| zw@nJ-&w{T`{`}LIN~R8l%YsP;etnmOg>1S%@p_#{C)81SrCJQe1^+DL1)uw?KGfco zHY$wF7az#?2*zT~wt?3lkwZxKGV#21ljYsf~yMVdtS|c0shkS zC7(L06sVX?6g+=Z(r9=dH^z!w*nc${*Lu%YnTSSn9g{Qn%qCRlrQ=nO7_|_6NwGH9 zl$ql=)f76v??z*jPDfN_(3Gs?h`Li zi`I!Qw|e?lAC3tqISjlHcjq0?%nAo7NgyOR95*gy(LY}IeP>#8rv78FC&A&z^_em>;Fbh~-PZ^Gx$vsD&!tS*T8 zSocN;?C z9(I`2uI~;H!~fI~McsT5tr~*0bel@?Q0m{XO1(U*y`S*v2PK zkn$sq+tK1%1;R`mgeyD4%PYbA0n5;s zjltZ)jy-dMKN=k7@7(M3mx}k2QLS%{J~$qdj9q^Pxwlxz=Zcx%d>7?2ziqD0?b2r) zF*}_dLra)e)MkXPY#-1$F1+cK&AofX_|3WdKVAN?3LZYk5?-wkx-xIeOORUaLU&t5@uttvSuttu+VZO9o7OnDw_Uha-t+O7oj z|J-)&Vn99kc|=fR1)Z@D;uZWGzHR#*!P46@LRlNYM*s-dOg+Wx%^_SX(-g{zu|L|SN~H&YDCWuA;+(|v z?Z0&0>j@v`XQKntX<&VkAX8Z-%feHL$`pi|d-sWB>^}>>@A4-$C(GT1k?|iGg^QwE zEXaQWfXfx*8GHd9_3JzZ7ME?%z(}clP}b~1O_FRq2PJg@pkBa#f(z5mr#G*$gn>@r z9T>K3yMJptyO?!)>k=Koz_R%7>Dt*NgGh^c!y9PnU973$u3|30*xZw^VBdg~LiVX3CGj+~=J6<)niknH_!jime#S66od*WuX>+HVS@5Y(P zR$pA@_g9H&`C)Y0T3NuJZ*)vyE(IvGa3_YfKhNfVX{ju4jI(?mtR@f6pAv0Kwvb=b z$d=!jexkgJm|yQM^tf}SR_q)ND3b7Se_FNT)?_CQ6H-Tsd^CRb%D#S1G(V%L%XcJn6mzqSFj|F2R>o;l>m9C7 zzOxZ%&BWI6S6(BNqeCQ}WmtR72Jh^2kw`6s7JR(KNQ|d|#L?(t2KOW+gy9R{qZ!Sa zhciygy@O0|qC+tk_$Hi!*XAR?lGu1iiEkp>w?@DUn449~s}c)|X<;H;%_&B0MQI1t zTb;wEtNmRxcRJCttHzT$EO%WpUsET~7(G3z1Gy?HPp|Ms-HGcw@3DtfV>Rn3nm?xc zwm*m~a-{FXUcD;&K))R!b;(rs?$|(M%Op1e6@&>YIqD+fX?Y!O zd;M-5)83|G<^^O6<9tUoC~T29rGvhTG_1YQcc^bO9&EKAxpZm@8~nYzirwMU_Kg^$ z)QT0tFFLUH_U2o3LPUO2f~Or@Y255>bb>{6!|Jga)2Ay)IlbcAz`k0K!%GLgeZ_T2 zvkMFhU^g0M`=+oqQ)t+OqD{{XQSpr3OYVd-37Gz`+4%m`XDn|8TqIgpqn;5DY03?+ zU|KH{T==3T6iv@xL2i1uxBA~Js~XVbYt0R7pUj$*deE6{97 zoJhcU1*eTyxND0Hf?nC_Y|kH5Eali8TnZBCDRN2-eu3HX{q^lmo}6=)a!-}n*XWl5 zKyc|v*a-g{PD7hu`7Yq|upKc`D~O{ob?!hNT^f0rCVe~}HA;vbGBT_Bomh6mx|$CW zp!=@lrWoQ2EvzpLbl=}q7vlOgB)}YrRjQRRcGdq!$pg7NjfG_L1Rv6SnKr|2`FpVfwO)!a>FT6 zJ9WM|@s+uH#oIqd?{kc9*E3~#w{XRHai&@t_z1KF^bTYOf5~1jOyGpV?~(@&%;&2& zw=Wt81{@{y9`KEprUWN;IQ(5?ge_coaS7?qqWSP~QP70Caz#9f0TU@suwwpfb^Bh@ z=v#f>V^qNr+oE(%7^pu0ur`o$vq;01bRJ@Ye85H4vkDyvA1YQWhgxM}5pS;+e@Ojw zT`IE7J&vrleHx=ta;nk$1j|F=t-icxQroRBi$t40StyW$77fox;(D{_T@!qG|8CIW z`^q$mPX)fEf#r3hAEbi%A>cC80ycsOb=H^?Tkh{2*HB0xRA(~3&Xl_2TfI#TS*oVB z92x6Tws`SjY$YM;4im))QsQ!(pevLQ4LsA7=o$#yr9Prto%K(w;=jm)Vl;u2u{G!> z#dHFZL@Trm3Sav^_eM`?i@Ak6{b0Zp1-Ce;Y$>ig&h5lM+FB3@S%q~d>yWYiU)WEg z8j5K&s@aI26mI-87d)%!irpeg9JLx`(t~LUzg~HJ5uHm)OIqTjldHsiTgOF2U?)NI zkS+M5Zr#ShXS(ZvtI%>V8jSXY@g6+SYHzzidRy&jJa{o9k6?ptM+<>p|N1&3uyeF3 z9_)FHPiXrPn`Y^KQ_Ogx%~f;7crbV7mi~u8BRg9n8QXCa&l|jx;nMt#yl~LvwimWu z*I#)f__%iT@F{kF#n8f1dzBu1zo>VhtEiV1{dSW^=kBY;))@EPwYD8~Z~h2)IEG1@ zL8zUopPAq#{;JoX?k1nH31&>DD<#_1B)$jZTThCyQ<2K;hA)^c&@`Oy9jlxBeQJxv zr$BN-+Y}lj3v)EpCh-#E2w04_nXcoK>kSi0sR^l-3mJJUHfSJAi{|)yVW^j6NVIEz zlW9y07yv~isda6NC_!338E*^zcmtg~pt;-p*-CF0aj7VvV^x_NmKTq!sxzrUmqQc- zgR}i+$4+VngUpFW3KH#IQ>}BDuIXJ}ti&DV9`Vg=awieYoC0PWzy z_8(rf>UxtP6J}gvpRZCESLFd}GOjU3;N0><0VxwRD}b$YsPuN%BqX` zlJzCI0iq4yykYUWWg~1lkCGz@ZrAx|&glfQNYfLZws59KG(jMVH#SH(F%zw5a$AjR zW=8>0o<6*Tn_I5xKo{C2^004TTCtSpJQ!w@iUFBvJ36oA9k~-OWH{n%&?{&ms`b?3 zns&M`CGo%6xM?IS8_bk9Q9Ee}k|9xt_0QjtFzs|? z=`9EzUVG?apAh5mm#j=jeL`4g41EH-+S{F>#cCm8u*8~Llp`|sp9QROSJ{a-r_$763u*7;+TP!CKqL;IN zj|fs}Zn%P$Rz$X}+JeERCe=nqj5mTcb$J;&Zd8~*%c+M)U|O12MJQ;1mdo+aUWoB= zsbn305jzrYQ4NL!hUT?v;cL8J>z*RGJbLr{4hxdFzFlaO>~YLkf{N)V6%zc#?0KP+ z-}Tp86XZZQDiSj`sb4RjlP?Ws*pF!(=&Lt%N!^!y9`*o*A!mpH-qZ{cKJCoUiNY^b zsc$aj!cEB9t(n=!ulK?JaLzaAS<)TLixdmHD zax%t9y@clS5JQRLOYd514pG~Sg?rgEGdJqrBe-fUkUl2+b+&wO2rBVC*!8z(c}AFE zYYJ9MP%vUdOXS@nV16)aHtysiw zR=OsPK6$G~L2Mn|q&=+O^jVE+A4JF3oV9Q6pf`DJ01TJr0&5qY-up6{&)W~5&;E9N zsHq)s`P!D6#77{{&TPJ7molLlw7b^=CNgvl)bfI(y>~CpHmKt7z2j7?;6`3l?el-S z;G4@$7WAA6#h7MbTdUMs1+(XBpUF6uBNr6zNMTd=p+j4fk*Giyu&~tZ5n+1LgsyZf zwR%hzE{_~;5=xApy|ADW{Y&@TT9$i1{wpOR{_G{@*3Jkk0F+IN}vurEkPW|`5#^k&Z;8IsW6v?(=+ZA{KtlD)$`+<=0^KPmw-H55hnOreMi2 z^+an4aP+zPG<#-zCVKXGDi^-xA%kfUZygN8`tg#A8x!4Yh|QAio>V+$5Z9t7=1!Cq>}Y4iDQ(^2;5IVz}h0M@Fj} zpfl^l>G|r3Q-BPSvNHnu9)`kg3)O&#NUZL=qD%+$LrNJJ9?tseb{2PH?_MJ$6_%yg zBd_l*kj{jXo(>YgoAh-WCA=LiFj;9d{t`84ix$kwPjFd# zGt)Hb-+h?W{kq@ZYaEt(vxpl|cXN0SGi`yTFW5_3_nyEJfobGY(_{ z6z6P3OVD42>PW;fsk-wU?9r?*wt_VeG7x605PDe82P-Iv5msWp-2?xg=qArCY{BaV za>R|e@c>}Bi^%QmHBJpvhyYoh`=L%%;Bhr)g}k96yg-wB3)~05JGwSG*delxf6#rv z>mWr(EM(#9>xxDm)v(s0k?$t71bbS-B|0gboHxIXE|6I36Y$Axd9>uj=LA{7iE%ki zUOK)d?mW-A)OWavz_MoKBD$0!%+8E%WY6x$ZqEb+4#eXMJm76}W5sT3bx)ZeiL-*M zE#$fnf9@kP3@0D0xLwZ49xPmR&#-=#5_~+RHTvUF=MPk6dz*@avc4oYLd>t<{%EHv zA!^F(GMw~>St&|xXjxmwNO4j-h4w?K%zU?R->;p&D>OP4K?59wZp4xe5bsg^%Pm3S zRo6Xt#QQzk*IZ>Ba zZVc;rWXA-cCPkYeywYlnlr{v{hSrf5cyto9(Ac6m6$y_>c>hVS!N}WO+#p{-pI^nN z3Q3xOA2GVT_{`4Re8F&#J_1Y9i2|)AE*RPZpkuxDU?LiglBo1zjCcfCK#>(~p8E+q zyT&^A;=X9^J;EzTxlj?JKGw$-Jm-ZQr5*cFylxB?!FKIz1JjED;<+UzLX@ziGx(W6 zf5iyr^Om|QmGDQ1g5vOwF>iD7rcg74h3{Q-fBL<9r|%k$t{5Et&b2z*dJ!VX9bkLr zOegX6Wyt`H;lQ>9ulF`{S{?PSy*I@z$zD`caFes7hK6`PSjf?b_lw%oFOS6wCdQ>BNb@QTY*X_A=|< zu1~b~RII-xeb%8T2$k^k-|k~iaH-`ff4dIu5aBMs+jW(7_W!-UThpUWp)?z20hVEQJl>4bEb@gHwm6t~uxbN;RMY73$CXd-t^-?Y!O zh3FdRNx{96R8v^>Wuo-`!ye|+$h zk${@K8?{W>klfgIGA_Y`xcIhzQX$FUjLQ8t`%|q&xf_RpB&k&u-p*V=QrQdc9~zm& z$;4U3akpK2T!iUfh3Af0Zc5JTh3O6U)sM@=wLz|6-apA!)@G{oNDw!H=bVFBw~DFR zkHM>Xuf_G^-}9Cje|~~fv!i~-XK?`S1i!#s(Ea{AzmA9sG=%Yr!LZApQ$udJ{;EpT z!(j}@=K2~qwpG3SJB`BCpj{H!`Nc>30;F!Z#wXXi8C#W>lZfKjjDf;Q=c~)woXCsk zue_py4F<+q(I#h@(47ydH+0o+_BjZi2~q#*-RHfhLf0eD*JeN9iwX)Cqc$l|)ewOW z%&z8ZD8yQBgAVn21x?eaVgBHKyugm?+IyMW{GV>z6RY(zd@}J*_$>pM#N337bN!!! zKSt|qYWWNnAV=ef@tSiT+tDgJ5u}t!y(Dv>aDPEiTnKvG%UnHtXj*NtUW|m!xx)u?D9~q0gWJS zdM8#He^?L>8Z6v@?Ts7XnD7#)%aJzg9vnz47w`0>>2n~~5urL~J_ob!z1`+5#&57O z&|ER?{3>p)_)P9%eZgZM2Y4kqXKyT4nbp)?H?`N=k_CE*Djc_1851%kED0^znMB_{ zKh=G_zqpZ0;qpW9@Gx&|HCI)lA>S`H>@EwY|sgg2A7Vx3< zfWmKgLgb@nCd%>+e@?!f`^0)0b|?yqz}014MghPW-vu0~eS-ux1&<(t?Mg^q+k9jU`h2> zY*2~CU{>9?zxJ}{zAp}c-|szKVITytGdxvkb1aEQeBR|_>5Zfgzh+Xn*R`zG`3JRq z`jZIBs9v9^;=?JP+73z7*4w#~qTs>!iWI>*@6@tc?st}sJ%<;p8ji_>xt7Xz)HPB? zo^5{kyXnPmBr*S-*JI(kzj_@ze!*S2J_u1?QXkQ6@(hulxstemMhFa~f}rpnIT%OP z%vd|qN{@!X9MTZs(8F0&S`uU^n+lX94)?X^zGcsJ4bJTJC+UZA8 zpRmchxW6I1w@86jv%1j;%u#EEMyuJ)d?TqDN908F_X=W~HxOVj8Nep2GIjJK?uK@k zn%z;xUcw`bvuhmnc#BDsOV3cA`ZCVN1DQwc_i!V9XXZ4{U`Y!F1fbk>I7&~5dI^en zRpcU!)aW#2BRsAArgqT1<)?5dE4jO3jHZru4Hw5#aTx7}Y9Z-K}94!b)4J$`GT zG?>p6X--bc*n!iqqAW?YYTmC01oK5 z2p*FN(}qmCT8Vi_1RPm(vo1z5$jRh&_?4)YU&uLhA9ueTxr)bkZcn(i2&1Ehe$-wG z%@sS_qePT*fiDH7jwaAn%T9`SAJYHdhU4O}AMN?>C70*rBf)%vD z;2-)vlMA))tfhc9ptL$Xcw(uHL0$p=2fh(LEDNtY>vEZW@dF021Vu9hpqS)`hd{(i};qs#NS_#=RB*^A)O5u6dk z4~^34EvNu1dn)Z)Om_XB^x*H+|C1g(nIIAdpXp%r1J^T^#|&=@M?-dz3izORtM*Qa ztb-o;%8J;|Q!(Sq*I-etDXn}!qX`1Y5INe1PeTfMVJ-Q@|8>iJEt%(S`4T-B-P|cc zjO)n^aCgG#sEhxi6#{bn!So1ydte{SUk(qQ-T>6XG4^KWy3+z@STr9CSl_PEvU zyyfn%mv1D3e$%#CW`=!p$acta81w`0Zym?V>`dMPnwImiDtK=(81o<+sZo0{#h&Ag`Q%1~{AFwz zOm;STc8S+4189w2oIR_gm5O>Ek)loIceI2b7gN!}EH@`K|ZQ%Qsx;`%lp8pN|; z0wl&L4b=?DE-IvsR5wLP?lA!=xDx?+0fYpU4}fq0VHA)Ry^NNgKS^iLLb z=#aw|U$>0ow#mcsb;W^~T*cY^Bb^#n^a8|Jzpz;>QMVe#*l~AH>YbcdIQE7O%AX3o zl-3;l9JfS#Z%MD0j=zVUC6MNxm&bDe!CQirj;bBiS=EbQUHl8fuQn&|PfH`j8v+LP zj{f+h6zDDQDmHx{?Z>V!3>j5e9w#1`ip~W-!#;ozz^rdVF}&!l^)L5ZdTiRFqA>9o zSWA0fZuBz;{J6n3rQIjNsF<)AOd{L>djDpdlC2);+k-z?*A-NlO^~O0m8;U{Z+Syb z`#B+S2_2gw9RQR2^}*-7%!h|A@es`7dV^{$cb)QL5x{Q3l#v<@T2tE3fgHQ?;e3{i zxy+8Rxxej2GRS1%6A(PoNyL|A>kyyrkbK>~o7~S+L+9AgCN<73H8n{mE%e>yw(25^ zT1L;gY9|ymYsMzD?Y%V;HNX#sSj)YlJn6AQWC<)%EeOl7Gl~ zwEerY;EUe_8X-T6ZSa}K5$XwT0#qdO zy7^$qSe_R5CAoUk!WdjGBhEZy^cj{3q7Vj(NM8g>58jUA79%%Wsb~oH=Lk{`oqz34 z1+b`L<;+W;YltMqnzs^z#8rE-q3z^$pts|IMuOPqKvyu&79(zie|he^aDB%`ej7xG z8?)I!El`*NT_Vsalp3^a@D#I?7`*wZKQ5MX>io_jF$kOYVFkMp&rA@Ijy`6>SVg8N zWaW7TQ04)rys&198A~l!yDsQyE^nm7@E|*IGoPE2#Tj(dzAI`%~7;{t%7SRAry>qKc@XF%#`S$GSR5~xHVzoXudW7x*O>`mX&Gwoj5vSp+N zs&0Q%F_+AUK&JhXCvm?qd8)&6+QpwV$KV|t@lEaVLh0$PYCt{!Ty#l`ws*yV?M=$) zoklhH;YKR({huZxamxumyG)|(=pUB4IK?K7r!s4IBCNWg*XKPt#K7n?ZM<*KgsInH~WYPNJOAeoB{lx|!_ba&#GO;)1E zGiybmD~XGb_b(I^1>+m4DCXu2;N$MyfB4rn8dCoD;=~!Cg;oWqW?s;?Jh+0!XfIq; zK7`d%42i2Ztkn-rBW(l+n)g_TYwVynTJ{&2I|NBHnX$$2$fYM9O5*l=nh~}Y?%mg&=ZU)rQIu|3BVbR-1{d%A+ zexUY8F`_U~-lOBb?U0Z)m>YuhxPb>KE#ITC7-FN^m0=mQ8d!-x>6tjOzdBFal-J+) ze%N|_d>A5ur+4D`P3L;zw1HdQf7Wk#@Pi#L!2HW&LB|LlK3!K@YGgJsH2snqI8OsF z@Aa49Gp8mbe`A8dpTMEZV*{Jk!SDzHMt~Ab54JmS;pbuietS?xdFzQFaI_;Ows!md z-glE~9M&*7*%*ximRk^(Amdt-xDmX#c{EZLgq7Vx`O;`nxYVmxn-5m*8URGwW5Xd9&xg2HXNFi%29epq#JNuQkK z3AxEMU}7m3j6IM4YKN-|x~~}h`O}0-0Q+WHp3Xgi{dmu8q2XDACtl~U&i85~ZS%m6O*kL^G=hR>lB37gI*5137mJt^^Wxy0?vmlH$|T9|JKDGa)Ba#z=<85 zkR9E$k)!dGdz?lN7udI7KTQ#9!0%NUfsioA9HI12rk7 zJ3tXnEC)p?Os#bGmz~^d0WU~`!4wsN;U|hQaEeeNZZ>o@>Ab6Av^4}^+kZ;bWfakY z^I88B^Ty83Mjv?S~G{xQlOgpK@-!CeH(~fS681J0)^#4Zy#KylMxhN+ED5VhKv7mv0LK)SVfv^9E zcL2{REdl^{02)qu1x~p0e@6Tdfq`u{ui|O{%XWs;zltZEKcR~Hh9c0aT*C8d?j+%T z^0hBkGVU$$?VFSQ+ z*(rZPN^Mq=@ubm#LjS)Ad93Lgu9bm;yYo z=mo~XI9<##K;ZMFNo+wO8n1J@}cTojIB&p6(+K0bKqH=JekkYamw#qt@EaHZ`rfJl{N z-G2f&nm-}G&1II6XDI%p%W9_b8$Y^YEq(hFx?*=253pjS8&iQX`dN%mv?trZ+J4b} zb0~5^IpEpnHmr19uUf3<>GUSeR@&~NE8vFD-eQ=!DQ?&SGGQh@HMO)iZ0%0AE-A;p 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 u{F6DoH`OO-z(-fp@GefnKI%Vw>>)$| literal 0 HcmV?d00001 diff --git a/2.7/images/export/plumbing-lttng-ust-agents.png b/2.7/images/export/plumbing-lttng-ust-agents.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc781c28b52a802c97bc090f149aecd87e247ef GIT binary patch literal 41671 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�-gmAftB$au(wA{)JLo#277vy&J zFLmb31z6{da}ezmU4HY3h+koaS=Jo31XwW$FcCTPU$sjY4)Qn5Ojjuh|J03{4tx@W zv@}Gd5IB4ka!TrNSdfvrx^^(cl>_ zN-4HLgRbH1YmNMy0rl{-D_b zw19CH?3WgQbaKdg-FTSHr8>SRjl#^<&BE(IO%TE5RVBTDDQlx`+lDKR3F>f>1Kj4G z@29rJr`Qm)HM4<=D9~Xd^n?mpHad2pG=j1CgUc6yyhp9jn>!Th?GnB%pngPQJoa1u zcGWje>*!FW_js=^4&LZt!AR~Wu=)iRxJ++f5~@0GX8BGso^lTM z=(w7bUy5Rjd+Xb>t=b#2njd%1qB#TU3dYXQ^35U9$tT)*RyBXvdW^qv$nF!X2mzZJ zw|!Zh?B%hoZk$`Fe0O0^$+y){@W3lw>CfL$xGZ$PpJW@ksPGR=-7c3}x;-hM*X~ns z&2r!H4T~{(39)J?S;ytGcttGR-CG%9 zl&-XIF_=z>;dXT?ykOni8y?!mC?K#BMCVpfJHUkriXiLg+o$uBRdZ(`KAET>YmyNu zFfCMvw_ktt@B;=Nq?1e&hy8`Hy`C+C%w7!Yy=O0x>4y2#dz^T&8myn%g+JM*6r}7>c{Hd3dyS3 zk~i&g=SwXw@?*EZt2a7yVX!vb0VQU5_NX%@9yOqy_ayN%sb%BqJKXexL z0L|%x1mm6a`+Tgw`$Kf#;@w$;`vmoHxs7Y*MoYbhtv?^$7<9qv0TBcYDyZe}w@r=E z_&x0SWjy4RU2k4_V|Op;a)Y9q_HZX0Ys$2=O~ja0PQBU8?n@d$V(+=kao+LMe77>N z+yuTDX#c^($iPba@jFMUrCWEOj7aoktwbGgnM6saFW=zDj_Bwrq{MKk zD{{TEaa=P8AVVAj(7%-j+I3p!t^WWgoP^9pK6sgBEt=v#A&5MDB*S_Mv;LyHrzIsL zpTzGBlSSoWZsk233w?;`3Bpvn_M=5P*9iFy=wj=EE|d?vc{FrIT9Rr)*0byJD-zej zf?(PG$X>xb(~E4WDq5Ze&0g93m1zf`-7Sh4bn0sOsCV>3ok6E$%y=)wxnz988(_@A zi-1uNj^~@lxShF}_>^S2)9PQ8EKPUj5m;&@{+;tvDL{}o5m?#In9wChlpy3rA+NO= zm6FX5nm6FmfA2v^G;Rj?f?!&`ERK)j48}|EZ59aw$oA5u%{v#iW z3c(fKmBOfS}%sg;)uC)rJOxjHd-g4`UK1pDa9_e@pq+vNzqXn~$qlEZcSCxrX?wwE&*x924c|M~VBEXuu}k zV1qb(y8MR~^Nhtw$XhZgZ1G4coXHn+_#bvm`(1G5X?OfeY1kNgRnUB;CHToZjR8jL zp5@EK0xwov0Y4Y065aa(c8X;jcE8!JC*2BXcC_^FAAD`hOR9o@2_C&4g=2(qWaG>A z3Pp+YhY9aMPXcHS8^hyh{RzL2{8Jk&zL1l!Hoe`yC);%YJ7P9T{(n2vX~U#7a?o*t sabP&~`ToF}OC;f0JYRGIX7`x!-l6@sE3(y(>A;_fvE{#ThVF^~1LD!Mj{pDw literal 0 HcmV?d00001 diff --git a/2.7/images/export/plumbing.png b/2.7/images/export/plumbing.png new file mode 100644 index 0000000000000000000000000000000000000000..d15947efa76b42fe0209ccb9eedd71e6a1e8888f GIT binary patch literal 42371 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 literal 0 HcmV?d00001 diff --git a/2.7/images/export/python-app.png b/2.7/images/export/python-app.png new file mode 100644 index 0000000000000000000000000000000000000000..50c6dbedfa2283bbba03613744485d55f1c664ed GIT binary patch literal 6036 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 literal 0 HcmV?d00001 diff --git a/2.7/images/export/track-1-3-4-7-10-13-15-16.png b/2.7/images/export/track-1-3-4-7-10-13-15-16.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2267d38fb3ff4074345c9e4ae8a673009a7d3a GIT binary patch literal 1291 zcmZ`(Yf};k0K}vVjmk_VE6dQxe3enhh?+y-5h`d(7KWa$ytMMsnQ~H)Fp_1~V5X-c z`N-2ce5I*j7ehW0V$ghth-8?Fl0+U_B%VK@o7vgj5BqI*_GT~vyUBcqIRF6Iggb!= z0RT);YyKq2bd9O0D%Ul+7#v9SgStbVJ)Pa$+~62E0)g-j_Cll4n6qend?0~9AohiX zT|Px3ks@gkadC0K-HcBzNJ>dbp_FG(snjgqbry?tt1XAkX5Z^%mq?2_98Q(2qPDh{ zH~qM|xmh3(h(sc(R60C7tW+wgxL7p+01U@rP(+GMQx@G&iL_t^m{9x8E7zId;^DPWL+UnJgfqdY-p>LcK%gbniBLS}q&%Po(4 zfLaG+w>;3%ZqpXtSd(b_KA9ODq_8~jdnPTr^nuffiM^?O)7&T_^!#QfNyI(2&ychq zc%yu3tK`U>)wt-WJd_8tW9CU%fvwNId!ZkBDvRgo{#{@O_GBYSJluT<)cPdxZ?2!V z>y2Ih!=SKu5(CC&aVxxfj^Z10r|vXczTZ5U1^crjm1p-Nsf*pD=;2>@b_De?1385;ruXXBY3pJLiOBdJ`w+6q1Ou-P;C2?@RP*hqrwXM*8(Q?mnzdHi%R+B7_BQ*O6~7S zbBb5kkIBCTc2nHCnsSg*s#Yvw>Ir1gZ7Ea#Z^bskZuxRhF{GjGegR}R>ghCPNE&{b zg|)6Og)fvk+RxAGks|-jKel|h`Qp$MNs;=@q+?y734Qr-XNCueVgF+o2Z5_L2BIK$ zc}#KbM8;?Mx*sQfC3<`T!vER0b$z9#mgv!8IY{hWcrXgwW6ENl4uTBTA^bI-{HjN= zm+!8$>-tu931`|b{8I+n0FsHj17Vo#uO9r~QS* zVQ=B2sl-)SQy&pnzT1woh~jwrm9n{S z7X}QF$mEu}DN*r8c{h4Ep1AueWuBw1tQkw1Jg4HsG~~e^jt2-PmG=cn17h9bnAUqa zTZQ!@I(Os2gPe}HrK&Av;n&@;OR9Wdd`jb`mheI!JEnAx9dood{mR2Mu*@Bd%h>7- zZ`4>HD0H9%+2@Zu#g{W`yq@TytVnchi88EfwjeDhs`j%iRN>NQ?YFB>Pq literal 0 HcmV?d00001 diff --git a/2.7/images/export/track-1-4-15-16.png b/2.7/images/export/track-1-4-15-16.png new file mode 100644 index 0000000000000000000000000000000000000000..679f4a0b50bed5491776b387cab7f8f57084d39a GIT binary patch literal 1251 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ks138$1WOd;a9Uzqx;1lAiq^G21simu{YwTid zZf=Nzlo95%^=NEE5D6A+nGBPr*E;c14CA~8(e@b3KK|#fW^6Kj9#x)IX zZEaoKJ0?z?IQj6zS?6ZXnKNhct%WOAtXT7O)#lBc_wV0-^5n^L=gwWddiBAB2i2a* zuNW9uj67W&Ln>~)oqe(IkpYkEWr15Sb22n1lr5VQbm;&8$7%=GxI8`@*Jz@B_N#aN zx<^lr6b79Pdmm)I_u9VG?@#;gl~4IrH|?h9ir;$s^{+Q7a5Q0}2Ya`Eb=x%Q-mSDp zw!igW?CE&WS1{+7Y>dIluG;Y2%DWQn#me^gHg3GCp%kGJ%E9r?Dnf5Y;+3gFP4gum zTBv3`ZeVJ1UtD_hb&QOkb(s0g6|-GfvIQOY&#hUen5?S?nUuZkHgKiBS><9Cv;-9dt7$ze|~=MSDuVctf+o~+Tc^)6WY zDoi(e-UEwoZt{`)!@}!kt2s42aFLl9B7SMr!m=llO}v7C9@$L(5gIO>+Mhe?k>8Z_ zhI1cwM!D-pxJRtj@06`s4F!*zh*@Iyez5teUikSEfeopC@xz$ z1E@y5hSg&3^IIR5|IqK_+@I>Vr*FmecGF2VHw1Qe?3r1z?sAK#uuj;d?+bdbZJx)T z?e*xXuaJt2dfjo0dDHi>YbUFkyQJ=YarJVvZ*Tj4t3Tq+m{9`}dEl@1w!B3`TPy4`-+_x6%`eOG#WeZ=?WJ*#j_ z+rQ2}|LOeM?kxGcoOf%P$s7#W86hM(`TMSiQ9(8t$!TA^m*n|qPw54^%OVa|91pnkrXu!5aRP@}et6T{$H6t1b1wx|HZ9UPdr_$`@!4VSlgAq zKPQ$hym`>8WZ|6s!Y|fj$_ep2H=h)_`YQWmcKuzgS+Bp&Q@)X59A?xceqr;f59yp% zcRfzL_{rlLyWCn`F{1tO%-Rhs_My|}mAQWPWy#*x`5Usdm~FPxdUW@Y_LO}^XaCz49sM&MDvA zu5(*{S`AN|9*^Vvo4V&);sn22HBDz(q-wP~weI{Pn;EGKRV$7Q$E-YBT(*9)rA%!DTW9lQ^fTb3Lr>mdKI;Vst06A<&M*si- literal 0 HcmV?d00001 diff --git a/2.7/images/export/track-3-4-7-10-13.png b/2.7/images/export/track-3-4-7-10-13.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed5404778abce2e3d7a98f56b32e9dcf2dbdb1c GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ks138$1WOd;a9Uzqx;1lAiq^G21simu{YwTid zZf=Nzlo95%^=NEE5D6A+nGBPr*E;c14CA~8(e@b3KK|#fW^6Kj9#x)IX zZEaoKJ0?z?IQj6zS?6ZXnKNhct%WOAtXT7O)#lBc_wV0-^5n^L=gwWddiBAB2i2a* zuNW9u{5@S9Ln>~)ot>D!*np?adDf(hX#rlE+9i#x|NqPDFPvJ|%=3GTm+jrX|AJO- zs(9OegmaRvom|dt_uHEvJ+=#|>9KkI>+QYDW8bR7YGPsqSRApSKUv%IECsh6o5C!c zSbm}E{zi^@UCPRnv)}eQUofq7JzlQYG&l3^K9ilPf+j&yYzM=tyd?#>@}v0wOV{bI*81dD=dz*a=f>A({_qzXUt7BmJ}0%Oqor8> zOSaXvv^s|kGhg|f-JzRfrt~txJj+k^OL~%)v6Wr@Z-cI2_V1@x`}kbHe=kULy-m}y zM{`QmBD~!yE}bl^e^@*DMYxr4c1W1jxmttpXQx&e>F-LeoxH`(ZC?9&s~YiU1&$`H z=s~^jhsa_j|5?_R_iRquZ%&hY%Z^=T{F(EfpvBpLB%( z3K`w(`n;#TY+C2ZB|+Dl%~AK6?)BXkGnYLRSo1e1)b^!$OJ&E;ym+BE z%YSbCv&d9IqUF>@0$Lso}TkwSAQgKo@dqFzU%A?tBTW0 zxP{yK?;id4HP-!{UR=+`H;W|opY!fpFE`2YLQCPe}i0JGpm9$!hhJ@DJAozsRW;J6>s0E;*&2-Uo1CJv2`^_E#la$bo4QYAFIoyU3DBG zA4=TAWJ6A!Den6fYIOG5l4O?T=Ih-)eO5X5k~T-~5B#m!^Kbk7_sVl*mI;bFzuuR% zkYDF+YeC5NGh&O?1NUz{cWIJM_s7uo_eoeXHYB(IspqiE=6kGvJ@vN!sZ*1=x~3gl R1T4}RJYD@<);T3K0RUImM_2#= literal 0 HcmV?d00001 diff --git a/2.7/images/export/track-6-11.png b/2.7/images/export/track-6-11.png new file mode 100644 index 0000000000000000000000000000000000000000..95e173c9437f0b209b67773814567cfbee83bbd3 GIT binary patch literal 1225 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ks138$1WOd;a9Uzq!;1lAiq^G21simu{YwTid zZf@@E?CcWl?3?D}=jRu4J}5FWGOjK*B_$=jGcA8gUO_=Y#e(wc>gvWd4Q*|0UE4b* zPMkRT@Wff?X3m*2XYs9tD^{#n^K{kb&71e{-+%Jt$#dtJQ+6Gh{W^i`|9}5?&WqL>iWdhjE`8OfAGlO_#&Y&! zmoDzDo%l^5_q*JVYVA$m)*rW>lk)cAz4ObPv{qn2*LB+hFFp2n5^Sx8 z4D$LYba0aAq}8cT0-T5ZA{Bnzk)6lyKJkH$q`9PU@7eF7XV`YiiZi-6`bp1LH9pC3 zVLNMi?Df*Sfl4n7IiFcGNSv-^U3t%L#tspVb-H(zU3QfDJ(qBA-l@6cZQ1(%uWlze z)Y3YyJU++P=Gn^6S@kh%`Ws^l^T2vrw#Ek^OWtf_a^ydG^KkQ~!~fn_k{=&`Ki~FX=l(0Nm#ooZ(PozP@J0 zoO7y2g?l2e=*MyI%h~m=!b;XW)b|JT_4%v2t!@^6U$N@Y%^g9%QePTNi#I-1mD;yo zETN)Gv_>hH0SQFFP7`h zWN^g&$_~|xe{^hD$UH$6A628Thr0JOCuwe2dZ9G-Z;`ysoR@sBo2LKs(yR>q5Pm0P z+Rg*VCVpJqG<^r-U!9rjU3r}IIICvtn9k`I5Sscg@F0W!#FcsL?oNr9@b0wrz?H)nrZttcCF4f`P1|IH(S1WIsXZxW&6)be6yLse(-JU>3tJEy_)@m zpEW%=wlDGcT<=b%gCb4}KW>~m7_>-%z1wi-jxxSUjSuGCOr5{6?5oM=_NHa~t{pkg zvZd}-<^J_2 z<8LfdD(AodE;l`A?L0YS-??AUc1P@g^<{Siwg?9&f&cOc*B7mSy!n>@ey-S*ETFVdQ&MBb@0AGbf)c^nh literal 0 HcmV?d00001 diff --git a/2.7/images/export/track-all.png b/2.7/images/export/track-all.png new file mode 100644 index 0000000000000000000000000000000000000000..560b607dccac4124a8fb8ef5445599f697e6f0a0 GIT binary patch literal 1065 zcmV+^1lIeBP)m)%46jx@pDc+|gED@}39rDVrnj3JVZ z2iJECj~-jpz0r{%36dZQk|4>DAPJHn36cy6k{}6^;P0#05wUovu63?!yXx9PZ+JS6 zACAh*BKF$8Y;#>PGqWT0Dw(( zRRExd2wI3>+iFV)e7mFVp@_T22xblKx|XmDU#aH5^RDt*A)PPNSdS;iKGEQpuR1D=lJ0!!WoEn2XOSC zC8&s0^lFMcC%wT6@;u^J$|1O>I>pkqu@HLo*V!VY?h=UiMZO`phIf0U&fvL1_O`La zJv^Ufd_y;m$lYUww(NY7F9@zqW_dYNV+762kmhG%YrRG6ZP@z}$-xSVoH&Zb%b70- z?!jAtAtgu)7$$K(A{ zC5LY4*CHA@Ar@_+ThF2J?D4OT|HULof+R>XBuIiJNP;9of+R?SBuFwONP;BzHxuOI zJPCI(36dbmkRSD;Qxr=wd#7!EVkWh@BLJ@i0<{6>FPH0)495` z#&o?myE*oCW_Fupd1J3^H^&aaD#+80$@AG#d_v^bzv$}9*n#Zo^4Qer>J|)L;jXUt z?e5rrKj1z@5j2g-XW+sBOTm^(mPV``g>o!tNZns>U#S~@R#n8doH*-mGvXRmu|;) zMdD2;wznC<6;hTM!2%t+%)cdQSR-VH$+b6Rc8d@+0CG)r6*BI2cyklLEsXz;;037x z-Lc8XI{4Hzk+Nd1Q+u_P<<{Nq$18hFw><}Mg67Ecc@0D94f%(6@g?_e`FFW`AEWUj z9_J0-R}aK8X1iq!+^N#Q^unty)b{Zt`9p%248t+LuJ;lkSj|ka&i6>|y##Wwi?p8S zIjDlboY||+r1bGj{6m5=jy1i}DPn$ms1AzgJ!V(8A>})1kDxbrJy<;S>b+Y^7Sa9t znCMhhRp+`*p?k>h;Mmozc^Ex;6K_uI^epDz8vlz)kOWDPWJr(%Nst6dh6G8F1WAx& jNRR|c@b4kW_1*dhbT>?9SH~C>00000NkvXXu0mjf4RsB^ literal 0 HcmV?d00001 diff --git a/2.7/images/export/untrack-all.png b/2.7/images/export/untrack-all.png new file mode 100644 index 0000000000000000000000000000000000000000..1fff7e77161b3d9d0dbb5e6115a9eeb1759b1f7a GIT binary patch literal 1018 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ks137>ML*^0hLktYe2R&UJLn>~)ovpa;i2+aB zb0_<6jE4@Nt#0^G^!bzA0vmP>K1s26i*;t)RNs5d_+!?*FzvO@UUfIWh9CD-{ax1o z_2#a-SGPNTcM@l5P7vT}ax^%>a!^46$eF+i+Pkyly0l!| z-z#ZP>w~Bzt$Od&=}zU5~%~$aR?-^gps`?uF;OxDE(7rf4XUVpX$53pKBgV&nm2VC&zkc^G8=Zg@~Rrn~IkG9ID7ucy{*-6*4`-j z{v?69(og1C($h2SEauO39VQ5^*j;ownBDxzlby1rOp}-Mi7ghpxqW-f#)Mlem0u%L z(w^0>vYxT&`Ln-=K342cIkisu*G_?IzmC@3udi)3)~Ws&F8=>0IE)p9p`ot^3~*5B z`+%b2L%o`W_A}2Uadx0sN)tx({1-U5xxg}A?6;b4D1X|=7xVgOu3PJDKX>KoqsxQe z78T~ac6nlS`qQDfSp7cUrrrt5WhWnByz~dd#ijKZuUy^8eDliFjVmu-(UsVB$an6m zs?wbO@&&SsHojeZU@7BGg&j%3Grwxe@3B!@cU>+jIQ+7a;*SfmyXD?1SKhL&uJix3 z@UpOQlYjN*xa-UFSvcQm>e}-hVga!=EZP+>jQ&qqu%O}u&*W_V6FH9*H5gvZc_o!`=dF2m9@CDN zkKZ}wEqHd}t@hrv&HS&&O z+8X^YbY0x>j5i&}E1R!hW!~2lsV`Yr z34B()WM!B;pH|>?oAZup7SGPiD^**%J^hiq(2~M6FI)Q_eqO!K%HzoO8NPSBrmSD0 z+jQ;0*M!37!J(?EA79kjt68O`J=>X=`r+9pYYVedRsO~5`j5`8^f~|NM|Ai9M<_W7 iHI{$;7wGwV^B3#asKxbjs=B^10D-5gpUXO@geCxnljz_8 literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-app.png b/2.7/images/export/ust-app.png new file mode 100644 index 0000000000000000000000000000000000000000..2001b833852261dde5a1ca0cbe4cbc2a5221363e GIT binary patch literal 7795 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 Xxw58MTMGg3@987ehoui*y!rnCOf&7O literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-dlopens-lib+lib-dlopens-tp-so+lib-instrumented.png b/2.7/images/export/ust-sit+app-dlopens-lib+lib-dlopens-tp-so+lib-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..7811034e6c01749647475d7eca36795b52d4e563 GIT binary patch literal 3069 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 S8qO;vfT6CL&Py%lxPJjC&66Ae literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-dlopens-tp-so+app-instrumented.png b/2.7/images/export/ust-sit+app-dlopens-tp-so+app-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..059fd75ff77124e98b6aa1d6790df29947e3bd9f GIT binary patch literal 2091 zcmV+`2-Nq9P)M?E?# zLbJ<6slY~2Q%XfNO18~Sw#iRhUR7**R#81!XKG*<8)95WWOH_B9wKNRAZQ*TXe23a zDJ^bjPi}vLa3UpfAS7}qC~_$&b;j0si;j9FD0?(9dpb3HbXa`H%zZmQeLg~gEHHsm zR)JMnftHzqC@g|1ErKd8ggiHdKsklS!G+D-hRxcDfMJSPT#TWmj!i?4YHyIu&5>ef zlQA@ujB1s7f0nJXnv9W~hm4!k*_<^vpkq^@mvW%FzNI=mr>3i_cVMc;%By>0tfPCa zK0&UtxUb#kv(>t^&(*b!Z?;24w%y*h;OV)qgu3A6yUo+Sly$zEc)r}>!P?-#-pjFD%)rVf@=5S_H7{Mw2C}KQSF+X2?W)g zfmRSe8Kxo23~T0OEdW$o&X5X2v0?%WC^Lbeh`eBw7;3?+$vHrkj4tDHN7bN{tOC;9 z1{BQ;{7`GRH#ZklqNz0U@$md{Oa4Qe?ANh^;_}m z<<5fvi^rYomx~{*1y;cOM{N*`iyy89*jN8$c_uj=7Ef8;Ne)me=Z<8vZ=bbDop;~L zI*%jgR@|U&WzR3^`lX*O)ZazjMcloRz2zMBSN0~o=$q?y0gJ!8Vd=kSR~(~G&$CND z?hHC#9=-f{@aYX#DE-1Y$Ed?g?26)pi|<^z^2z&mF8<&Sb@zy4RF++EuUPz!R_@As z#qZsr^sGzNjnD4cSN`~Uz$hOPqFyGdUM@HER=HI#*Ef=VxXu|>M~4)pRYz%rP~A>& z_zX%bXpwWPTJ-`t1B^x;73>5@mGttmqVPpk6?6!d>!_^jC~qg-ddnles61*_DXOsC zqOGDSueWrR*7Y>!RuyRX01Bnks0!&2q&cNEiwb!(#~0No6sq~fI+~r$S9Loz=Je%q zK7S^VdBr+uGX*+@M~Diaf$l!=J;##s5B!t!{!r(ge~tOW`f}zqZo2q#X8x3&_gurJ zc{g7^XrONhk9aW?Yf@d!PhpogJ3a7vQs zi}!;`95$%OUl2((0{ny5@PW{X;~=mMOeS+#UX8Pv`$-OqIW zqB33ZLyekT(G1vWf|O_w3eU)0rqq@Cw9J&B^NX_lP}Wy$2MkU^ea8yxJ)l?S~rHu#htuxk9U!$-!uV!m6;5F`6()GF#N#9%qoMH=qF#h*DCJS1W>LQE*c$bRLR1u`k|;G1sWn=KgNxKmEOVD( z;g)rzfG(P+slilEMHz05@<2JXMtu$okYAxiR2QXb87K|Q8s(1C6*Oz6iQHX4jJ`Y-B* VfY0cLjt&3-002ovPDHLkV1j;l5J~_5 literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-linked-with-lib+lib-dlopens-tp-so+lib-instrumented.png b/2.7/images/export/ust-sit+app-linked-with-lib+lib-dlopens-tp-so+lib-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..a974ae7a0f5dc091386d5f3d565059a1ccbc06a5 GIT binary patch literal 2889 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 URIpw;>Z#aF4b2RQ`Yy5m0W(Iu+W-In literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-linked-with-lib+lib-linked-with-tp-o+lib-instrumented.png b/2.7/images/export/ust-sit+app-linked-with-lib+lib-linked-with-tp-o+lib-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..942744b239c6434bc55f312170135b80796b1b24 GIT binary patch literal 2173 zcmV-@2!i*CP)6%=Tt;Mbc4izP zW-c^m9wKNRAZQ*TZYeEpXisi`f^R1)a3UpfAS7}qC~_$&b;j0si;j9FD0?(9dpb3H zbXa`H%zZmQeLg~gEHHsmR)JMnftHzqC@g|1ErKd8ggiHdKsklS!G+D-hRxcDfMJSP zT#TWmj!i?4YHyIu&5>eflQA@ujB1s7f0nJXnv9W~hm4!k*_<^vpkq^@mvW%FzNI=m zr>3i_cVMc;%By>0tfPCaK0&UtxUb#kv(>t^&(*b!Z?;24w%y*h;OV)qgu3A6yUo+S zly$zEc)r}>!P?-#-pVTa|Th}c%O;xZ}kf6b*;R8^kxFe!A zKnM>7SD3}rK%MQdWGw%<-@B$bpfBv&OZR>4b@xNR*(JTbb5FVSb)V17%xG!Pf!U70 zG<#srjM%iVb7V6Xm<}K8>=O$3TIXpjIKAExT8oFC#KP0T10o6MHpLSjo)t;hiBm`& zNhk>=AvVG`rL`!IsUJ|)ENcBD2^0`)5duvz(d$jvee>)yv2bK;0l-ssZx!~oUj_#lspiYqc+FILRf6Sl#_&#P!b{~bWPI>>t@|G-9bpQT^xiinOD`iOEQEIHwlovL^3L|anxbm z)yWc|c`nhD0J&YYE6oeY7JB(0o)>$30poR62WWq3m zqYib}^?;CMGQ@!}522#gOGMX51qGp}>yBo-q*T(JFbQ5IY?_+3glRtH9q?JeIAh}{ zluy0gL^$bNz)I?G0jDN>le&=lo75kZy^Y>V|7|q>Id^{ShF&>8g*SSr#ZwF8{wlI? zW=;OGBnc(qP72rMV8VtOkkjD?WQfQC@e`tN zW%MHj{cMAN#zz0tL%(uBzxsNK2puARLb=A4Yi#+{lWT0bf|YA*xyF_=wp?THp4FFN z5x;mp0MR0T;eG%qi1-Ej0i+?~7wZQww~3k%`~W&J?$nWlJ3$zLx;u(^KuSnK!dfWs zfS9ma#ZCzFO9(!f_k#wLtNTIa-;TRA8u6Y$K}FxCL2^kPM>Xnq2PdXL2ohGx)%=Ah zwjgBNeU*O|KJqcoQp$0_^9=s20+;^t6NRY}DpohI)O?OohOBZK{(F#B0w8O{DL;Tq zKy1xauAm4H+Mo;1wxhh_Pm9oE$5vG-7zR`vWJOHeZz%y~@^APEp#Gw4Un!hbvi{&Z z#SQZHW+blnhs*n{y%U1h&)pnN}2Fybd1S=9VmN)KTe=c7;zJZ%?gitZ?ngKY|9N!h*Kbc2@Ai7V6UA@7zxL-NY=plT&t7Rg z?D6!tb>m9$lMQUGym~C*<7xTh4SfA@E8@-rzChR)@xT4f0CD-xjn-H2H<|mrYjT=UtZB%xD%m=_uLWOv|kjj{2 z+19j*>uGjaVJ%^YUP;rT?%>GQJWp?ipyW5VGaov-&V2yvFbQA>Fr<*3ov}w2+eNJYdi)DJ-JB9MfVa1_FI+7 zeP7@Qupjl_IqnA_TEs81i4#8n!6JUqegOXh0LnXMvGLuL00000NkvXXu0mjfmUk<2 literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-linked-with-lib+lib-linked-with-tp-so+lib-instrumented.png b/2.7/images/export/ust-sit+app-linked-with-lib+lib-linked-with-tp-so+lib-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..908d5594ca9d93534dac0f76df13a5f202813b7c GIT binary patch literal 2533 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 Ai2wiq literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-linked-with-tp-o+app-instrumented.png b/2.7/images/export/ust-sit+app-linked-with-tp-o+app-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..df32000414fd80f979ad404d7f73d6bbd1e002fc GIT binary patch literal 1400 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 UJzInxo&W#<07*qoM6N<$f-AcvU;qFB literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+app-linked-with-tp-so+app-instrumented.png b/2.7/images/export/ust-sit+app-linked-with-tp-so+app-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..9a18a7df34c7866da0d98d8e39e0ba9599d8a651 GIT binary patch literal 1774 zcmV6%=Tt;Mbc4r4JVrP>vG?a{Lm3n`ct+JYok(-B%o735xH8`MSQ=pe}pt-)KIy|SQtEzWk zs>RBydte!F#-KXx{r}E>Z^yR4c>98>_dlvuz01$LiPE!CdJz!v%puo`C;_&kL`Tn_e zrp^EW1qVq)K~!ko?VA06(?l4+Gl7AQm-EuZb&G3LL0g#wExrwvjatPW^{p9{@>1ps zvzi)+vjMx52Zvi=_vu?Xz$dH z%P~$K?;RC{*Lu%f&hdJ0N;t9Ya*yNF!kHcZ*po9t&rKkDDfZRFT7=Xc*CkDZ5F0YF z2{GbhF+|pJu|yXPS7i&$*x0rWs5a2EMj0)4~etiGuD~tK{e!qV{|J64)|9H#=`)mI4TK7?(#nbNXwfsi|E=AZp>qA+r zemLM%+vmBFsR6g_Uv6~jOW3XDd0Bq@vPbQ{`<6U;%r9^4g}o z(ds+bZ+!Cp`s(-Lun*<~u`=8FFrWXHUj2>t^52ESn(`RzozEWn-}>Qmj@THHV#8o{ zO>3Aft)*-FZt^$lF|azC6~&g0G6*5vPq29jWkghsakeczhn9fX&{57$uvN@-I-(dI zTNBYN(sZPmCQ|%ldLIgkj#W^rMzOh0i=Hh_irF$z#xyfA&NfHO30RcLpcQtaoJ6?K@nHHU<-hpJET2c5{V5j^NzSc!+d z8azb)?hWWs#k#Etp_iX-(o z7+2~L$C>H_xlWY$pUx8spGQYz)BMY2#3%EN!Vhq{);v(6+Koq4Ayf;SZ&z~7$1as6lGRzI6~QG zrinZ1Y>dNt?ud^y*azLg_EN3{*RpGxgutrI9Wmg?u(Ci`Y`9*_$>O%vbRF1(jVwHh z#;9hqH+I2yM;z~#VM)SedgW3U?i3V9g$2oJ!VQ#0rJw+;s=7^ZNYsk$xg+hOYQfXS zR-m>-Ejz9SHcU~4r`v6-YOx))PuOi6WWu)b-(q+B9fKH$qrXkD2MNoRl4!B7QW7op zRZ619K1xaC7_XE>jC4*jzv@=p#llD9;i`LgN;>cL1?iA z82Gu4L{Lc-ni@>~5XE4lBrJA9qa?&F1K|bEl&T~&b%5CLjFMPbQ$z(%C8_$Ugc>EJ zVDM^)*6q_m~hfgW_2MbQ^MhaFh Q5C8xG07*qoM6N<$f|3Vu2LJ#7 literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+tp-so-preloaded+app-dlopens-lib+lib-instrumented.png b/2.7/images/export/ust-sit+tp-so-preloaded+app-dlopens-lib+lib-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..e500281b5c0a4bc07bd485596a86b8d0fc133706 GIT binary patch literal 3414 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 EKdIZj*Z=?k literal 0 HcmV?d00001 diff --git a/2.7/images/export/ust-sit+tp-so-preloaded+app-instrumented.png b/2.7/images/export/ust-sit+tp-so-preloaded+app-instrumented.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7bcc7f351ea68fe52051e10ec6f5217b2b8c6d GIT binary patch literal 2268 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 PEd<;|86nHBV+j8Nd*1{z literal 0 HcmV?d00001 diff --git a/2.7/lttng-docs-2.7.txt b/2.7/lttng-docs-2.7.txt new file mode 100644 index 0000000..c3519fe --- /dev/null +++ b/2.7/lttng-docs-2.7.txt @@ -0,0 +1,7031 @@ +The LTTng Documentation +======================= +Philippe Proulx +v2.7, 25 October 2016 + + +include::../common/copyright.txt[] + + +include::../common/welcome.txt[] + + +include::../common/audience.txt[] + + +[[chapters]] +=== What's in this documentation? + +The LTTng Documentation is divided into the following sections: + +* **<>** explains the + rudiments of software tracing and the rationale behind the + LTTng project. ++ +You can skip this section if you’re familiar with software tracing and +with the LTTng project. + +* **<>** describes the steps to + install the LTTng packages on common Linux distributions and from + their sources. ++ +You can skip this section if you already properly installed LTTng on +your target system. + +* **<>** is a concise guide to + getting started quickly with LTTng kernel and user space tracing. ++ +We recommend this section if you're new to LTTng or to software tracing +in general. ++ +You can skip this section if you're not new to LTTng. + +* **<>** explains the concepts at + the heart of LTTng. ++ +It's a good idea to become familiar with the core concepts +before attempting to use the toolkit. + +* **<>** describes the various components + of the LTTng machinery, like the daemons, the libraries, and the + command-line interface. +* **<>** shows different ways to + instrument user applications and the Linux kernel. ++ +Instrumenting source code is essential to provide a meaningful +source of events. ++ +You can skip this section if you do not have a programming background. + +* **<>** is divided into topics + which demonstrate how to use the vast array of features that + LTTng{nbsp}{revision} offers. +* **<>** contains reference links and tables. +* **<>** is a specialized dictionary of terms related + to LTTng or to the field of software tracing. + + +include::../common/convention.txt[] + + +include::../common/acknowledgements.txt[] + + +[[whats-new]] +== What's new in LTTng {revision}? + +* **Tracing control**: +** Dynamic filter support for <> in the Linux kernel + <>. For example: ++ +-- +[role="term"] +---- +lttng enable-event --kernel irq_handler_entry --filter='irq == 28' +---- +-- + +** Wildcard support in the instrumentation point name of an event rule + in the Linux kernel tracing domain. For example: ++ +-- +[role="term"] +---- +lttng enable-event --kernel 'sched_*' +---- +-- + +** New `lttng track` and `lttng untrack` commands to make + <> super-fast for both the Linux kernel + and the user space tracing domains. ++ +When LTTng _tracks_ one or more PIDs, only the processes having those PIDs +can emit events for a given tracing session. + +** New `--shm-path` option of the `lttng create` command to specify the + path where LTTng creates the shared memory holding the ring buffers. ++ +This feature is useful when used with persistent memory file systems to +extract the latest recorded trace data in the event of a crash requiring +a reboot. ++ +The new man:lttng-crash(1) command-line utility can extract trace data +from such a file (see <>). + +* **User space tracing**: +** New <> which makes it easy + to trace existing Python applications that are using the standard + https://docs.python.org/3/howto/logging.html[`logging` package]. ++ +This agent is compatible with both the Python 2 and Python 3 languages. + +** New <> facility to ease the migration from + logging to tracing. ++ +`tracelog()` is similar to <>, +but it accepts an additional log level parameter. + +** Plugin support in LTTng-UST to provide a custom clock source and to + retrieve the current CPU number. ++ +This feature exists for very advanced use cases. ++ +See the +https://github.com/lttng/lttng-ust/tree/stable-{revision}/doc/examples/clock-override[clock-override] +and +https://github.com/lttng/lttng-ust/tree/stable-{revision}/doc/examples/getcpu-override[getcpu-override] +examples for more details. + +Moreover, LTTng{nbsp}{revision} boasts great stability, benifiting from +piles of bug fixes and more-than-welcome internal refactorings. + +To learn more about the new features of LTTng{nbsp}{revision}, see +https://lttng.org/blog/2015/10/14/lttng-2.7-released/[the release announcement]. + + +[[nuts-and-bolts]] +== Nuts and bolts + +What is LTTng? As its name suggests, the _Linux Trace Toolkit: next +generation_ is a modern toolkit for tracing Linux systems and +applications. So your first question might be: +**what is tracing?** + + +[[what-is-tracing]] +=== What is tracing? + +As the history of software engineering progressed and led to what +we now take for granted--complex, numerous and +interdependent software applications running in parallel on +sophisticated operating systems like Linux--the authors of such +components, software developers, began feeling a natural +urge to have tools that would ensure the robustness and good performance +of their masterpieces. + +One major achievement in this field is, inarguably, the +https://www.gnu.org/software/gdb/[GNU debugger (GDB)], +an essential tool for developers to find and fix bugs. But even the best +debugger won't help make your software run faster, and nowadays, faster +software means either more work done by the same hardware, or cheaper +hardware for the same work. + +A _profiler_ is often the tool of choice to identify performance +bottlenecks. Profiling is suitable to identify _where_ performance is +lost in a given software. The profiler outputs a profile, a statistical +summary of observed events, which you may use to discover which +functions took the most time to execute. However, a profiler won't +report _why_ some identified functions are the bottleneck. Bottlenecks +might only occur when specific conditions are met, conditions that are +sometimes impossible to capture by a statistical profiler, or impossible +to reproduce with an application altered by the overhead of an +event-based profiler. For a thorough investigation of software +performance issues, a history of execution is essential, with the +recorded values of variables and context fields you choose, and +with as little influence as possible on the instrumented software. This +is where tracing comes in handy. + +_Tracing_ is a technique used to understand what goes on in a running +software system. The software used for tracing is called a _tracer_, +which is conceptually similar to a tape recorder. When recording, +specific instrumentation points placed in the software source code +generate events that are saved on a giant tape: a _trace_ file. You +can trace user applications and the operating system at the same time, +opening the possibility of resolving a wide range of problems that would +otherwise be extremely challenging. + +Tracing is often compared to _logging_. However, tracers and loggers are +two different tools, serving two different purposes. Tracers are +designed to record much lower-level events that occur much more +frequently than log messages, often in the range of thousands per +second, with very little execution overhead. Logging is more appropriate +for a very high-level analysis of less frequent events: user accesses, +exceptional conditions (errors and warnings, for example), database +transactions, instant messaging communications, and such. Simply put, +logging is one of the many use cases that can be satisfied with tracing. + +The list of recorded events inside a trace file can be read manually +like a log file for the maximum level of detail, but it is generally +much more interesting to perform application-specific analyses to +produce reduced statistics and graphs that are useful to resolve a +given problem. Trace viewers and analyzers are specialized tools +designed to do this. + +In the end, this is what LTTng is: a powerful, open source set of +tools to trace the Linux kernel and user applications at the same time. +LTTng is composed of several components actively maintained and +developed by its link:/community/#where[community]. + + +[[lttng-alternatives]] +=== Alternatives to noch:{LTTng} + +Excluding proprietary solutions, a few competing software tracers +exist for Linux: + +* https://github.com/dtrace4linux/linux[dtrace4linux] is a port of + Sun Microsystems's DTrace to Linux. The cmd:dtrace tool interprets + user scripts and is responsible for loading code into the + Linux kernel for further execution and collecting the outputted data. +* https://en.wikipedia.org/wiki/Berkeley_Packet_Filter[eBPF] is a + subsystem in the Linux kernel in which a virtual machine can execute + programs passed from the user space to the kernel. You can attach + such programs to tracepoints and KProbes thanks to a system call, and + they can output data to the user space when executed thanks to + different mechanisms (pipe, VM register values, and eBPF maps, to name + a few). +* https://www.kernel.org/doc/Documentation/trace/ftrace.txt[ftrace] + is the de facto function tracer of the Linux kernel. Its user + interface is a set of special files in sysfs. +* https://perf.wiki.kernel.org/[perf] is + a performance analyzing tool for Linux which supports hardware + performance counters, tracepoints, as well as other counters and + types of probes. perf's controlling utility is the cmd:perf command + line/curses tool. +* http://linux.die.net/man/1/strace[strace] + is a command-line utility which records system calls made by a + user process, as well as signal deliveries and changes of process + state. strace makes use of https://en.wikipedia.org/wiki/Ptrace[ptrace] + to fulfill its function. +* http://www.sysdig.org/[sysdig], like SystemTap, uses scripts to + analyze Linux kernel events. You write scripts, or _chisels_ in + sysdig's jargon, in Lua and sysdig executes them while the system is + being traced or afterwards. sysdig's interface is the cmd:sysdig + command-line tool as well as the curses-based cmd:csysdig tool. +* https://sourceware.org/systemtap/[SystemTap] is a Linux kernel and + user space tracer which uses custom user scripts to produce plain text + traces. SystemTap converts the scripts to the C language, and then + compiles them as Linux kernel modules which are loaded to produce + trace data. SystemTap's primary user interface is the cmd:stap + command-line tool. + +The main distinctive features of LTTng is that it produces correlated +kernel and user space traces, as well as doing so with the lowest +overhead amongst other solutions. It produces trace files in the +http://diamon.org/ctf[CTF] format, a file format optimized +for the production and analyses of multi-gigabyte data. + +LTTng is the result of more than 10 years of active open source +development by a community of passionate developers. +LTTng{nbsp}{revision} is currently available on major desktop and server +Linux distributions. + +The main interface for tracing control is a single command-line tool +named cmd:lttng. The latter can create several tracing sessions, enable +and disable events on the fly, filter events efficiently with custom +user expressions, start and stop tracing, and much more. LTTng can +record the traces on the file system or send them over the network, and +keep them totally or partially. You can view the traces once tracing +becomes inactive or in real-time. + +<> and +<>! + + +[[installing-lttng]] +== Installation + +**LTTng** is a set of software <> which interact to +<> the Linux kernel and user applications, and +to <> (start and stop +tracing, enable and disable event rules, and the rest). Those +components are bundled into the following packages: + +* **LTTng-tools**: Libraries and command-line interface to + control tracing. +* **LTTng-modules**: Linux kernel modules to instrument and + trace the kernel. +* **LTTng-UST**: Libraries and Java/Python packages to instrument and + trace user applications. + +Most distributions mark the LTTng-modules and LTTng-UST packages as +optional when installing LTTng-tools (which is always required). In the +following sections, we always provide the steps to install all three, +but note that: + +* You only need to install LTTng-modules if you intend to trace the + Linux kernel. +* You only need to install LTTng-UST if you intend to trace user + applications. + +[role="growable"] +.Availability of LTTng{nbsp}{revision} for major Linux distributions. +|==== +|Distribution |Available in releases |Alternatives + +|Ubuntu +|<> +|LTTng{nbsp}2.8 for Ubuntu{nbsp}16.10 _Yakkety Yak_. + +LTTng{nbsp}{revision} for Ubuntu{nbsp}12.04 _Precise Pangolin_, +Ubuntu{nbsp}14.04 _Trusty Tahr_, and Ubuntu{nbsp}16.04 _Xenial Xerus_: +<>. + +<> for +other Ubuntu releases. + +|Fedora +|_Not available_ +|LTTng{nbsp}{revision} for Fedora{nbsp}25 and Fedora{nbsp}26 (not +released yet). + +<> for +other Fedora releases. + +|Debian +|_Not available_ +|LTTng{nbsp}2.8 for Debian "stretch" (testing). + +<> for +other Debian releases. + +|openSUSE +|<> +|<> for +other openSUSE releases. + +|Arch Linux +|_Not available_ +|<>. + +|Alpine Linux +|_Not available_ +|LTTng{nbsp}2.8 for Alpine Linux "edge". + +LTTng{nbsp}2.8 for Alpine Linux{nbsp}3.5 (not released yet). + +<> for +other Alpine Linux releases. + +|RHEL and SLES +|See http://packages.efficios.com/[EfficiOS Enterprise Packages]. +| + +|Buildroot +|<<"buildroot","Buildroot{nbsp}2016.02, Buildroot{nbsp}2016.05, +and Buildroot{nbsp}2016.08">> +|LTTng{nbsp}2.8 for Buildroot{nbsp}2016.11 (not released yet). + +<> for +other Buildroot releases. + +|OpenEmbedded and Yocto +|<> +|LTTng{nbsp}2.8 for OpenEmbedded since 3{nbsp}September 2016. + +<> for +other OpenEmbedded releases. +|==== + + +[[ubuntu]] +=== [[ubuntu-official-repositories]]Ubuntu + +LTTng{nbsp}{revision} is available on Ubuntu 16.04 _Xenial Xerus_. For +previous releases of Ubuntu, <>. + +To install LTTng{nbsp}{revision} on Ubuntu{nbsp}16.04 _Xenial Xerus_: + +. Install the main LTTng{nbsp}{revision} packages: ++ +-- +[role="term"] +---- +sudo apt-get install lttng-tools +sudo apt-get install lttng-modules-dkms +sudo apt-get install liblttng-ust-dev +---- +-- + +. **If you need to instrument and trace + <>**, install the LTTng-UST + Java agent: ++ +-- +[role="term"] +---- +sudo apt-get install liblttng-ust-agent-java +---- +-- + +. **If you need to instrument and trace + <>**, install the + LTTng-UST Python agent: ++ +-- +[role="term"] +---- +sudo apt-get install python3-lttngust +---- +-- + + +[[ubuntu-ppa]] +==== noch:{LTTng} Stable {revision} PPA + +The +https://launchpad.net/~lttng/+archive/ubuntu/stable-{revision}[LTTng Stable{nbsp}{revision} PPA] +offers the latest stable LTTng{nbsp}{revision} packages for: + +* Ubuntu{nbsp}12.04 _Precise Pangolin_ +* Ubuntu{nbsp}14.04 _Trusty Tahr_ +* Ubuntu{nbsp}16.04 _Xenial Xerus_ + +To install LTTng{nbsp}{revision} from the LTTng Stable{nbsp}{revision} +PPA: + +. Add the LTTng Stable{nbsp}{revision} PPA repository and update the + list of packages: ++ +-- +[role="term"] +---- +sudo apt-add-repository ppa:lttng/stable-2.7 +sudo apt-get update +---- +-- + +. Install the main LTTng{nbsp}{revision} packages: ++ +-- +[role="term"] +---- +sudo apt-get install lttng-tools +sudo apt-get install lttng-modules-dkms +sudo apt-get install liblttng-ust-dev +---- +-- + +. **If you need to instrument and trace + <>**, install the LTTng-UST + Java agent: ++ +-- +[role="term"] +---- +sudo apt-get install liblttng-ust-agent-java +---- +-- + +. **If you need to instrument and trace + <>**, install the + LTTng-UST Python agent: ++ +-- +[role="term"] +---- +sudo apt-get install python3-lttngust +---- +-- + + +[[opensuse]] +=== noch:{openSUSE}/RPM + +To install LTTng{nbsp}{revision} on openSUSE Leap{nbsp}42.1: + +* Install the main LTTng{nbsp}{revision} packages: ++ +-- +[role="term"] +---- +sudo zypper install lttng-tools +sudo zypper install lttng-modules +sudo zypper install lttng-ust-devel +---- +-- + +[IMPORTANT] +.Java and Python application instrumentation and tracing +==== +If you need to instrument and trace <> on openSUSE, you need to build and install +LTTng-UST{nbsp}{revision} <> and pass +the `--enable-java-agent-jul`, `--enable-java-agent-log4j`, or +`--enable-java-agent-all` options to the `configure` script, depending +on which Java logging framework you use. + +If you need to instrument and trace <> on openSUSE, you need to build and install +LTTng-UST{nbsp}{revision} from source and pass the +`--enable-python-agent` option to the `configure` script. +==== + + +[[buildroot]] +=== Buildroot + +To install LTTng{nbsp}{revision} on Buildroot{nbsp}2016.02, +Buildroot{nbsp}2016.05, or Buildroot{nbsp}2016.08: + +. Launch the Buildroot configuration tool: ++ +-- +[role="term"] +---- +make menuconfig +---- +-- + +. In **Kernel**, check **Linux kernel**. +. In **Toolchain**, check **Enable WCHAR support**. +. In **Target packages**{nbsp}→ **Debugging, profiling and benchmark**, + check **lttng-modules** and **lttng-tools**. +. In **Target packages**{nbsp}→ **Libraries**{nbsp}→ + **Other**, check **lttng-libust**. + + +[[oe-yocto]] +=== OpenEmbedded and Yocto + +LTTng{nbsp}{revision} recipes are available in the +http://layers.openembedded.org/layerindex/branch/master/layer/openembedded-core/[`openembedded-core`] +layer of OpenEmbedded since 1{nbsp}December 2016 until +3{nbsp}September 2016 under the following names: + +* `lttng-tools` +* `lttng-modules` +* `lttng-ust` + +With BitBake, the simplest way to include LTTng recipes in your target +image is to add them to `IMAGE_INSTALL_append` in path:{conf/local.conf}: + +---- +IMAGE_INSTALL_append = " lttng-tools lttng-modules lttng-ust" +---- + +If you use Hob: + +. Select a machine and an image recipe. +. Click **Edit image recipe**. +. Under the **All recipes** tab, search for **lttng**. +. Check the desired LTTng recipes. + +[IMPORTANT] +.Java and Python application instrumentation and tracing +==== +If you need to instrument and trace <> on openSUSE, you need to build and install +LTTng-UST{nbsp}{revision} <> and pass +the `--enable-java-agent-jul`, `--enable-java-agent-log4j`, or +`--enable-java-agent-all` options to the `configure` script, depending +on which Java logging framework you use. + +If you need to instrument and trace <> on openSUSE, you need to build and install +LTTng-UST{nbsp}{revision} from source and pass the +`--enable-python-agent` option to the `configure` script. +==== + + +[[enterprise-distributions]] +=== RHEL, SUSE, and other enterprise distributions + +To install LTTng on enterprise Linux distributions, such as Red Hat +Enterprise Linux (RHEL) and SUSE Linux Enterprise Server (SUSE), please +see http://packages.efficios.com/[EfficiOS Enterprise Packages]. + + +[[building-from-source]] +=== Build from source + +To build and install LTTng{nbsp}{revision} from source: + +. Using your distribution's package manager, or from source, install + the following dependencies of LTTng-tools and LTTng-UST: ++ +-- +* https://sourceforge.net/projects/libuuid/[libuuid] +* http://directory.fsf.org/wiki/Popt[popt] +* http://liburcu.org/[Userspace RCU] +* http://www.xmlsoft.org/[libxml2] +-- + +. Download, build, and install the latest LTTng-modules{nbsp}{revision}: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-modules/lttng-modules-latest-2.7.tar.bz2 && +tar -xf lttng-modules-latest-2.7.tar.bz2 && +cd lttng-modules-2.7.* && +make && +sudo make modules_install && +sudo depmod -a +---- +-- + +. Download, build, and install the latest LTTng-UST{nbsp}{revision}: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-ust/lttng-ust-latest-2.7.tar.bz2 && +tar -xf lttng-ust-latest-2.7.tar.bz2 && +cd lttng-ust-2.7.* && +./configure && +make && +sudo make install && +sudo ldconfig +---- +-- ++ +-- +[IMPORTANT] +.Java and Python application tracing +==== +If you need to instrument and trace <>, pass the `--enable-java-agent-jul`, +`--enable-java-agent-log4j`, or `--enable-java-agent-all` options to the +`configure` script, depending on which Java logging framework you use. + +If you need to instrument and trace <>, pass the `--enable-python-agent` option to the +`configure` script. You can set the `PYTHON` environment variable to the +path to the Python interpreter for which to install the LTTng-UST Python +agent package. +==== +-- ++ +-- +[NOTE] +==== +By default, LTTng-UST libraries are installed to +dir:{/usr/local/lib}, which is the de facto directory in which to +keep self-compiled and third-party libraries. + +When <>: + +* Append `/usr/local/lib` to the env:LD_LIBRARY_PATH environment + variable. +* Pass the `-L/usr/local/lib` and `-Wl,-rpath,/usr/local/lib` options to + man:gcc(1), man:g++(1), or man:clang(1). +==== +-- + +. Download, build, and install the latest LTTng-tools{nbsp}{revision}: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-tools/lttng-tools-latest-2.7.tar.bz2 && +tar -xf lttng-tools-latest-2.7.tar.bz2 && +cd lttng-tools-2.7.* && +./configure && +make && +sudo make install && +sudo ldconfig +---- +-- + +TIP: The https://github.com/eepp/vlttng[vlttng tool] can do all the +previous steps automatically for a given version of LTTng and confine +the installed files in a specific directory. This can be useful to test +LTTng without installing it on your system. + + +[[getting-started]] +== Quick start + +This is a short guide to get started quickly with LTTng kernel and user +space tracing. + +Before you follow this guide, make sure to <> +LTTng. + +This tutorial walks you through the steps to: + +. <>. +. <> written + in C. +. <>. + + +[[tracing-the-linux-kernel]] +=== Trace the Linux kernel + +The following command lines start with cmd:sudo because you need root +privileges to trace the Linux kernel. You can avoid using cmd:sudo if +your Unix user is a member of the <>. + +. Create a <>: ++ +-- +[role="term"] +---- +sudo lttng create my-kernel-session +---- +-- + +. List the available kernel tracepoints and system calls: ++ +-- +[role="term"] +---- +lttng list --kernel +---- +-- + +. Create an <> which matches the desired event names, + for example `sched_switch` and `sched_process_fork`: ++ +-- +[role="term"] +---- +sudo lttng enable-event --kernel sched_switch,sched_process_fork +---- +-- ++ +You can also create an event rule which _matches_ all the Linux kernel +tracepoints (this will generate a lot of data when tracing): ++ +-- +[role="term"] +---- +sudo lttng enable-event --kernel --all +---- +-- + +. Start tracing: ++ +-- +[role="term"] +---- +sudo lttng start +---- +-- + +. Do some operation on your system for a few seconds. For example, + load a website, or list the files of a directory. +. Stop tracing and destroy the tracing session: ++ +-- +[role="term"] +---- +sudo lttng stop +sudo lttng destroy +---- +-- ++ +The `destroy` command does not destroy the trace data; it only destroys +the state of the tracing session. + +By default, LTTng saves the traces in ++$LTTNG_HOME/lttng-traces/__name__-__date__-__time__+, +where +__name__+ is the tracing session name. Note that the +env:LTTNG_HOME environment variable defaults to `$HOME` if not set. + +See <> to view the recorded events. + + +[[tracing-your-own-user-application]] +=== Trace a user application + +This section steps you through a simple example to trace a +_Hello world_ program written in C. + +To create the traceable user application: + +. Create the tracepoint provider header file, which defines the + tracepoints and the events they can generate: ++ +-- +[source,c] +.path:{hello-tp.h} +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER hello_world + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./hello-tp.h" + +#if !defined(_HELLO_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _HELLO_TP_H + +#include + +TRACEPOINT_EVENT( + hello_world, + my_first_tracepoint, + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) + +#endif /* _HELLO_TP_H */ + +#include +---- +-- + +. Create the tracepoint provider package source file: ++ +-- +[source,c] +.path:{hello-tp.c} +---- +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE + +#include "hello-tp.h" +---- +-- + +. Build the tracepoint provider package: ++ +-- +[role="term"] +---- +gcc -c -I. hello-tp.c +---- +-- + +. Create the _Hello World_ application source file: ++ +-- +[source,c] +.path:{hello.c} +---- +#include +#include "hello-tp.h" + +int main(int argc, char *argv[]) +{ + int x; + + puts("Hello, World!\nPress Enter to continue..."); + + /* + * The following getchar() call is only placed here for the purpose + * of this demonstration, to pause the application in order for + * you to have time to list its tracepoints. It is not + * needed otherwise. + */ + getchar(); + + /* + * A tracepoint() call. + * + * Arguments, as defined in hello-tp.h: + * + * 1. Tracepoint provider name (required) + * 2. Tracepoint name (required) + * 3. my_integer_arg (first user-defined argument) + * 4. my_string_arg (second user-defined argument) + * + * Notice the tracepoint provider and tracepoint names are + * NOT strings: they are in fact parts of variables that the + * macros in hello-tp.h create. + */ + tracepoint(hello_world, my_first_tracepoint, 23, "hi there!"); + + for (x = 0; x < argc; ++x) { + tracepoint(hello_world, my_first_tracepoint, x, argv[x]); + } + + puts("Quitting now!"); + tracepoint(hello_world, my_first_tracepoint, x * x, "x^2"); + + return 0; +} +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -c hello.c +---- +-- + +. Link the application with the tracepoint provider package, + `liblttng-ust`, and `libdl`: ++ +-- +[role="term"] +---- +gcc -o hello hello.o hello-tp.o -llttng-ust -ldl +---- +-- + +Here's the whole build process: + +[role="img-100"] +.User space tracing tutorial's build steps. +image::ust-flow.png[] + +To trace the user application: + +. Run the application with a few arguments: ++ +-- +[role="term"] +---- +./hello world and beyond +---- +-- ++ +You see: ++ +-- +---- +Hello, World! +Press Enter to continue... +---- +-- + +. Start an LTTng <>: ++ +-- +[role="term"] +---- +lttng-sessiond --daemonize +---- +-- ++ +Note that a session daemon might already be running, for example as +a service that the distribution's service manager started. + +. List the available user space tracepoints: ++ +-- +[role="term"] +---- +lttng list --userspace +---- +-- ++ +You see the `hello_world:my_first_tracepoint` tracepoint listed +under the `./hello` process. + +. Create a <>: ++ +-- +[role="term"] +---- +lttng create my-user-space-session +---- +-- + +. Create an <> which matches the + `hello_world:my_first_tracepoint` event name: ++ +-- +[role="term"] +---- +lttng enable-event --userspace hello_world:my_first_tracepoint +---- +-- + +. Start tracing: ++ +-- +[role="term"] +---- +lttng start +---- +-- + +. Go back to the running `hello` application and press Enter. The + program executes all `tracepoint()` instrumentation points and exits. +. Stop tracing and destroy the tracing session: ++ +-- +[role="term"] +---- +sudo lttng stop +sudo lttng destroy +---- +-- ++ +The `destroy` command does not destroy the trace data; it only destroys +the state of the tracing session. + +By default, LTTng saves the traces in ++$LTTNG_HOME/lttng-traces/__name__-__date__-__time__+, +where +__name__+ is the tracing session name. Note that the +env:LTTNG_HOME environment variable defaults to `$HOME` if not set. + +See <> to view the recorded events. + + +[[viewing-and-analyzing-your-traces]] +=== View and analyze the recorded events + +Once you have completed the <> and <> tutorials, you can inspect the recorded events. + +Many tools are available to read LTTng traces: + +* **cmd:babeltrace** is a command-line utility which converts trace + formats; it supports the format that LTTng produces, CTF, as well as a + basic text output which can be ++grep++ed. The cmd:babeltrace command + is part of the http://diamon.org/babeltrace[Babeltrace] project. +* Babeltrace also includes + **https://www.python.org/[Python] bindings** so + that you can easily open and read an LTTng trace with your own script, + benefiting from the power of Python. +* http://tracecompass.org/[**Trace Compass**] + is a graphical user interface for viewing and analyzing any type of + logs or traces, including LTTng's. +* https://github.com/lttng/lttng-analyses[**LTTng analyses**] is a + project which includes many high-level analyses of LTTng kernel + traces, like scheduling statistics, interrupt frequency distribution, + top CPU usage, and more. + +NOTE: This section assumes that the traces recorded during the previous +tutorials were saved to their default location, in the +dir:{$LTTNG_HOME/lttng-traces} directory. Note that the env:LTTNG_HOME +environment variable defaults to `$HOME` if not set. + + +[[viewing-and-analyzing-your-traces-bt]] +==== Use the cmd:babeltrace command-line tool + +The simplest way to list all the recorded events of a trace is to pass +its path to cmd:babeltrace with no options: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-user-space-session* +---- + +cmd:babeltrace finds all traces recursively within the given path and +prints all their events, merging them in chronological order. + +You can pipe the output of cmd:babeltrace into a tool like man:grep(1) for +further filtering: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-kernel-session* | grep sys_ +---- + +You can pipe the output of cmd:babeltrace into a tool like man:wc(1) to +count the recorded events: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-kernel-session* | grep sys_read | wc --lines +---- + + +[[viewing-and-analyzing-your-traces-bt-python]] +==== Use the Babeltrace Python bindings + +The <> +is useful to isolate events by simple matching using man:grep(1) and +similar utilities. However, more elaborate filters, such as keeping only +event records with a field value falling within a specific range, are +not trivial to write using a shell. Moreover, reductions and even the +most basic computations involving multiple event records are virtually +impossible to implement. + +Fortunately, Babeltrace ships with Python 3 bindings which makes it easy +to read the event records of an LTTng trace sequentially and compute the +desired information. + +The following script accepts an LTTng Linux kernel trace path as its +first argument and prints the short names of the top 5 running processes +on CPU 0 during the whole trace: + +[source,python] +.path:{top5proc.py} +---- +from collections import Counter +import babeltrace +import sys + + +def top5proc(): + if len(sys.argv) != 2: + msg = 'Usage: python3 {} TRACEPATH'.format(sys.argv[0]) + print(msg, file=sys.stderr) + return False + + # A trace collection contains one or more traces + col = babeltrace.TraceCollection() + + # Add the trace provided by the user (LTTng traces always have + # the 'ctf' format) + if col.add_trace(sys.argv[1], 'ctf') is None: + raise RuntimeError('Cannot add trace') + + # This counter dict contains execution times: + # + # task command name -> total execution time (ns) + exec_times = Counter() + + # This contains the last `sched_switch` timestamp + last_ts = None + + # Iterate on events + for event in col.events: + # Keep only `sched_switch` events + if event.name != 'sched_switch': + continue + + # Keep only events which happened on CPU 0 + if event['cpu_id'] != 0: + continue + + # Event timestamp + cur_ts = event.timestamp + + if last_ts is None: + # We start here + last_ts = cur_ts + + # Previous task command (short) name + prev_comm = event['prev_comm'] + + # Initialize entry in our dict if not yet done + if prev_comm not in exec_times: + exec_times[prev_comm] = 0 + + # Compute previous command execution time + diff = cur_ts - last_ts + + # Update execution time of this command + exec_times[prev_comm] += diff + + # Update last timestamp + last_ts = cur_ts + + # Display top 5 + for name, ns in exec_times.most_common(5): + s = ns / 1000000000 + print('{:20}{} s'.format(name, s)) + + return True + + +if __name__ == '__main__': + sys.exit(0 if top5proc() else 1) +---- + +Run this script: + +[role="term"] +---- +python3 top5proc.py ~/lttng-traces/my-kernel-session*/kernel +---- + +Output example: + +---- +swapper/0 48.607245889 s +chromium 7.192738188 s +pavucontrol 0.709894415 s +Compositor 0.660867933 s +Xorg.bin 0.616753786 s +---- + +Note that `swapper/0` is the "idle" process of CPU 0 on Linux; since we +weren't using the CPU that much when tracing, its first position in the +list makes sense. + + +[[core-concepts]] +== [[understanding-lttng]]Core concepts + +From a user's perspective, the LTTng system is built on a few concepts, +or objects, on which the <> +operates by sending commands to the <>. +Understanding how those objects relate to eachother is key in mastering +the toolkit. + +The core concepts are: + +* <> +* <> +* <> +* <<"event","Instrumentation point, event rule, event, and event record">> + + +[[tracing-session]] +=== Tracing session + +A _tracing session_ is a stateful dialogue between you and +a <>. You can +<> with the `lttng create` command. + +Anything that you do when you control LTTng tracers happens within a +tracing session. In particular, a tracing session: + +* Has its own name. +* Has its own set of trace files. +* Has its own state of activity (started or stopped). +* Has its own <> (local, network streaming, + snapshot, or live). +* Has its own <> which have their own + <>. + +[role="img-100"] +.A _tracing session_ contains <> that are members of <> and contain <>. +image::concepts.png[] + +Those attributes and objects are completely isolated between different +tracing sessions. + +A tracing session is analogous to a cash machine session: +the operations you do on the banking system through the cash machine do +not alter the data of other users of the same system. In the case of +the cash machine, a session lasts as long as your bank card is inside. +In the case of LTTng, a tracing session lasts from the `lttng create` +command to the `lttng destroy` command. + +[role="img-100"] +.Each Unix user has its own set of tracing sessions. +image::many-sessions.png[] + + +[[tracing-session-mode]] +==== Tracing session mode + +LTTng can send the generated trace data to different locations. The +_tracing session mode_ dictates where to send it. The following modes +are available in LTTng{nbsp}{revision}: + +Local mode:: + LTTng writes the traces to the file system of the machine being traced + (target system). + +Network streaming mode:: + LTTng sends the traces over the network to a + <> running on a remote system. + +Snapshot mode:: + LTTng does not write the traces by default. Instead, you can request + LTTng to <>, that is, a copy of the + current tracing buffers, and to write it to the target's file system + or to send it over the network to a <> + running on a remote system. + +Live mode:: + This mode is similar to the network streaming mode, but a live + trace viewer can connect to the distant relay daemon to + <> by + the tracers. + + +[[domain]] +=== Tracing domain + +A _tracing domain_ is a namespace for event sources. A tracing domain +has its own properties and features. + +There are currently five available tracing domains: + +* Linux kernel +* User space +* `java.util.logging` (JUL) +* log4j +* Python + +You must specify a tracing domain when using some commands to avoid +ambiguity. For example, since all the domains support named tracepoints +as event sources (instrumentation points that you manually insert in the +source code), you need to specify a tracing domain when +<> because all the +tracing domains could have tracepoints with the same names. + +Some features are reserved to specific tracing domains. Dynamic function +entry and return instrumentation points, for example, are currently only +supported in the Linux kernel tracing domain, but support for other +tracing domains could be added in the future. + +You can create <> in the Linux kernel and user space +tracing domains. The other tracing domains have a single default +channel. + + +[[channel]] +=== Channel and ring buffer + +A _channel_ is an object which is responsible for a set of ring buffers. +Each ring buffer is divided into multiple sub-buffers. When an LTTng +tracer emits an event, it can record it to one or more +sub-buffers. The attributes of a channel determine what to do when +there's no space left for a new event record because all sub-buffers +are full, where to send a full sub-buffer, and other behaviours. + +A channel is always associated to a <>. The +`java.util.logging` (JUL), log4j, and Python tracing domains each have +a default channel which you cannot configure. + +A channel also owns <>. When an LTTng tracer emits +an event, it records it to the sub-buffers of all +the enabled channels with a satisfied event rule, as long as those +channels are part of active <>. + + +[[channel-buffering-schemes]] +==== Per-user vs. per-process buffering schemes + +A channel has at least one ring buffer _per CPU_. LTTng always +records an event to the ring buffer associated to the CPU on which it +occurred. + +Two _buffering schemes_ are available when you +<> in the +user space <>: + +Per-user buffering:: + Allocate one set of ring buffers--one per CPU--shared by all the + instrumented processes of each Unix user. ++ +-- +[role="img-100"] +.Per-user buffering scheme. +image::per-user-buffering.png[] +-- + +Per-process buffering:: + Allocate one set of ring buffers--one per CPU--for each + instrumented process. ++ +-- +[role="img-100"] +.Per-process buffering scheme. +image::per-process-buffering.png[] +-- ++ +The per-process buffering scheme tends to consume more memory than the +per-user option because systems generally have more instrumented +processes than Unix users running instrumented processes. However, the +per-process buffering scheme ensures that one process having a high +event throughput won't fill all the shared sub-buffers of the same +user, only its own. + +The Linux kernel tracing domain has only one available buffering scheme +which is to allocate a single set of ring buffers for the whole system. +This scheme is similar to the per-user option, but with a single, global +user "running" the kernel. + + +[[channel-overwrite-mode-vs-discard-mode]] +==== Overwrite vs. discard event loss modes + +When an event occurs, LTTng records it to a specific sub-buffer (yellow +arc in the following animation) of a specific channel's ring buffer. +When there's no space left in a sub-buffer, the tracer marks it as +consumable (red) and another, empty sub-buffer starts receiving the +following event records. A <> +eventually consumes the marked sub-buffer (returns to white). + +[NOTE] +[role="docsvg-channel-subbuf-anim"] +==== +{note-no-anim} +==== + +In an ideal world, sub-buffers are consumed faster than they are filled, +as is the case in the previous animation. In the real world, +however, all sub-buffers can be full at some point, leaving no space to +record the following events. + +By design, LTTng is a _non-blocking_ tracer: when no empty sub-buffer is +available, it is acceptable to lose event records when the alternative +would be to cause substantial delays in the instrumented application's +execution. LTTng privileges performance over integrity; it aims at +perturbing the traced system as little as possible in order to make +tracing of subtle race conditions and rare interrupt cascades possible. + +When it comes to losing event records because no empty sub-buffer is +available, the channel's _event loss mode_ determines what to do. The +available event loss modes are: + +Discard mode:: + Drop the newest event records until a the tracer + releases a sub-buffer. + +Overwrite mode:: + Clear the sub-buffer containing the oldest event records and start + writing the newest event records there. ++ +This mode is sometimes called _flight recorder mode_ because it's +similar to a +https://en.wikipedia.org/wiki/Flight_recorder[flight recorder]: +always keep a fixed amount of the latest data. + +Which mechanism you should choose depends on your context: prioritize +the newest or the oldest event records in the ring buffer? + +Beware that, in overwrite mode, the tracer abandons a whole sub-buffer +as soon as a there's no space left for a new event record, whereas in +discard mode, the tracer only discards the event record that doesn't +fit. + +In discard mode, LTTng increments a count of lost event records when +an event record is lost and saves this count to the trace. In +overwrite mode, LTTng keeps no information when it overwrites a +sub-buffer before consuming it. + +There are a few ways to decrease your probability of losing event +records. +<> shows +how you can fine-une the sub-buffer count and size of a channel to +virtually stop losing event records, though at the cost of greater +memory usage. + + +[[channel-subbuf-size-vs-subbuf-count]] +==== Sub-buffer count and size + +When you <>, you can +set its number of sub-buffers and their size. + +Note that there is noticeable CPU overhead introduced when +switching sub-buffers (marking a full one as consumable and switching +to an empty one for the following events to be recorded). Knowing this, +the following list presents a few practical situations along with how +to configure the sub-buffer count and size for them: + +* **High event throughput**: In general, prefer bigger sub-buffers to + lower the risk of losing event records. ++ +Having bigger sub-buffers also ensures a lower sub-buffer switching +frequency. ++ +The number of sub-buffers is only meaningful if you create the channel +in overwrite mode: in this case, if a sub-buffer overwrite happens, the +other sub-buffers are left unaltered. + +* **Low event throughput**: In general, prefer smaller sub-buffers + since the risk of losing event records is low. ++ +Because events occur less frequently, the sub-buffer switching frequency +should remain low and thus the tracer's overhead should not be a +problem. + +* **Low memory system**: If your target system has a low memory + limit, prefer fewer first, then smaller sub-buffers. ++ +Even if the system is limited in memory, you want to keep the +sub-buffers as big as possible to avoid a high sub-buffer switching +frequency. + +Note that LTTng uses http://diamon.org/ctf/[CTF] as its trace format, +which means event data is very compact. For example, the average +LTTng kernel event record weights about 32{nbsp}bytes. Thus, a +sub-buffer size of 1{nbsp}MiB is considered big. + +The previous situations highlight the major trade-off between a few big +sub-buffers and more, smaller sub-buffers: sub-buffer switching +frequency vs. how much data is lost in overwrite mode. Assuming a +constant event throughput and using the overwrite mode, the two +following configurations have the same ring buffer total size: + +[NOTE] +[role="docsvg-channel-subbuf-size-vs-count-anim"] +==== +{note-no-anim} +==== + +* **2 sub-buffers of 4{nbsp}MiB each**: Expect a very low sub-buffer + switching frequency, but if a sub-buffer overwrite happens, half of + the event records so far (4{nbsp}MiB) are definitely lost. +* **8 sub-buffers of 1{nbsp}MiB each**: Expect 4{nbsp}times the tracer's + overhead as the previous configuration, but if a sub-buffer + overwrite happens, only the eighth of event records so far are + definitely lost. + +In discard mode, the sub-buffers count parameter is pointless: use two +sub-buffers and set their size according to the requirements of your +situation. + + +[[channel-switch-timer]] +==== Switch timer period + +The _switch timer period_ is an important configurable attribute of +a channel to ensure periodic sub-buffer flushing. + +When the _switch timer_ expires, a sub-buffer switch happens. You can +set the switch timer period attribute when you +<> to ensure that event +data is consumed and committed to trace files or to a distant relay +daemon periodically in case of a low event throughput. + +[NOTE] +[role="docsvg-channel-switch-timer"] +==== +{note-no-anim} +==== + +This attribute is also convenient when you use big sub-buffers to cope +with a sporadic high event throughput, even if the throughput is +normally low. + + +[[channel-read-timer]] +==== Read timer period + +By default, the LTTng tracers use a notification mechanism to signal a +full sub-buffer so that a consumer daemon can consume it. When such +notifications must be avoided, for example in real-time applications, +you can use the channel's _read timer_ instead. When the read timer +fires, the <> checks for full, +consumable sub-buffers. + + +[[tracefile-rotation]] +==== Trace file count and size + +By default, trace files can grow as large as needed. You can set the +maximum size of each trace file that a channel writes when you +<>. When the size of +a trace file reaches the channel's fixed maximum size, LTTng creates +another file to contain the next event records. LTTng appends a file +count to each trace file name in this case. + +If you set the trace file size attribute when you create a channel, the +maximum number of trace files that LTTng creates is _unlimited_ by +default. To limit them, you can also set a maximum number of trace +files. When the number of trace files reaches the channel's fixed +maximum count, the oldest trace file is overwritten. This mechanism is +called _trace file rotation_. + + +[[event]] +=== Instrumentation point, event rule, event, and event record + +An _event rule_ is a set of conditions which must be **all** satisfied +for LTTng to record an occuring event. + +You set the conditions when you <>. + +You always attach an event rule to <> when you create +it. + +When an event passes the conditions of an event rule, LTTng records it +in one of the attached channel's sub-buffers. + +The available conditions, as of LTTng{nbsp}{revision}, are: + +* The event rule _is enabled_. +* The instrumentation point's type _is{nbsp}T_. +* The instrumentation point's name (sometimes called _event name_) + _matches{nbsp}N_, but _is not{nbsp}E_. +* The instrumentation point's log level _is as severe as{nbsp}L_, or + _is exactly{nbsp}L_. +* The fields of the event's payload _satisfy_ a filter + expression{nbsp}__F__. + +As you can see, all the conditions but the dynamic filter are related to +the event rule's status or to the instrumentation point, not to the +occurring events. This is why, without a filter, checking if an event +passes an event rule is not a dynamic task: when you create or modify an +event rule, all the tracers of its tracing domain enable or disable the +instrumentation points themselves once. This is possible because the +attributes of an instrumentation point (type, name, and log level) are +defined statically. In other words, without a dynamic filter, the tracer +_does not evaluate_ the arguments of an instrumentation point unless it +matches an enabled event rule. + +Note that, for LTTng to record an event, the <> to +which a matching event rule is attached must also be enabled, and the +tracing session owning this channel must be active. + +[role="img-100"] +.Logical path from an instrumentation point to an event record. +image::event-rule.png[] + +.Event, event record, or event rule? +**** +With so many similar terms, it's easy to get confused. + +An **event** is the consequence of the execution of an _instrumentation +point_, like a tracepoint that you manually place in some source code, +or a Linux kernel KProbe. An event is said to _occur_ at a specific +time. Different actions can be taken upon the occurance of an event, +like record the event's payload to a buffer. + +An **event record** is the representation of an event in a sub-buffer. A +tracer is responsible for capturing the payload of an event, current +context variables, the event's ID, and the event's timestamp. LTTng +can append this sub-buffer to a trace file. + +An **event rule** is a set of conditions which must all be satisfied for +LTTng to record an occuring event. Events still occur without +satisfying event rules, but LTTng does not record them. +**** + + +[[plumbing]] +== Components of noch:{LTTng} + +The second _T_ in _LTTng_ stands for _toolkit_: it would be wrong +to call LTTng a simple _tool_ since it is composed of multiple +interacting components. This section describes those components, +explains their respective roles, and shows how they connect together to +form the LTTng ecosystem. + +The following diagram shows how the most important components of LTTng +interact with user applications, the Linux kernel, and you: + +[role="img-100"] +.Control and trace data paths between LTTng components. +image::plumbing.png[] + +The LTTng project incorporates: + +* **LTTng-tools**: Libraries and command-line interface to + control tracing sessions. +** <> (man:lttng-sessiond(8)). +** <> (man:lttng-consumerd(8)). +** <> (man:lttng-relayd(8)). +** <> (`liblttng-ctl`). +** <> (man:lttng(1)). +* **LTTng-UST**: Libraries and Java/Python packages to trace user + applications. +** <> (`liblttng-ust`) and its + headers to instrument and trace any native user application. +** <>: +*** `liblttng-ust-libc-wrapper` +*** `liblttng-ust-pthread-wrapper` +*** `liblttng-ust-cyg-profile` +*** `liblttng-ust-cyg-profile-fast` +*** `liblttng-ust-dl` +** User space tracepoint provider source files generator command-line + tool (man:lttng-gen-tp(1)). +** <> to instrument and trace + Java applications using `java.util.logging` or + Apache log4j 1.2 logging. +** <> to instrument + Python applications using the standard `logging` package. +* **LTTng-modules**: <> to trace + the kernel. +** LTTng kernel tracer module. +** Tracing ring buffer kernel modules. +** Probe kernel modules. +** LTTng logger kernel module. + + +[[lttng-cli]] +=== Tracing control command-line interface + +[role="img-100"] +.The tracing control command-line interface. +image::plumbing-lttng-cli.png[] + +The _man:lttng(1) command-line tool_ is the standard user interface to +control LTTng <>. The cmd:lttng tool +is part of LTTng-tools. + +The cmd:lttng tool is linked with +<> to communicate with +one or more <> behind the scenes. + +The cmd:lttng tool has a Git-like interface: + +[role="term"] +---- +lttng +---- + +The <> section explores the +available features of LTTng using the cmd:lttng tool. + + +[[liblttng-ctl-lttng]] +=== Tracing control library + +[role="img-100"] +.The tracing control library. +image::plumbing-liblttng-ctl.png[] + +The _LTTng control library_, `liblttng-ctl`, is used to communicate +with a <> using a C API that hides the +underlying protocol's details. `liblttng-ctl` is part of LTTng-tools. + +The <> +is linked with `liblttng-ctl`. + +You can use `liblttng-ctl` in C or $$C++$$ source code by including its +"master" header: + +[source,c] +---- +#include +---- + +Some objects are referenced by name (C string), such as tracing +sessions, but most of them require to create a handle first using +`lttng_create_handle()`. + +The best available developer documentation for `liblttng-ctl` is, as of +LTTng{nbsp}{revision}, its installed header files. Every function and +structure is thoroughly documented. + + +[[lttng-ust]] +=== User space tracing library + +[role="img-100"] +.The user space tracing library. +image::plumbing-liblttng-ust.png[] + +The _user space tracing library_, `liblttng-ust` (see man:lttng-ust(3)), +is the LTTng user space tracer. It receives commands from a +<>, for example to +enable and disable specific instrumentation points, and writes event +records to ring buffers shared with a +<>. +`liblttng-ust` is part of LTTng-UST. + +Public C header files are installed beside `liblttng-ust` to +instrument any <>. + +<>, which are regular Java and Python +packages, use their own library providing tracepoints which is +linked with `liblttng-ust`. + +An application or library does not have to initialize `liblttng-ust` +manually: its constructor does the necessary tasks to properly register +to a session daemon. The initialization phase also enables the +instrumentation points matching the <> that you +already created. + + +[[lttng-ust-agents]] +=== User space tracing agents + +[role="img-100"] +.The user space tracing agents. +image::plumbing-lttng-ust-agents.png[] + +The _LTTng-UST Java and Python agents_ are regular Java and Python +packages which add LTTng tracing capabilities to the +native logging frameworks. The LTTng-UST agents are part of LTTng-UST. + +In the case of Java, the +https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[`java.util.logging` +core logging facilities] and +https://logging.apache.org/log4j/1.2/[Apache log4j 1.2] are supported. +Note that Apache Log4{nbsp}2 is not supported. + +In the case of Python, the standard +https://docs.python.org/3/library/logging.html[`logging`] package +is supported. Both Python 2 and Python 3 modules can import the +LTTng-UST Python agent package. + +The applications using the LTTng-UST agents are in the +`java.util.logging` (JUL), +log4j, and Python <>. + +Both agents use the same mechanism to trace the log statements. When an +agent is initialized, it creates a log handler that attaches to the root +logger. The agent also registers to a <>. +When the application executes a log statement, it is passed to the +agent's log handler by the root logger. The agent's log handler calls a +native function in a tracepoint provider package shared library linked +with <>, passing the formatted log message and +other fields, like its logger name and its log level. This native +function contains a user space instrumentation point, hence tracing the +log statement. + +The log level condition of an +<> is considered when tracing +a Java or a Python application, and it's compatible with the standard +JUL, log4j, and Python log levels. + + +[[lttng-modules]] +=== LTTng kernel modules + +[role="img-100"] +.The LTTng kernel modules. +image::plumbing-lttng-modules.png[] + +The _LTTng kernel modules_ are a set of Linux kernel modules +which implement the kernel tracer of the LTTng project. The LTTng +kernel modules are part of LTTng-modules. + +The LTTng kernel modules include: + +* A set of _probe_ modules. ++ +Each module attaches to a specific subsystem +of the Linux kernel using its tracepoint instrument points. There are +also modules to attach to the entry and return points of the Linux +system call functions. + +* _Ring buffer_ modules. ++ +A ring buffer implementation is provided as kernel modules. The LTTng +kernel tracer writes to the ring buffer; a +<> reads from the ring buffer. + +* The _LTTng kernel tracer_ module. +* The _LTTng logger_ module. ++ +The LTTng logger module implements the special path:{/proc/lttng-logger} +file so that any executable can generate LTTng events by opening and +writing to this file. ++ +See <>. + +Generally, you do not have to load the LTTng kernel modules manually +(using man:modprobe(8), for example): a root <> loads the necessary modules when starting. If you have extra +probe modules, you can specify to load them to the session daemon on +the command line. + +The LTTng kernel modules are installed in ++/usr/lib/modules/__release__/extra+ by default, where +__release__+ is +the kernel release (see `uname --kernel-release`). + + +[[lttng-sessiond]] +=== Session daemon + +[role="img-100"] +.The session daemon. +image::plumbing-sessiond.png[] + +The _session daemon_, man:lttng-sessiond(8), is a daemon responsible for +managing tracing sessions and for controlling the various components of +LTTng. The session daemon is part of LTTng-tools. + +The session daemon sends control requests to and receives control +responses from: + +* The <>. ++ +Any instance of the user space tracing library first registers to +a session daemon. Then, the session daemon can send requests to +this instance, such as: ++ +-- +** Get the list of tracepoints. +** Share an <> so that the user space tracing library + can enable or disable tracepoints. Amongst the possible conditions + of an event rule is a filter expression which `liblttng-ust` evalutes + when an event occurs. +** Share <> attributes and ring buffer locations. +-- ++ +The session daemon and the user space tracing library use a Unix +domain socket for their communication. + +* The <>. ++ +Any instance of a user space tracing agent first registers to +a session daemon. Then, the session daemon can send requests to +this instance, such as: ++ +-- +** Get the list of loggers. +** Enable or disable a specific logger. +-- ++ +The session daemon and the user space tracing agent use a TCP connection +for their communication. + +* The <>. +* The <>. ++ +The session daemon sends requests to the consumer daemon to instruct +it where to send the trace data streams, amongst other information. + +* The <>. + +The session daemon receives commands from the +<>. + +The root session daemon loads the appropriate +<> on startup. It also spawns +a <> as soon as you create +an <>. + +The session daemon does not send and receive trace data: this is the +role of the <> and +<>. It does, however, generate the +http://diamon.org/ctf/[CTF] metadata stream. + +Each Unix user can have its own session daemon instance. The +tracing sessions managed by different session daemons are completely +independent. + +The root user's session daemon is the only one which is +allowed to control the LTTng kernel tracer, and its spawned consumer +daemon is the only one which is allowed to consume trace data from the +LTTng kernel tracer. Note, however, that any Unix user which is a member +of the <> is allowed +to create <> in the +Linux kernel <>, and thus to trace the Linux +kernel. + +The <> automatically starts a +session daemon when using its `create` command if none is currently +running. You can also start the session daemon manually. + + +[[lttng-consumerd]] +=== Consumer daemon + +[role="img-100"] +.The consumer daemon. +image::plumbing-consumerd.png[] + +The _consumer daemon_, man:lttng-consumerd(8), is a daemon which shares +ring buffers with user applications or with the LTTng kernel modules to +collect trace data and send it to some location (on disk or to a +<> over the network). The consumer daemon +is part of LTTng-tools. + +You do not start a consumer daemon manually: a consumer daemon is always +spawned by a <> as soon as you create an +<>, that is, before you start tracing. When you kill +its owner session daemon, the consumer daemon also exits because it is +the session daemon's child process. Command-line options of +man:lttng-sessiond(8) target the consumer daemon process. + +There are up to two running consumer daemons per Unix user, whereas only +one session daemon can run per user. This is because each process can be +either 32-bit or 64-bit: if the target system runs a mixture of 32-bit +and 64-bit processes, it is more efficient to have separate +corresponding 32-bit and 64-bit consumer daemons. The root user is an +exception: it can have up to _three_ running consumer daemons: 32-bit +and 64-bit instances for its user applications, and one more +reserved for collecting kernel trace data. + + +[[lttng-relayd]] +=== Relay daemon + +[role="img-100"] +.The relay daemon. +image::plumbing-relayd.png[] + +The _relay daemon_, man:lttng-relayd(8), is a daemon acting as a bridge +between remote session and consumer daemons, local trace files, and a +remote live trace viewer. The relay daemon is part of LTTng-tools. + +The main purpose of the relay daemon is to implement a receiver of +<>. +This is useful when the target system does not have much file system +space to record trace files locally. + +The relay daemon is also a server to which a +<> can +connect. The live trace viewer sends requests to the relay daemon to +receive trace data as the target system emits events. The +communication protocol is named _LTTng live_; it is used over TCP +connections. + +Note that you can start the relay daemon on the target system directly. +This is the setup of choice when the use case is to view events as +the target system emits them without the need of a remote system. + + +[[instrumenting]] +== [[using-lttng]]Instrumentation + +There are many examples of tracing and monitoring in our everyday life: + +* You have access to real-time and historical weather reports and + forecasts thanks to weather stations installed around the country. +* You know your heart is safe thanks to an electrocardiogram. +* You make sure not to drive your car too fast and to have enough fuel + to reach your destination thanks to gauges visible on your dashboard. + +All the previous examples have something in common: they rely on +**instruments**. Without the electrodes attached to the surface of your +body's skin, cardiac monitoring is futile. + +LTTng, as a tracer, is no different from those real life examples. If +you're about to trace a software system or, in other words, record its +history of execution, you better have **instrumentation points** in the +subject you're tracing, that is, the actual software. + +Various ways were developed to instrument a piece of software for LTTng +tracing. The most straightforward one is to manually place +instrumentation points, called _tracepoints_, in the software's source +code. It is also possible to add instrumentation points dynamically in +the Linux kernel <>. + +If you're only interested in tracing the Linux kernel, your +instrumentation needs are probably already covered by LTTng's built-in +<>. You may also wish to trace a +user application which is already instrumented for LTTng tracing. +In such cases, you can skip this whole section and read the topics of +the <> section. + +Many methods are available to instrument a piece of software for LTTng +tracing. They are: + +* <>. +* <>. +* <>. +* <>. +* <>. +* <>. + + +[[c-application]] +=== [[cxx-application]]User space instrumentation for C and $$C++$$ applications + +The procedure to instrument a C or $$C++$$ user application with +the <>, `liblttng-ust`, is: + +. <>. +. <>. +. <>. + +If you need quick, man:printf(3)-like instrumentation, you can skip +those steps and use <> or <> +instead. + +IMPORTANT: You need to <> LTTng-UST to +instrument a user application with `liblttng-ust`. + + +[[tracepoint-provider]] +==== Create the source files of a tracepoint provider package + +A _tracepoint provider_ is a set of compiled functions which provide +**tracepoints** to an application, the type of instrumentation point +supported by LTTng-UST. Those functions can emit events with +user-defined fields and serialize those events as event records to one +or more LTTng-UST <> sub-buffers. The `tracepoint()` +macro, which you <>, calls those functions. + +A _tracepoint provider package_ is an object file (`.o`) or a shared +library (`.so`) which contains one or more tracepoint providers. +Its source files are: + +* One or more <> (`.h`). +* A <> (`.c`). + +A tracepoint provider package is dynamically linked with `liblttng-ust`, +the LTTng user space tracer, at run time. + +[role="img-100"] +.User application linked with `liblttng-ust` and containing a tracepoint provider. +image::ust-app.png[] + +NOTE: If you need quick, man:printf(3)-like instrumentation, you can +skip creating and using a tracepoint provider and use +<> or <> instead. + + +[[tpp-header]] +===== Create a tracepoint provider header file template + +A _tracepoint provider header file_ contains the tracepoint +definitions of a tracepoint provider. + +To create a tracepoint provider header file: + +. Start from this template: ++ +-- +[source,c] +.Tracepoint provider header file template (`.h` file extension). +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER provider_name + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./tp.h" + +#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TP_H + +#include + +/* + * Use TRACEPOINT_EVENT(), TRACEPOINT_EVENT_CLASS(), + * TRACEPOINT_EVENT_INSTANCE(), and TRACEPOINT_LOGLEVEL() here. + */ + +#endif /* _TP_H */ + +#include +---- +-- + +. Replace: ++ +* `provider_name` with the name of your tracepoint provider. +* `"tp.h"` with the name of your tracepoint provider header file. + +. Below the `#include ` line, put your + <>. + +Your tracepoint provider name must be unique amongst all the possible +tracepoint provider names used on the same target system. We +suggest to include the name of your project or company in the name, +for example, `org_lttng_my_project_tpp`. + +TIP: [[lttng-gen-tp]]You can use the man:lttng-gen-tp(1) tool to create +this boilerplate for you. When using cmd:lttng-gen-tp, all you need to +write are the <>. + + +[[defining-tracepoints]] +===== Create a tracepoint definition + +A _tracepoint definition_ defines, for a given tracepoint: + +* Its **input arguments**. They are the macro parameters that the + `tracepoint()` macro accepts for this particular tracepoint + in the user application's source code. +* Its **output event fields**. They are the sources of event fields + that form the payload of any event that the execution of the + `tracepoint()` macro emits for this particular tracepoint. + +You can create a tracepoint definition by using the +`TRACEPOINT_EVENT()` macro below the `#include ` +line in the +<>. + +The syntax of the `TRACEPOINT_EVENT()` macro is: + +[source,c] +.`TRACEPOINT_EVENT()` macro syntax. +---- +TRACEPOINT_EVENT( + /* Tracepoint provider name */ + provider_name, + + /* Tracepoint name */ + tracepoint_name, + + /* Input arguments */ + TP_ARGS( + arguments + ), + + /* Output event fields */ + TP_FIELDS( + fields + ) +) +---- + +Replace: + +* `provider_name` with your tracepoint provider name. +* `tracepoint_name` with your tracepoint name. +* `arguments` with the <>. +* `fields` with the <> + definitions. + +This tracepoint emits events named `provider_name:tracepoint_name`. + +[IMPORTANT] +.Event name's length limitation +==== +The concatenation of the tracepoint provider name and the +tracepoint name must not exceed **254 characters**. If it does, the +instrumented application compiles and runs, but LTTng throws multiple +warnings and you could experience serious issues. +==== + +[[tpp-def-input-args]]The syntax of the `TP_ARGS()` macro is: + +[source,c] +.`TP_ARGS()` macro syntax. +---- +TP_ARGS( + type, arg_name +) +---- + +Replace: + +* `type` with the C type of the argument. +* `arg_name` with the argument name. + +You can repeat `type` and `arg_name` up to 10 times to have +more than one argument. + +.`TP_ARGS()` usage with three arguments. +==== +[source,c] +---- +TP_ARGS( + int, count, + float, ratio, + const char*, query +) +---- +==== + +The `TP_ARGS()` and `TP_ARGS(void)` forms are valid to create a +tracepoint definition with no input arguments. + +[[tpp-def-output-fields]]The `TP_FIELDS()` macro contains a list of +`ctf_*()` macros. Each `ctf_*()` macro defines one event field. +See <> for a +complete description of the available `ctf_*()` macros. +A `ctf_*()` macro specifies the type, size, and byte order of +one event field. + +Each `ctf_*()` macro takes an _argument expression_ parameter. This is a +C expression that the tracer evalutes at the `tracepoint()` macro site +in the application's source code. This expression provides a field's +source of data. The argument expression can include input argument names +listed in the `TP_ARGS()` macro. + +Each `ctf_*()` macro also takes a _field name_ parameter. Field names +must be unique within a given tracepoint definition. + +Here's a complete tracepoint definition example: + +.Tracepoint definition. +==== +The following tracepoint definition defines a tracepoint which takes +three input arguments and has four output event fields. + +[source,c] +---- +#include "my-custom-structure.h" + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + const struct my_custom_structure*, my_custom_structure, + float, ratio, + const char*, query + ), + TP_FIELDS( + ctf_string(query_field, query) + ctf_float(double, ratio_field, ratio) + ctf_integer(int, recv_size, my_custom_structure->recv_size) + ctf_integer(int, send_size, my_custom_structure->send_size) + ) +) +---- + +You can refer to this tracepoint definition with the `tracepoint()` +macro in your application's source code like this: + +[source,c] +---- +tracepoint(my_provider, my_tracepoint, + my_structure, some_ratio, the_query); +---- +==== + +NOTE: The LTTng tracer only evaluates tracepoint arguments at run time +if they satisfy an enabled <>. + + +[[using-tracepoint-classes]] +===== Use a tracepoint class + +A _tracepoint class_ is a class of tracepoints which share the same +output event field definitions. A _tracepoint instance_ is one +instance of such a defined tracepoint class, with its own tracepoint +name. + +The <> is actually a +shorthand which defines both a tracepoint class and a tracepoint +instance at the same time. + +When you build a tracepoint provider package, the C or $$C++$$ compiler +creates one serialization function for each **tracepoint class**. A +serialization function is responsible for serializing the event fields +of a tracepoint to a sub-buffer when tracing. + +For various performance reasons, when your situation requires multiple +tracepoint definitions with different names, but with the same event +fields, we recommend that you manually create a tracepoint class +and instantiate as many tracepoint instances as needed. One positive +effect of such a design, amongst other advantages, is that all +tracepoint instances of the same tracepoint class reuse the same +serialization function, thus reducing +https://en.wikipedia.org/wiki/Cache_pollution[cache pollution]. + +.Use a tracepoint class and tracepoint instances. +==== +Consider the following three tracepoint definitions: + +[source,c] +---- +TRACEPOINT_EVENT( + my_app, + get_account, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +TRACEPOINT_EVENT( + my_app, + get_settings, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +TRACEPOINT_EVENT( + my_app, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) +---- + +In this case, we create three tracepoint classes, with one implicit +tracepoint instance for each of them: `get_account`, `get_settings`, and +`get_transaction`. However, they all share the same event field names +and types. Hence three identical, yet independent serialization +functions are created when you build the tracepoint provider package. + +A better design choice is to define a single tracepoint class and three +tracepoint instances: + +[source,c] +---- +/* The tracepoint class */ +TRACEPOINT_EVENT_CLASS( + /* Tracepoint provider name */ + my_app, + + /* Tracepoint class name */ + my_class, + + /* Input arguments */ + TP_ARGS( + int, userid, + size_t, len + ), + + /* Output event fields */ + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +/* The tracepoint instances */ +TRACEPOINT_EVENT_INSTANCE( + /* Tracepoint provider name */ + my_app, + + /* Tracepoint class name */ + my_class, + + /* Tracepoint name */ + get_account, + + /* Input arguments */ + TP_ARGS( + int, userid, + size_t, len + ) +) +TRACEPOINT_EVENT_INSTANCE( + my_app, + my_class, + get_settings, + TP_ARGS( + int, userid, + size_t, len + ) +) +TRACEPOINT_EVENT_INSTANCE( + my_app, + my_class, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ) +) +---- +==== + + +[[assigning-log-levels]] +===== Assign a log level to a tracepoint definition + +You can assign an optional _log level_ to a +<>. + +Assigning different levels of severity to tracepoint definitions can +be useful: when you <>, +you can target tracepoints having a log level as severe as a specific +value. + +The concept of LTTng-UST log levels is similar to the levels found +in typical logging frameworks: + +* In a logging framework, the log level is given by the function + or method name you use at the log statement site: `debug()`, + `info()`, `warn()`, `error()`, and so on. +* In LTTng-UST, you statically assign the log level to a tracepoint + definition; any `tracepoint()` macro invocation which refers to + this definition has this log level. + +You can assign a log level to a tracepoint definition with the +`TRACEPOINT_LOGLEVEL()` macro. You must use this macro _after_ the +<> or +<> macro for a given +tracepoint. + +The syntax of the `TRACEPOINT_LOGLEVEL()` macro is: + +[source,c] +.`TRACEPOINT_LOGLEVEL()` macro syntax. +---- +TRACEPOINT_LOGLEVEL(provider_name, tracepoint_name, log_level) +---- + +Replace: + +* `provider_name` with the tracepoint provider name. +* `tracepoint_name` with the tracepoint name. +* `log_level` with the log level to assign to the tracepoint + definition named `tracepoint_name` in the `provider_name` + tracepoint provider. ++ +See <> for +a list of available log level names. + +.Assign the `TRACE_DEBUG_UNIT` log level to a tracepoint definition. +==== +[source,c] +---- +/* Tracepoint definition */ +TRACEPOINT_EVENT( + my_app, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +/* Log level assignment */ +TRACEPOINT_LOGLEVEL(my_app, get_transaction, TRACE_DEBUG_UNIT) +---- +==== + + +[[tpp-source]] +===== Create a tracepoint provider package source file + +A _tracepoint provider package source file_ is a C source file which +includes a <> to expand its +macros into event serialization and other functions. + +You can always use the following tracepoint provider package source +file template: + +[source,c] +.Tracepoint provider package source file template. +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +Replace `tp.h` with the name of your <> name. You may also include more than one tracepoint +provider header file here to create a tracepoint provider package +holding more than one tracepoint providers. + + +[[probing-the-application-source-code]] +==== Add tracepoints to an application's source code + +Once you <>, you +can use the `tracepoint()` macro in your application's +source code to insert the tracepoints that this header +<> defines. + +The `tracepoint()` macro takes at least two parameters: the tracepoint +provider name and the tracepoint name. The corresponding tracepoint +definition defines the other parameters. + +.`tracepoint()` usage. +==== +The following <> defines a +tracepoint which takes two input arguments and has two output event +fields. + +[source,c] +.Tracepoint provider header file. +---- +#include "my-custom-structure.h" + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + int, argc, + const char*, cmd_name + ), + TP_FIELDS( + ctf_string(cmd_name, cmd_name) + ctf_integer(int, number_of_args, argc) + ) +) +---- + +You can refer to this tracepoint definition with the `tracepoint()` +macro in your application's source code like this: + +[source,c] +.Application's source file. +---- +#include "tp.h" + +int main(int argc, char* argv[]) +{ + tracepoint(my_provider, my_tracepoint, argc, argv[0]); + + return 0; +} +---- + +Note how the application's source code includes +the tracepoint provider header file containing the tracepoint +definitions to use, path:{tp.h}. +==== + +.`tracepoint()` usage with a complex tracepoint definition. +==== +Consider this complex tracepoint definition, where multiple event +fields refer to the same input arguments in their argument expression +parameter: + +[source,c] +.Tracepoint provider header file. +---- +/* For `struct stat` */ +#include +#include +#include + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + int, my_int_arg, + char*, my_str_arg, + struct stat*, st + ), + TP_FIELDS( + ctf_integer(int, my_constant_field, 23 + 17) + ctf_integer(int, my_int_arg_field, my_int_arg) + ctf_integer(int, my_int_arg_field2, my_int_arg * my_int_arg) + ctf_integer(int, sum4_field, my_str_arg[0] + my_str_arg[1] + + my_str_arg[2] + my_str_arg[3]) + ctf_string(my_str_arg_field, my_str_arg) + ctf_integer_hex(off_t, size_field, st->st_size) + ctf_float(double, size_dbl_field, (double) st->st_size) + ctf_sequence_text(char, half_my_str_arg_field, my_str_arg, + size_t, strlen(my_str_arg) / 2) + ) +) +---- + +You can refer to this tracepoint definition with the `tracepoint()` +macro in your application's source code like this: + +[source,c] +.Application's source file. +---- +#define TRACEPOINT_DEFINE +#include "tp.h" + +int main(void) +{ + struct stat s; + + stat("/etc/fstab", &s); + tracepoint(my_provider, my_tracepoint, 23, "Hello, World!", &s); + + return 0; +} +---- + +If you look at the event record that LTTng writes when tracing this +program, assuming the file size of path:{/etc/fstab} is 301{nbsp}bytes, +it should look like this: + +.Event record fields +|==== +|Field's name |Field's value +|`my_constant_field` |40 +|`my_int_arg_field` |23 +|`my_int_arg_field2` |529 +|`sum4_field` |389 +|`my_str_arg_field` |`Hello, World!` +|`size_field` |0x12d +|`size_dbl_field` |301.0 +|`half_my_str_arg_field` |`Hello,` +|==== +==== + +Sometimes, the arguments you pass to `tracepoint()` are expensive to +compute--they use the call stack, for example. To avoid this +computation when the tracepoint is disabled, you can use the +`tracepoint_enabled()` and `do_tracepoint()` macros. + +The syntax of the `tracepoint_enabled()` and `do_tracepoint()` macros +is: + +[source,c] +.`tracepoint_enabled()` and `do_tracepoint()` macros syntax. +---- +tracepoint_enabled(provider_name, tracepoint_name) +do_tracepoint(provider_name, tracepoint_name, ...) +---- + +Replace: + +* `provider_name` with the tracepoint provider name. +* `tracepoint_name` with the tracepoint name. + +`tracepoint_enabled()` returns a non-zero value if the tracepoint named +`tracepoint_name` from the provider named `provider_name` is enabled +**at run time**. + +`do_tracepoint()` is like `tracepoint()`, except that it doesn't check +if the tracepoint is enabled. Using `tracepoint()` with +`tracepoint_enabled()` is dangerous since `tracepoint()` also contains +the `tracepoint_enabled()` check, thus a race condition is +possible in this situation: + +[source,c] +.Possible race condition when using `tracepoint_enabled()` with `tracepoint()`. +---- +if (tracepoint_enabled(my_provider, my_tracepoint)) { + stuff = prepare_stuff(); +} + +tracepoint(my_provider, my_tracepoint, stuff); +---- + +If the tracepoint is enabled after the condition, then `stuff` is not +prepared: the emitted event will either contain wrong data, or the whole +application could crash (segmentation fault, for example). + +NOTE: Neither `tracepoint_enabled()` nor `do_tracepoint()` have an +`STAP_PROBEV()` call. If you need it, you must emit +this call yourself. + + +[[building-tracepoint-providers-and-user-application]] +==== Build and link a tracepoint provider package and an application + +Once you have one or more <> and a <>, +you can create the tracepoint provider package by compiling its source +file. From here, multiple build and run scenarios are possible. The +following table shows common application and library configurations +along with the required command lines to achieve them. + +In the following diagrams, we use the following file names: + +`app`:: + Executable application. + +`app.o`:: + Application's object file. + +`tpp.o`:: + Tracepoint provider package object file. + +`tpp.a`:: + Tracepoint provider package archive file. + +`libtpp.so`:: + Tracepoint provider package shared object file. + +`emon.o`:: + User library object file. + +`libemon.so`:: + User library shared object file. + +The red star indicates that this object file is instrumented +(contains code which uses the `tracepoint()` macro). The spring +symbol between the application and a library means the application is +linked with the library at build time. + +We assume that path:{.} is part of the env:LD_LIBRARY_PATH environment +variable in the following instructions. + +[role="growable ust-scenarios",cols="asciidoc,asciidoc"] +.Common tracepoint provider package scenarios. +|==== +|Scenario |Instructions + +| +The instrumented application is statically linked with +the tracepoint provider package object. + +image::ust-sit+app-linked-with-tp-o+app-instrumented.png[] + +| +include::../common/ust-sit-step-tp-o.txt[] + +To build the instrumented application: + +. In path:{app.c}, before including path:{tpp.h}, add the following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o tpp.o -llttng-ust -ldl +---- +-- + +To run the instrumented application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The instrumented application is statically linked with the +tracepoint provider package archive file. + +image::ust-sit+app-linked-with-tp-a+app-instrumented.png[] + +| +To create the tracepoint provider package archive file: + +. Compile the <>: ++ +-- +[role="term"] +---- +gcc -I. -c tpp.c +---- +-- + +. Create the tracepoint provider package archive file: ++ +-- +[role="term"] +---- +ar rcs tpp.a tpp.o +---- +-- + +To build the instrumented application: + +. In path:{app.c}, before including path:{tpp.h}, add the following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o tpp.a -llttng-ust -ldl +---- +-- + +To run the instrumented application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The instrumented application is linked with the tracepoint provider +package shared object. + +image::ust-sit+app-linked-with-tp-so+app-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented application: + +. In path:{app.c}, before including path:{tpp.h}, add the following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -ldl -L. -ltpp +---- +-- + +To run the instrumented application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The tracepoint provider package shared object is preloaded before the +instrumented application starts. + +image::ust-sit+tp-so-preloaded+app-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented application: + +. In path:{app.c}, before including path:{tpp.h}, add the + following lines: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE +---- +-- + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -ldl +---- +-- + +To run the instrumented application with tracing support: + +* Preload the tracepoint provider package shared object and + start the application: ++ +-- +[role="term"] +---- +LD_PRELOAD=./libtpp.so ./app +---- +-- + +To run the instrumented application without tracing support: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The instrumented application dynamically loads the tracepoint provider +package shared object. + +See the <>. + +image::ust-sit+app-dlopens-tp-so+app-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented application: + +. In path:{app.c}, before including path:{tpp.h}, add the + following lines: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE +---- +-- + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -ldl +---- +-- + +To run the instrumented application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application is linked with the instrumented user library. + +The instrumented user library is statically linked with the tracepoint +provider package object file. + +image::ust-sit+app-linked-with-lib+lib-linked-with-tp-o+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-o-fpic.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o tpp.o -llttng-ust -ldl +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -L. -lemon +---- +-- + +To run the application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application is linked with the instrumented user library. + +The instrumented user library is linked with the tracepoint provider +package shared object. + +image::ust-sit+app-linked-with-lib+lib-linked-with-tp-so+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o -ldl -L. -ltpp +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -L. -lemon +---- +-- + +To run the application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The tracepoint provider package shared object is preloaded before the +application starts. + +The application is linked with the instrumented user library. + +image::ust-sit+tp-so-preloaded+app-linked-with-lib+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o -ldl +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -L. -lemon +---- +-- + +To run the application with tracing support: + +* Preload the tracepoint provider package shared object and + start the application: ++ +-- +[role="term"] +---- +LD_PRELOAD=./libtpp.so ./app +---- +-- + +To run the application without tracing support: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application is linked with the instrumented user library. + +The instrumented user library dynamically loads the tracepoint provider +package shared object. + +See the <>. + +image::ust-sit+app-linked-with-lib+lib-dlopens-tp-so+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o -ldl +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -L. -lemon +---- +-- + +To run the application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application dynamically loads the instrumented user library. + +The instrumented user library is linked with the tracepoint provider +package shared object. + +See the <>. + +image::ust-sit+app-dlopens-lib+lib-linked-with-tp-so+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o -ldl -L. -ltpp +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -ldl -L. -lemon +---- +-- + +To run the application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application dynamically loads the instrumented user library. + +The instrumented user library dynamically loads the tracepoint provider +package shared object. + +See the <>. + +image::ust-sit+app-dlopens-lib+lib-dlopens-tp-so+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o -ldl +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -ldl -L. -lemon +---- +-- + +To run the application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The tracepoint provider package shared object is preloaded before the +application starts. + +The application dynamically loads the instrumented user library. + +image::ust-sit+tp-so-preloaded+app-dlopens-lib+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-so.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o -ldl +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o -L. -lemon +---- +-- + +To run the application with tracing support: + +* Preload the tracepoint provider package shared object and + start the application: ++ +-- +[role="term"] +---- +LD_PRELOAD=./libtpp.so ./app +---- +-- + +To run the application without tracing support: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application is statically linked with the tracepoint provider +package object file. + +The application is linked with the instrumented user library. + +image::ust-sit+app-linked-with-tp-o+app-linked-with-lib+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-o.txt[] + +To build the instrumented user library: + +. In path:{emon.c}, before including path:{tpp.h}, add the + following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o +---- +-- + +To build the application: + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -o app app.o tpp.o -llttng-ust -ldl -L. -lemon +---- +-- + +To run the instrumented application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- + +| +The application is statically linked with the tracepoint provider +package object file. + +The application dynamically loads the instrumented user library. + +image::ust-sit+app-linked-with-tp-o+app-dlopens-lib+lib-instrumented.png[] + +| +include::../common/ust-sit-step-tp-o.txt[] + +To build the application: + +. In path:{app.c}, before including path:{tpp.h}, add the following line: ++ +-- +[source,c] +---- +#define TRACEPOINT_DEFINE +---- +-- + +. Compile the application source file: ++ +-- +[role="term"] +---- +gcc -c app.c +---- +-- + +. Build the application: ++ +-- +[role="term"] +---- +gcc -Wl,--export-dynamic -o app app.o tpp.o \ + -llttng-ust -ldl +---- +-- ++ +The `--export-dynamic` option passed to the linker is necessary for the +dynamically loaded library to ``see'' the tracepoint symbols defined in +the application. + +To build the instrumented user library: + +. Compile the user library source file: ++ +-- +[role="term"] +---- +gcc -I. -fpic -c emon.c +---- +-- + +. Build the user library shared object: ++ +-- +[role="term"] +---- +gcc -shared -o libemon.so emon.o +---- +-- + +To run the application: + +* Start the application: ++ +-- +[role="term"] +---- +./app +---- +-- +|==== + +[[dlclose-warning]] +[IMPORTANT] +.Do not use man:dlclose(3) on a tracepoint provider package +==== +Never use man:dlclose(3) on any shared object which: + +* Is linked with, statically or dynamically, a tracepoint provider + package. +* Calls man:dlopen(3) itself to dynamically open a tracepoint provider + package shared object. + +This is currently considered **unsafe** due to a lack of reference +counting from LTTng-UST to the shared object. + +A known workaround (available since glibc 2.2) is to use the +`RTLD_NODELETE` flag when calling man:dlopen(3) initially. This has the +effect of not unloading the loaded shared object, even if man:dlclose(3) +is called. + +You can also preload the tracepoint provider package shared object with +the env:LD_PRELOAD environment variable to overcome this limitation. +==== + + +[[using-lttng-ust-with-daemons]] +===== Use noch:{LTTng-UST} with daemons + +If your instrumented application calls man:fork(2), man:clone(2), +or BSD's man:rfork(2), without a following man:exec(3)-family +system call, you must preload the path:{liblttng-ust-fork.so} shared +object when starting the application. + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-fork.so ./my-app +---- + +If your tracepoint provider package is +a shared library which you also preload, you must put both +shared objects in env:LD_PRELOAD: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-fork.so:/path/to/tp.so ./my-app +---- + + +[[lttng-ust-pkg-config]] +===== Use noch:{pkg-config} + +On some distributions, LTTng-UST ships with a +https://www.freedesktop.org/wiki/Software/pkg-config/[pkg-config] +metadata file. If this is your case, then you can use cmd:pkg-config to +build an application on the command line: + +[role="term"] +---- +gcc -o my-app my-app.o tp.o $(pkg-config --cflags --libs lttng-ust) +---- + + +[[instrumenting-32-bit-app-on-64-bit-system]] +===== [[advanced-instrumenting-techniques]]Build a 32-bit instrumented application for a 64-bit target system + +In order to trace a 32-bit application running on a 64-bit system, +LTTng must use a dedicated 32-bit +<>. + +The following steps show how to build and install a 32-bit consumer +daemon, which is _not_ part of the default 64-bit LTTng build, how to +build and install the 32-bit LTTng-UST libraries, and how to build and +link an instrumented 32-bit application in that context. + +To build a 32-bit instrumented application for a 64-bit target system, +assuming you have a fresh target system with no installed Userspace RCU +or LTTng packages: + +. Download, build, and install a 32-bit version of Userspace RCU: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/urcu/userspace-rcu-latest-0.9.tar.bz2 && +tar -xf userspace-rcu-latest-0.9.tar.bz2 && +cd userspace-rcu-0.9.* && +./configure --libdir=/usr/local/lib32 CFLAGS=-m32 && +make && +sudo make install && +sudo ldconfig +---- +-- + +. Using your distribution's package manager, or from source, install + the following 32-bit versions of the following dependencies of + LTTng-tools and LTTng-UST: ++ +-- +* https://sourceforge.net/projects/libuuid/[libuuid] +* http://directory.fsf.org/wiki/Popt[popt] +* http://www.xmlsoft.org/[libxml2] +-- + +. Download, build, and install a 32-bit version of the latest + LTTng-UST{nbsp}{revision}: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-ust/lttng-ust-latest-2.7.tar.bz2 && +tar -xf lttng-ust-latest-2.7.tar.bz2 && +cd lttng-ust-2.7.* && +./configure --libdir=/usr/local/lib32 \ + CFLAGS=-m32 CXXFLAGS=-m32 \ + LDFLAGS='-L/usr/local/lib32 -L/usr/lib32' && +make && +sudo make install && +sudo ldconfig +---- +-- ++ +[NOTE] +==== +Depending on your distribution, +32-bit libraries could be installed at a different location than +`/usr/lib32`. For example, Debian is known to install +some 32-bit libraries in `/usr/lib/i386-linux-gnu`. + +In this case, make sure to set `LDFLAGS` to all the +relevant 32-bit library paths, for example: + +[role="term"] +---- +LDFLAGS='-L/usr/lib/i386-linux-gnu -L/usr/lib32' +---- +==== + +. Download the latest LTTng-tools{nbsp}{revision}, build, and install + the 32-bit consumer daemon: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-tools/lttng-tools-latest-2.7.tar.bz2 && +tar -xf lttng-tools-latest-2.7.tar.bz2 && +cd lttng-tools-2.7.* && +./configure --libdir=/usr/local/lib32 CFLAGS=-m32 CXXFLAGS=-m32 \ + LDFLAGS='-L/usr/local/lib32 -L/usr/lib32' && +make && +cd src/bin/lttng-consumerd && +sudo make install && +sudo ldconfig +---- +-- + +. From your distribution or from source, + <> the 64-bit versions of + LTTng-UST and Userspace RCU. +. Download, build, and install the 64-bit version of the + latest LTTng-tools{nbsp}{revision}: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-tools/lttng-tools-latest-2.7.tar.bz2 && +tar -xf lttng-tools-latest-2.7.tar.bz2 && +cd lttng-tools-2.7.* && +./configure --with-consumerd32-libdir=/usr/local/lib32 \ + --with-consumerd32-bin=/usr/local/lib32/lttng/libexec/lttng-consumerd && +make && +sudo make install && +sudo ldconfig +---- +-- + +. Pass the following options to man:gcc(1), man:g++(1), or man:clang(1) + when linking your 32-bit application: ++ +---- +-m32 -L/usr/lib32 -L/usr/local/lib32 \ +-Wl,-rpath,/usr/lib32,-rpath,/usr/local/lib32 +---- ++ +For example, let's rebuild the quick start example in +<> as an +instrumented 32-bit application: ++ +-- +[role="term"] +---- +gcc -m32 -c -I. hello-tp.c +gcc -m32 -c hello.c +gcc -m32 -o hello hello.o hello-tp.o \ + -L/usr/lib32 -L/usr/local/lib32 \ + -Wl,-rpath,/usr/lib32,-rpath,/usr/local/lib32 \ + -llttng-ust -ldl +---- +-- + +No special action is required to execute the 32-bit application and +to trace it: use the command-line man:lttng(1) tool as usual. + + +[role="since-2.5"] +[[tracef]] +==== Use `tracef()` + +`tracef()` is a small LTTng-UST API designed for quick, +man:printf(3)-like instrumentation without the burden of +<> and +<> +a tracepoint provider package. + +To use `tracef()` in your application: + +. In the C or C++ source files where you need to use `tracef()`, + include ``: ++ +-- +[source,c] +---- +#include +---- +-- + +. In the application's source code, use `tracef()` like you would use + man:printf(3): ++ +-- +[source,c] +---- + /* ... */ + + tracef("my message: %d (%s)", my_integer, my_string); + + /* ... */ +---- +-- + +. Link your application with `liblttng-ust`: ++ +-- +[role="term"] +---- +gcc -o app app.c -llttng-ust +---- +-- + +To trace the events that `tracef()` calls emit: + +* <> which matches the + `lttng_ust_tracef:*` event name: ++ +-- +[role="term"] +---- +lttng enable-event --userspace 'lttng_ust_tracef:*' +---- +-- + +[IMPORTANT] +.Limitations of `tracef()` +==== +The `tracef()` utility function was developed to make user space tracing +super simple, albeit with notable disadvantages compared to +<>: + +* All the emitted events have the same tracepoint provider and + tracepoint names, respectively `lttng_ust_tracef` and `event`. +* There is no static type checking. +* The only event record field you actually get, named `msg`, is a string + potentially containing the values you passed to `tracef()` + using your own format string. This also means that you cannot filter + events with a custom expression at run time because there are no + isolated fields. +* Since `tracef()` uses the C standard library's man:vasprintf(3) + function behind the scenes to format the strings at run time, its + expected performance is lower than with user-defined tracepoints, + which do not require a conversion to a string. + +Taking this into consideration, `tracef()` is useful for some quick +prototyping and debugging, but you should not consider it for any +permanent and serious applicative instrumentation. +==== + + +[role="since-2.7"] +[[tracelog]] +==== Use `tracelog()` + +The `tracelog()` API is very similar to <>, with +the difference that it accepts an additional log level parameter. + +The goal of `tracelog()` is to ease the migration from logging to +tracing. + +To use `tracelog()` in your application: + +. In the C or C++ source files where you need to use `tracelog()`, + include ``: ++ +-- +[source,c] +---- +#include +---- +-- + +. In the application's source code, use `tracelog()` like you would use + man:printf(3), except for the first parameter which is the log + level: ++ +-- +[source,c] +---- + /* ... */ + + tracelog(TRACE_WARNING, "my message: %d (%s)", + my_integer, my_string); + + /* ... */ +---- +-- ++ +See <> for +a list of available log level names. + +. Link your application with `liblttng-ust`: ++ +-- +[role="term"] +---- +gcc -o app app.c -llttng-ust +---- +-- + +To trace the events that `tracelog()` calls emit with a log level +_as severe as_ a specific log level: + +* <> which matches the + `lttng_ust_tracelog:*` event name and a minimum level + of severity: ++ +-- +[role="term"] +---- +lttng enable-event --userspace 'lttng_ust_tracelog:*' + --loglevel=TRACE_WARNING +---- +-- + +To trace the events that `tracelog()` calls emit with a +_specific log level_: + +* Create an event rule which matches the `lttng_ust_tracelog:*` + event name and a specific log level: ++ +-- +[role="term"] +---- +lttng enable-event --userspace 'lttng_ust_tracelog:*' + --loglevel-only=TRACE_INFO +---- +-- + + +[[prebuilt-ust-helpers]] +=== Prebuilt user space tracing helpers + +The LTTng-UST package provides a few helpers in the form or preloadable +shared objects which automatically instrument system functions and +calls. + +The helper shared objects are normally found in dir:{/usr/lib}. If you +built LTTng-UST <>, they are probably +located in dir:{/usr/local/lib}. + +The installed user space tracing helpers in LTTng-UST{nbsp}{revision} +are: + +path:{liblttng-ust-libc-wrapper.so}:: +path:{liblttng-ust-pthread-wrapper.so}:: + <>. + +path:{liblttng-ust-cyg-profile.so}:: +path:{liblttng-ust-cyg-profile-fast.so}:: + <>. + +path:{liblttng-ust-dl.so}:: + <>. + +To use a user space tracing helper with any user application: + +* Preload the helper shared object when you start the application: ++ +-- +[role="term"] +---- +LD_PRELOAD=liblttng-ust-libc-wrapper.so my-app +---- +-- ++ +You can preload more than one helper: ++ +-- +[role="term"] +---- +LD_PRELOAD=liblttng-ust-libc-wrapper.so:liblttng-ust-dl.so my-app +---- +-- + + +[role="since-2.3"] +[[liblttng-ust-libc-pthread-wrapper]] +==== Instrument C standard library memory and POSIX threads functions + +The path:{liblttng-ust-libc-wrapper.so} and +path:{liblttng-ust-pthread-wrapper.so} helpers +add instrumentation to some C standard library and POSIX +threads functions. + +[role="growable"] +.Functions instrumented by preloading path:{liblttng-ust-libc-wrapper.so}. +|==== +|TP provider name |TP name |Instrumented function + +.6+|`lttng_ust_libc` |`malloc` |man:malloc(3) + |`calloc` |man:calloc(3) + |`realloc` |man:realloc(3) + |`free` |man:free(3) + |`memalign` |man:memalign(3) + |`posix_memalign` |man:posix_memalign(3) +|==== + +[role="growable"] +.Functions instrumented by preloading path:{liblttng-ust-pthread-wrapper.so}. +|==== +|TP provider name |TP name |Instrumented function + +.4+|`lttng_ust_pthread` |`pthread_mutex_lock_req` |man:pthread_mutex_lock(3p) (request time) + |`pthread_mutex_lock_acq` |man:pthread_mutex_lock(3p) (acquire time) + |`pthread_mutex_trylock` |man:pthread_mutex_trylock(3p) + |`pthread_mutex_unlock` |man:pthread_mutex_unlock(3p) +|==== + +When you preload the shared object, it replaces the functions listed +in the previous tables by wrappers which contain tracepoints and call +the replaced functions. + + +[[liblttng-ust-cyg-profile]] +==== Instrument function entry and exit + +The path:{liblttng-ust-cyg-profile*.so} helpers can add instrumentation +to the entry and exit points of functions. + +man:gcc(1) and man:clang(1) have an option named +https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html[`-finstrument-functions`] +which generates instrumentation calls for entry and exit to functions. +The LTTng-UST function tracing helpers, +path:{liblttng-ust-cyg-profile.so} and +path:{liblttng-ust-cyg-profile-fast.so}, take advantage of this feature +to add tracepoints to the two generated functions (which contain +`cyg_profile` in their names, hence the helper's name). + +To use the LTTng-UST function tracing helper, the source files to +instrument must be built using the `-finstrument-functions` compiler +flag. + +There are two versions of the LTTng-UST function tracing helper: + +* **path:{liblttng-ust-cyg-profile-fast.so}** is a lightweight variant + that you should only use when it can be _guaranteed_ that the + complete event stream is recorded without any lost event record. + Any kind of duplicate information is left out. ++ +This version contains the following tracepoints: ++ +-- +[role="growable"] +.Points instrumented by preloading path:{liblttng-ust-cyg-profile-fast.so}. +|==== +|TP provider name |TP name |Instrumented points + +.2+|`lttng_ust_cyg_profile_fast` + +|`func_entry` +a|Function entry. + +`addr`:: + Address of called function. + +|`func_exit` +|Function exit. +|==== +-- ++ +Assuming no event record is lost, having only the function addresses on +entry is enough to create a call graph, since an event record always +contains the ID of the CPU that generated it. ++ +You can use a tool like +https://sourceware.org/binutils/docs/binutils/addr2line.html[cmd:addr2line] +to convert function addresses back to source file names and +line numbers. + +* **path:{liblttng-ust-cyg-profile.so}** is a more robust variant +which also works in use cases where event records might get discarded or +not recorded from application startup. +In these cases, the trace analyzer needs more information to be +able to reconstruct the program flow. ++ +This version contains the following tracepoints: ++ +-- +[role="growable"] +.Points instrumented by preloading path:{liblttng-ust-cyg-profile.so}. +|==== +|TP provider name |TP name |Instrumented point + +.2+|`lttng_ust_cyg_profile` + +|`func_entry` +a|Function entry. + +`addr`:: + Address of called function. + +`call_site`:: + Call site address. + +|`func_exit` +a|Function exit. + +`addr`:: + Address of called function. + +`call_site`:: + Call site address. +|==== +-- + +TIP: It's sometimes a good idea to limit the number of source files that +you compile with the `-finstrument-functions` option to prevent LTTng +from writing an excessive amount of trace data at run time. When using +man:gcc(1), you can use the +`-finstrument-functions-exclude-function-list` option to avoid +instrument entries and exits of specific function names. + +All the tracepoints that this helper contains have the +<> `TRACE_DEBUG_FUNCTION`. + + +[role="since-2.4"] +[[liblttng-ust-dl]] +==== Instrument the dynamic linker + +The path:{liblttng-ust-dl.so} helper adds instrumentation to the +man:dlopen(3) and man:dlclose(3) function calls. + +[role="growable"] +.Functions instrumented by preloading path:{liblttng-ust-dl.so}. +|==== +|TP provider name |TP name |Instrumented function + +.2+|`lttng_ust_dl` + +|`dlopen` +a|man:dlopen(3) + +`baddr`:: + Memory base address (where the dynamic linker placed the shared + object). + +`sopath`:: + File system path to the loaded shared object. + +`size`:: + File size of the the loaded shared object. + +`mtime`:: + Last modification time (seconds since Epoch time) of the loaded shared + object. + +|`dlclose` +a|man:dlclose(3) + +`baddr`:: + Memory base address (where the dynamic linker placed the shared + object). +|==== + + +[role="since-2.4"] +[[java-application]] +=== User space Java agent + +You can instrument a Java application which uses one of the following +logging frameworks: + +* The https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[**`java.util.logging`**] + (JUL) core logging facilities. +* http://logging.apache.org/log4j/1.2/[**Apache log4j 1.2**], since + LTTng 2.6. Note that Apache Log4j{nbsp}2 is not supported. + +Each log statement emits an LTTng event once the +application initializes the <> +package. + +[role="img-100"] +.LTTng-UST Java agent imported by a Java application. +image::java-app.png[] + +NOTE: We use http://openjdk.java.net/[OpenJDK] 7 for development and +https://ci.lttng.org/[continuous integration], thus this version is +directly supported. However, the LTTng-UST Java agent is also +tested with OpenJDK 6. + +To use the LTTng-UST Java agent: + +. In the Java application's source code, import the LTTng-UST Java + agent: ++ +-- +[source,java] +---- +import org.lttng.ust.agent.LTTngAgent; +---- +-- + +. As soon as possible after the entry point of the application, + initialize the LTTng-UST Java agent: ++ +-- +[source,java] +---- +LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); +---- +-- ++ +Any log statement that the application executes before this +initialization does not emit an LTTng event. + +. Use `java.util.logging` and/or log4j log statements and configuration + as usual. Since the LTTng-UST Java agent adds a handler to the _root_ + loggers, you can trace any log statement from any logger. + +. Before exiting the application, dispose the LTTng-UST Java agent: ++ +-- +[source,java] +---- +lttngAgent.dispose(); +---- +-- ++ +This is not strictly necessary, but it is recommended for a clean +disposal of the agent's resources. ++ +Any log statement that the application executes after this disposal does +not emit an LTTng event. + +. Include the LTTng-UST Java agent's JAR file, path:{liblttng-ust-agent.jar}, + in the + https://docs.oracle.com/javase/tutorial/essential/environment/paths.html[class path] + when building the Java application. ++ +path:{liblttng-ust-agent.jar} is typically located in +dir:{/usr/share/java}. ++ +IMPORTANT: The LTTng-UST Java agent must be +<> for the logging framework your +application uses. + +.[[jul]]Use the LTTng-UST Java agent with `java.util.logging`. +==== +[source,java] +.path:{Test.java} +---- +import java.util.logging.Logger; +import org.lttng.ust.agent.LTTngAgent; + +public class Test +{ + private static final int answer = 42; + + public static void main(String[] argv) throws Exception + { + // Create a logger + Logger logger = Logger.getLogger("jello"); + + // Call this as soon as possible (before logging) + LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); + + // Log at will! + logger.info("some info"); + logger.warning("some warning"); + Thread.sleep(500); + logger.finer("finer information; the answer is " + answer); + Thread.sleep(123); + logger.severe("error!"); + + // Not mandatory, but cleaner + lttngAgent.dispose(); + } +} +---- + +You can build this example like this: + +[role="term"] +---- +javac -cp /usr/share/java/liblttng-ust-agent.jar Test.java +---- + +You can run the compiled class like this: + +[role="term"] +---- +java -cp /usr/share/java/liblttng-ust-agent.jar:. Test +---- +==== + +.[[log4j]]Use the LTTng-UST Java agent with Apache log4j 1.2. +==== +[source,java] +.path:{Test.java} +---- +import org.apache.log4j.Logger; +import org.apache.log4j.BasicConfigurator; +import org.lttng.ust.agent.LTTngAgent; + +public class Test +{ + private static final int answer = 42; + + public static void main(String[] argv) throws Exception + { + // Create and configure a logger + Logger logger = Logger.getLogger(Test.class); + BasicConfigurator.configure(); + + // Call this as soon as possible (before logging) + LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); + + // Log at will! + logger.info("some info"); + logger.warn("some warning"); + Thread.sleep(500); + logger.debug("debug information; the answer is " + answer); + Thread.sleep(123); + logger.error("error!"); + logger.fatal("fatal error!"); + + // Not mandatory, but cleaner + lttngAgent.dispose(); + } +} +---- + +You can build this example like this: + +[role="term"] +---- +javac -cp /usr/share/java/liblttng-ust-agent.jar:$LOG4JCP Test.java +---- + +where `$LOG4JCP` is the path to log4j's JAR file. + +You can run the compiled class like this: + +[role="term"] +---- +java -cp /usr/share/java/liblttng-ust-agent.jar:$LOG4JCP:. Test +---- +==== + +When you <>, use the +`--jul` (`java.util.logging`) or `--log4j` (log4j) option to target +the desired Java +<>. You can also use the `--loglevel` or +`--loglevel-only` option to target a range of JUL/log4j log levels or a +specific JUL/log4j log level. + + +[role="since-2.7"] +[[python-application]] +=== User space Python agent + +You can instrument a Python 2 or Python 3 application which uses the +standard https://docs.python.org/3/library/logging.html[`logging`] +package. + +Each log statement emits an LTTng event once the +application module imports the +<> package. + +[role="img-100"] +.A Python application importing the LTTng-UST Python agent. +image::python-app.png[] + +To use the LTTng-UST Python agent: + +. In the Python application's source code, import the LTTng-UST Python + agent: ++ +-- +[source,python] +---- +import lttngust +---- +-- ++ +The LTTng-UST Python agent automatically adds its logging handler to the +root logger at import time. ++ +Any log statement that the application executes before this import does +not emit an LTTng event. ++ +IMPORTANT: The LTTng-UST Python agent must be +<>. + +. Use log statements and logging configuration as usual. + Since the LTTng-UST Python agent adds a handler to the _root_ + logger, you can trace any log statement from any logger. + +.Use the LTTng-UST Python agent. +==== +[source,python] +---- +import lttngust +import logging +import time + + +def example(): + logging.basicConfig() + logger = logging.getLogger('my-logger') + + while True: + logger.debug('debug message') + logger.info('info message') + logger.warn('warn message') + logger.error('error message') + logger.critical('critical message') + time.sleep(1) + + +if __name__ == '__main__': + example() +---- + +NOTE: `logging.basicConfig()`, which adds to the root logger a basic +logging handler which prints to the standard error stream, is not +strictly required for LTTng-UST tracing to work, but in versions of +Python preceding 3.2, you could see a warning message which indicates +that no handler exists for the logger `my-logger`. +==== + +When you <>, use the +`--python` option to target the Python +<>. You can also use +the `--loglevel` or `--loglevel-only` option to target a range of +Python log levels or a specific Python log level. + +When an application imports the LTTng-UST Python agent, the agent tries +to register to a <>. Note that you must +start the session daemon _before_ you start the Python application. +If a session daemon is found, the agent tries to register to it +during 5{nbsp}seconds, after which the application continues without +LTTng tracing support. You can override this timeout value with the +env:LTTNG_UST_PYTHON_REGISTER_TIMEOUT environment variable +(milliseconds). + +If the session daemon stops while a Python application with an imported +LTTng-UST Python agent runs, the agent retries to connect and to +register to a session daemon every 3{nbsp}seconds. You can override this +delay with the env:LTTNG_UST_PYTHON_REGISTER_RETRY_DELAY environment +variable. + + +[role="since-2.5"] +[[proc-lttng-logger-abi]] +=== LTTng logger + +The `lttng-tracer` Linux kernel module, part of +<>, creates the special LTTng logger file +path:{/proc/lttng-logger} when it's loaded. Any application can write +text data to this file to emit an LTTng event. + +[role="img-100"] +.An application writes to the LTTng logger file to emit an LTTng event. +image::lttng-logger.png[] + +The LTTng logger is the quickest method--not the most efficient, +however--to add instrumentation to an application. It is designed +mostly to instrument shell scripts: + +[role="term"] +---- +echo "Some message, some $variable" > /proc/lttng-logger +---- + +Any event that the LTTng logger emits is named `lttng_logger` and +belongs to the Linux kernel <>. However, unlike +other instrumentation points in the kernel tracing domain, **any Unix +user** can <> which +matches its event name, not only the root user or users in the tracing +group. + +To use the LTTng logger: + +* From any application, write text data to the path:{/proc/lttng-logger} + file. + +The `msg` field of `lttng_logger` event records contains the +recorded message. + +NOTE: The maximum message length of an LTTng logger event is +1024{nbsp}bytes. Writing more than this makes the LTTng logger emit more +than one event to contain the remaining data. + +You should not use the LTTng logger to trace a user application which +can be instrumented in a more efficient way, namely: + +* <>. +* <>. +* <>. + + +[[instrumenting-linux-kernel]] +=== LTTng kernel tracepoints + +NOTE: This section shows how to _add_ instrumentation points to the +Linux kernel. The kernel's subsystems are already thoroughly +instrumented at strategic places for LTTng when you +<> the <> +package. + +//// +There are two methods to instrument the Linux kernel: + +. <> over an existing ftrace + tracepoint which uses the `TRACE_EVENT()` API. ++ +Choose this if you want to instrumentation a Linux kernel tree with an +instrumentation point compatible with ftrace, perf, and SystemTap. + +. Use an <> to + instrument an out-of-tree kernel module. ++ +Choose this if you don't need ftrace, perf, or SystemTap support. +//// + + +[[linux-add-lttng-layer]] +==== [[instrumenting-linux-kernel-itself]][[mainline-trace-event]][[lttng-adaptation-layer]]Add an LTTng layer to an existing ftrace tracepoint + +This section shows how to add an LTTng layer to existing ftrace +instrumentation using the `TRACE_EVENT()` API. + +This section does not document the `TRACE_EVENT()` macro. You can +read the following articles to learn more about this API: + +* http://lwn.net/Articles/379903/[Using the TRACE_EVENT() macro (Part 1)] +* http://lwn.net/Articles/381064/[Using the TRACE_EVENT() macro (Part 2)] +* http://lwn.net/Articles/383362/[Using the TRACE_EVENT() macro (Part 3)] + +The following procedure assumes that your ftrace tracepoints are +correctly defined in their own header and that they are created in +one source file using the `CREATE_TRACE_POINTS` definition. + +To add an LTTng layer over an existing ftrace tracepoint: + +. Make sure the following kernel configuration options are + enabled: ++ +-- +* `CONFIG_MODULES` +* `CONFIG_KALLSYMS` +* `CONFIG_HIGH_RES_TIMERS` +* `CONFIG_TRACEPOINTS` +-- + +. Build the Linux source tree with your custom ftrace tracepoints. +. Boot the resulting Linux image on your target system. ++ +Confirm that the tracepoints exist by looking for their names in the +dir:{/sys/kernel/debug/tracing/events/subsys} directory, where `subsys` +is your subsystem's name. + +. Get a copy of the latest LTTng-modules{nbsp}{revision}: ++ +-- +[role="term"] +---- +cd $(mktemp -d) && +wget http://lttng.org/files/lttng-modules/lttng-modules-latest-2.8.tar.bz2 && +tar -xf lttng-modules-latest-2.8.tar.bz2 && +cd lttng-modules-2.8.* +---- +-- + +. In dir:{instrumentation/events/lttng-module}, relative to the root + of the LTTng-modules source tree, create a header file named + +__subsys__.h+ for your custom subsystem +__subsys__+ and write your + LTTng-modules tracepoint definitions using the LTTng-modules + macros in it. ++ +Start with this template: ++ +-- +[source,c] +.path:{instrumentation/events/lttng-module/my_subsys.h} +---- +#undef TRACE_SYSTEM +#define TRACE_SYSTEM my_subsys + +#if !defined(_LTTNG_MY_SUBSYS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _LTTNG_MY_SUBSYS_H + +#include "../../../probes/lttng-tracepoint-event.h" +#include + +LTTNG_TRACEPOINT_EVENT( + /* + * Format is identical to TRACE_EVENT()'s version for the three + * following macro parameters: + */ + my_subsys_my_event, + TP_PROTO(int my_int, const char *my_string), + TP_ARGS(my_int, my_string), + + /* LTTng-modules specific macros */ + TP_FIELDS( + ctf_integer(int, my_int_field, my_int) + ctf_string(my_bar_field, my_bar) + ) +) + +#endif /* !defined(_LTTNG_MY_SUBSYS_H) || defined(TRACE_HEADER_MULTI_READ) */ + +#include "../../../probes/define_trace.h" +---- +-- ++ +The entries in the `TP_FIELDS()` section are the list of fields for the +LTTng tracepoint. This is similar to the `TP_STRUCT__entry()` part of +ftrace's `TRACE_EVENT()` macro. ++ +See <> for a +complete description of the available `ctf_*()` macros. + +. Create the LTTng-modules probe's kernel module C source file, + +probes/lttng-probe-__subsys__.c+, where +__subsys__+ is your + subsystem name: ++ +-- +[source,c] +.path:{probes/lttng-probe-my-subsys.c} +---- +#include +#include "../lttng-tracer.h" + +/* + * Build-time verification of mismatch between mainline + * TRACE_EVENT() arguments and the LTTng-modules adaptation + * layer LTTNG_TRACEPOINT_EVENT() arguments. + */ +#include + +/* Create LTTng tracepoint probes */ +#define LTTNG_PACKAGE_BUILD +#define CREATE_TRACE_POINTS +#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module + +#include "../instrumentation/events/lttng-module/my_subsys.h" + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Your name "); +MODULE_DESCRIPTION("LTTng my_subsys probes"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION); +---- +-- + +. Edit path:{probes/Makefile} and add your new kernel module object + next to the existing ones: ++ +-- +[source,make] +.path:{probes/Makefile} +---- +# ... + +obj-m += lttng-probe-module.o +obj-m += lttng-probe-power.o + +obj-m += lttng-probe-my-subsys.o + +# ... +---- +-- + +. Build and install the LTTng kernel modules: ++ +-- +[role="term"] +---- +make KERNELDIR=/path/to/linux +sudo make modules_install +---- +-- ++ +Replace `/path/to/linux` with the path to the Linux source tree where +you defined and used tracepoints with ftrace's `TRACE_EVENT()` macro. + +Note that you can also use the +<> +instead of `LTTNG_TRACEPOINT_EVENT()` to use custom local variables and +C code that need to be executed before the event fields are recorded. + +The best way to learn how to use the previous LTTng-modules macros is to +inspect the existing LTTng-modules tracepoint definitions in the +dir:{instrumentation/events/lttng-module} header files. Compare them +with the Linux kernel mainline versions in the +dir:{include/trace/events} directory of the Linux source tree. + + +[role="since-2.7"] +[[lttng-tracepoint-event-code]] +===== Use custom C code to access the data for tracepoint fields + +Although we recommended to always use the +<> macro to describe +the arguments and fields of an LTTng-modules tracepoint when possible, +sometimes you need a more complex process to access the data that the +tracer records as event record fields. In other words, you need local +variables and multiple C{nbsp}statements instead of simple +argument-based expressions that you pass to the +<>. + +You can use the `LTTNG_TRACEPOINT_EVENT_CODE()` macro instead of +`LTTNG_TRACEPOINT_EVENT()` to declare custom local variables and define +a block of C{nbsp}code to be executed before LTTng records the fields. +The structure of this macro is: + +[source,c] +.`LTTNG_TRACEPOINT_EVENT_CODE()` macro syntax. +---- +LTTNG_TRACEPOINT_EVENT_CODE( + /* + * Format identical to the LTTNG_TRACEPOINT_EVENT() + * version for the following three macro parameters: + */ + my_subsys_my_event, + TP_PROTO(int my_int, const char *my_string), + TP_ARGS(my_int, my_string), + + /* Declarations of custom local variables */ + TP_locvar( + int a = 0; + unsigned long b = 0; + const char *name = "(undefined)"; + struct my_struct *my_struct; + ), + + /* + * Custom code which uses both tracepoint arguments + * (in TP_ARGS()) and local variables (in TP_locvar()). + * + * Local variables are actually members of a structure pointed + * to by the special variable tp_locvar. + */ + TP_code( + if (my_int) { + tp_locvar->a = my_int + 17; + tp_locvar->my_struct = get_my_struct_at(tp_locvar->a); + tp_locvar->b = my_struct_compute_b(tp_locvar->my_struct); + tp_locvar->name = my_struct_get_name(tp_locvar->my_struct); + put_my_struct(tp_locvar->my_struct); + + if (tp_locvar->b) { + tp_locvar->a = 1; + } + } + ), + + /* + * Format identical to the LTTNG_TRACEPOINT_EVENT() + * version for this, except that tp_locvar members can be + * used in the argument expression parameters of + * the ctf_*() macros. + */ + TP_FIELDS( + ctf_integer(unsigned long, my_struct_b, tp_locvar->b) + ctf_integer(int, my_struct_a, tp_locvar->a) + ctf_string(my_string_field, my_string) + ctf_string(my_struct_name, tp_locvar->name) + ) +) +---- + +IMPORTANT: The C code defined in `TP_code()` must not have any side +effects when executed. In particular, the code must not allocate +memory or get resources without deallocating this memory or putting +those resources afterwards. + + +[[instrumenting-linux-kernel-tracing]] +==== Load and unload a custom probe kernel module + +You must load a <> in the kernel before it can emit LTTng events. + +To load the default probe kernel modules and a custom probe kernel +module: + +* Use the `--extra-kmod-probes` option to give extra probe modules + to load when starting a root <>: ++ +-- +.Load the `my_subsys`, `usb`, and the default probe modules. +==== +[role="term"] +---- +sudo lttng-sessiond --extra-kmod-probes=my_subsys,usb +---- +==== +-- ++ +You only need to pass the subsystem name, not the whole kernel module +name. + +To load _only_ a given custom probe kernel module: + +* Use the `--kmod-probes` option to give the probe modules + to load when starting a root session daemon: ++ +-- +.Load only the `my_subsys` and `usb` probe modules. +==== +[role="term"] +---- +sudo lttng-sessiond --kmod-probes=my_subsys,usb +---- +==== +-- + +To confirm that a probe module is loaded: + +* Use man:lsmod(8): ++ +-- +[role="term"] +---- +lsmod | grep lttng_probe_usb +---- +-- + +To unload the loaded probe modules: + +* Kill the session daemon with `SIGTERM`: ++ +-- +[role="term"] +---- +sudo pkill lttng-sessiond +---- +-- ++ +You can also use man:modprobe(8)'s `--remove` option if the session +daemon terminates abnormally. + + +[[controlling-tracing]] +== Tracing control + +Once an application or a Linux kernel is +<> for LTTng tracing, +you can _trace_ it. + +This section is divided in topics on how to use the various +<>, in particular the <>, to _control_ the LTTng daemons and tracers. + +Note that the <> are +more comprehensive than the guides of this section. Refer to them if +your use case is not included in this section. + + +[[start-sessiond]] +=== Start a session daemon + +In some situations, you need to run a <> +_before_ you can use the cmd:lttng command-line tool. + +You will see the following error when you run a command while no session +daemon is running: + +---- +Error: No session daemon is available +---- + +The only command that automatically runs a session daemon is `create`, +which you use to <>. While this is most of the time the first operation that you +do, sometimes it's not. Some examples are: + +* <>. +* <>. + +[[tracing-group]] Each Unix user must have its own running session +daemon to trace user applications. The session daemon that the root user +starts is the only one allowed to control the LTTng kernel tracer. Users +that are part of the _tracing group_ can control the root session +daemon. The default tracing group name is `tracing`; you can set it to +something else with the `--group` option when you start the root session +daemon. + +To start a user session daemon: + +* Run cmd:lttng-sessiond: ++ +-- +[role="term"] +---- +lttng-sessiond --daemonize +---- +-- + +To start the root session daemon: + +* Run cmd:lttng-sessiond as the root user: ++ +-- +[role="term"] +---- +sudo lttng-sessiond --daemonize +---- +-- + +In both cases, remove the `--daemonize` option to start the session +daemon in foreground. + +To stop a session daemon, use cmd:kill on its process ID (standard +`TERM` signal). + +Note that some Linux distributions could manage the LTTng session daemon +as a service. In this case, you should use the service manager to +start, restart, and stop session daemons. + + +[[creating-destroying-tracing-sessions]] +=== Create and destroy a tracing session + +Almost all the LTTng control operations happen in the scope of +a <>, which is the dialogue between the +<> and you. + +To create a tracing session with a generated name: + +* Use the `create` command: ++ +-- +[role="term"] +---- +lttng create +---- +-- + +The created tracing session's name is `auto` followed by the +creation date. + +To create a tracing session with a specific name: + +* Use the optional argument of the `create` command: ++ +-- +[role="term"] +---- +lttng create my-session +---- +-- ++ +Replace `my-session` with the specific tracing session name. + +LTTng appends the creation date to the created tracing session's name. + +LTTng writes the traces of a tracing session in ++$LTTNG_HOME/lttng-trace/__name__+ by default, where +__name__+ is the +name of the tracing session. Note that the env:LTTNG_HOME environment +variable defaults to `$HOME` if not set. + +To output LTTng traces to a non-default location: + +* Use the `--output` option of the `create` command: ++ +-- +[role="term"] +---- +lttng create --output=/tmp/some-directory my-session +---- +-- + +You may create as many tracing sessions as you wish. + +To list all the existing tracing sessions for your Unix user: + +* Use the `list` command: ++ +-- +[role="term"] +---- +lttng list +---- +-- + +When you create a tracing session, it is set as the _current tracing +session_. The following man:lttng(1) commands operate on the current +tracing session when you don't specify one: + +[role="list-3-cols"] +* `add-context` +* `destroy` +* `disable-channel` +* `disable-event` +* `enable-channel` +* `enable-event` +* `load` +* `save` +* `snapshot` +* `start` +* `stop` +* `track` +* `untrack` +* `view` + +To change the current tracing session: + +* Use the `set-session` command: ++ +-- +[role="term"] +---- +lttng set-session new-session +---- +-- ++ +Replace `new-session` by the name of the new current tracing session. + +When you are done tracing in a given tracing session, you can destroy +it. This operation frees the resources taken by the tracing session +to destroy; it does not destroy the trace data that LTTng wrote for +this tracing session. + +To destroy the current tracing session: + +* Use the `destroy` command: ++ +-- +[role="term"] +---- +lttng destroy +---- +-- + + +[[list-instrumentation-points]] +=== List the available instrumentation points + +The <> can query the running instrumented +user applications and the Linux kernel to get a list of available +instrumentation points. For the Linux kernel <>, +they are tracepoints and system calls. For the user space tracing +domain, they are tracepoints. For the other tracing domains, they are +logger names. + +To list the available instrumentation points: + +* Use the `list` command with the requested tracing domain's option +amongst: ++ +-- +* `--kernel`: Linux kernel tracepoints (your Unix user must be a root + user, or it must be a member of the tracing group). +* `--kernel --syscall`: Linux kernel system calls (your Unix user must + be a root user, or it must be a member of the tracing group). +* `--userspace`: user space tracepoints. +* `--jul`: `java.util.logging` loggers. +* `--log4j`: Apache log4j loggers. +* `--python`: Python loggers. +-- + +.List the available user space tracepoints. +==== +[role="term"] +---- +lttng list --userspace +---- +==== + +.List the available Linux kernel system call tracepoints. +==== +[role="term"] +---- +lttng list --kernel --syscall +---- +==== + + +[[enabling-disabling-events]] +=== Create and enable an event rule + +Once you <>, you can create <> with the +`enable-event` command. + +You specify each condition with a command-line option. The available +condition options are shown in the following table. + +[role="growable",cols="asciidoc,asciidoc,default"] +.Condition command-line options for the `enable-event` command. +|==== +|Option |Description |Applicable tracing domains + +| +One of: + +. `--syscall` +. +--probe=__ADDR__+ +. +--function=__ADDR__+ + +| +Instead of using the default _tracepoint_ instrumentation type, use: + +. A Linux system call. +. A Linux https://lwn.net/Articles/132196/[KProbe] (symbol or address). +. The entry and return points of a Linux function (symbol or address). + +|Linux kernel. + +|First positional argument. + +| +Tracepoint or system call name. In the case of a Linux KProbe or +function, this is a custom name given to the event rule. With the +JUL, log4j, and Python domains, this is a logger name. + +With a tracepoint, logger, or system call name, the last character +can be `*` to match anything that remains. + +|All. + +| +One of: + +. +--loglevel=__LEVEL__+ +. +--loglevel-only=__LEVEL__+ + +| +. Match only tracepoints or log statements with a logging level at + least as severe as +__LEVEL__+. +. Match only tracepoints or log statements with a logging level + equal to +__LEVEL__+. + +You can get the list of available logging level names with +`lttng enable-event --help`. + +|User space, JUL, log4j, and Python. + +|+--exclude=__EXCLUSIONS__+ + +| +When you use a `*` character at the end of the tracepoint or logger +name (first positional argument), exclude the specific names in the +comma-delimited list +__EXCLUSIONS__+. + +| +User space, JUL, log4j, and Python. + +|+--filter=__EXPR__+ + +| +Match only events which satisfy the expression +__EXPR__+. + ++__EXPR__+ is a C-like logical expression where identifiers are event +fields (preceded with `$ctx.` for context fields). Nested expressions +with `(` and `)`, and all the logical and comparison operators of the C +language are supported. The precedence rules of those operators are the +same as in the C language. + +When a comparison includes a non-existent event field, the whole filter +expression evaluates to false. + +C integer and floating point number constants are supported, as well as +literal strings between double quotes (`"`). Literal strings can +contain a wildcard character (`*`) at the end to match anything that +remains. This wildcard can be escaped using `\*`. + +Note that, although it is possible to use this option with the JUL, +log4j, and Python tracing domains, the tracer evalutes the expression +against the equivalent user space event. + +|All. + +|==== + +See man:lttng(1) +for more details about those command-line options. + +You attach an event rule to a <> on creation. If you +do not specify the channel with the `--channel` option, and if the event +rule to create is the first in its <> for a given +tracing session, then LTTng creates a _default channel_ for you. This +default channel is reused in subsequent invocations of the +`enable-event` command for the same tracing domain. + +An event rule is always enabled at creation time. + +The following examples show how you can combine the previous +command-line options to create simple to more complex event rules. + +.Create an event rule targetting a Linux kernel tracepoint (default channel). +==== +[role="term"] +---- +lttng enable-event --kernel sched_switch +---- +==== + +.Create an event rule matching four Linux kernel system calls (default channel). +==== +[role="term"] +---- +lttng enable-event --kernel --syscall open,write,read,close +---- +==== + +.Create an event rule matching a Linux kernel tracepoint with a filter expression (default channel). +==== +[role="term"] +---- +lttng enable-event --kernel sched_switch --filter='prev_comm == "bash"' +---- + +IMPORTANT: Make sure to always quote the filter string when you +use man:lttng(1) from a shell. +==== + +.Create an event rule matching any user space tracepoint of a given tracepoint provider with a log level range (default channel). +==== +[role="term"] +---- +lttng enable-event --userspace my_app:'*' --loglevel=TRACE_INFO +---- + +IMPORTANT: Make sure to always quote the wildcard character when you +use man:lttng(1) from a shell. +==== + +.Create an event rule matching multiple Python loggers with a wildcard and with exclusions (default channel). +==== +[role="term"] +---- +lttng enable-event --python my-app.'*' \ + --exclude='my-app.module,my-app.hello' +---- +==== + +.Create an event rule matching any Apache log4j logger with a specific log level (default channel). +==== +[role="term"] +---- +lttng enable-event --log4j --all --loglevel-only=LOG4J_WARN +---- +==== + +.Create an event rule attached to a specific channel matching a specific user space tracepoint provider and tracepoint. +==== +[role="term"] +---- +lttng enable-event --userspace my_app:my_tracepoint --channel=my-channel +---- +==== + +The event rules of a given channel form a whitelist: as soon as an +emitted event passes one of them, LTTng can record the event. For +example, an event named `my_app:my_tracepoint` emitted from a user space +tracepoint with a `TRACE_ERROR` log level passes both of the following +rules: + +[role="term"] +---- +lttng enable-event --userspace my_app:my_tracepoint +lttng enable-event --userspace my_app:my_tracepoint \ + --loglevel=TRACE_INFO +---- + +The second event rule is redundant: the first one includes +the second one. + + +[[disable-event-rule]] +=== Disable an event rule + +To disable an event rule that you <> +previously, use the `disable-event` command. This command disables _all_ +the event rules (of a given tracing domain and channel) which match an +instrumentation point. The other conditions are not supported as of +LTTng{nbsp}{revision}. + +The LTTng tracer does not record an emitted event which passes +a _disabled_ event rule. + +.Disable an event rule matching a Python logger (default channel). +==== +[role="term"] +---- +lttng disable-event --python my-logger +---- +==== + +.Disable an event rule matching all `java.util.logging` loggers (default channel). +==== +[role="term"] +---- +lttng disable-event --jul '*' +---- +==== + +.Disable _all_ the event rules of the default channel. +==== +The `--all-events` option is not, like the `--all` option of +`enable-event`, the equivalent of the event name `*` (wildcard): it +disables _all_ the event rules of a given channel. + +[role="term"] +---- +lttng disable-event --jul --all-events +---- +==== + +NOTE: You cannot delete an event rule once you create it. + + +[[status]] +=== Get the status of a tracing session + +To get the status of a tracing session, that is, its channels, event +rules, and their attributes: + +* Use the `list` command with the tracing session's name: ++ +-- +[role="term"] +---- +lttng list my-session +---- +-- ++ +Replace `my-session` with your tracing session's name. + + +[[basic-tracing-session-control]] +=== Start and stop a tracing session + +Once you <> and +<>, +you can start and stop the tracers for this tracing session. + +To start tracing in the current tracing session: + +* Use the `start` command: ++ +-- +[role="term"] +---- +lttng start +---- +-- + +To stop tracing in the current tracing session: + +* Use the `stop` command: ++ +-- +[role="term"] +---- +lttng stop +---- +-- + +LTTng is very flexible: you can launch user applications before +or after the you start the tracers. The tracers only record the events +if they pass enabled event rules and if they occur while the tracers are +started. + + +[[enabling-disabling-channels]] +=== Create a channel + +Once you create a tracing session, you can create a <> +with the `enable-channel` command. + +Note that LTTng automatically creates a default channel when, for a +given <>, no channels exist and you +<> the first event rule. This default +channel is named `channel0` and its attributes are set to reasonable +values. Therefore, you only need to create a channel when you need +non-default attributes. + +You specify each non-default channel attribute with a command-line +option when you use the `enable-channel` command. The available +command-line options are: + +[role="growable",cols="asciidoc,asciidoc"] +.Command-line options for the `enable-channel` command. +|==== +|Option |Description + +|`--overwrite` + +| +Use the _overwrite_ +<> instead of +the default _discard_ mode. + +|`--buffers-pid` (user space tracing domain only) + +| +Use the per-process <> +instead of the default per-user buffering scheme. + +|+--subbuf-size=__SIZE__+ + +| +Allocate sub-buffers of +__SIZE__+ bytes (power of two), for each CPU, +either for each Unix user (default), or for each instrumented process. + +See <>. + +|+--num-subbuf=__COUNT__+ + +| +Allocate +__COUNT__+ sub-buffers (power of two), for each CPU, either +for each Unix user (default), or for each instrumented process. + +See <>. + +|+--tracefile-size=__SIZE__+ + +| +Set the maximum size of each trace file that this channel writes within +a stream to +__SIZE__+ bytes instead of no maximum. + +See <>. + +|+--tracefile-count=__COUNT__+ + +| +Limit the number of trace files that this channel creates to ++__COUNT__+ channels instead of no limit. + +See <>. + +|+--switch-timer=__PERIODUS__+ + +| +Set the <> +to +__PERIODUS__+{nbsp}µs. + +|+--read-timer=__PERIODUS__+ + +| +Set the <> +to +__PERIODUS__+{nbsp}µs. + +|+--output=__TYPE__+ (Linux kernel tracing domain only) + +| +Set the channel's output type to +__TYPE__+, either `mmap` or `splice`. + +|==== + +See man:lttng(1) +for more details about those command-line options. + +You can only create a channel in the Linux kernel and user space +<>: other tracing domains have their own +channel created on the fly when +<>. + +[IMPORTANT] +==== +Because of a current LTTng limitation, you must create all channels +_before_ you <> in a given +tracing session, that is, before the first time you run `lttng start`. + +Since LTTng automatically creates a default channel when you use the +`enable-event` command with a specific tracing domain, you cannot, for +example, create a Linux kernel event rule, start tracing, and then +create a user space event rule, because no user space channel exists yet +and it's too late to create one. + +For this reason, make sure to configure your channels properly +before starting the tracers for the first time! +==== + +The following examples show how you can combine the previous +command-line options to create simple to more complex channels. + +.Create a Linux kernel channel with default attributes. +==== +[role="term"] +---- +lttng enable-channel --kernel my-channel +---- +==== + +.Create a user space channel with 4 sub-buffers or 1{nbsp}MiB each, per CPU, per instrumented process. +==== +[role="term"] +---- +lttng enable-channel --userspace --num-subbuf=4 --subbuf-size=1M \ + --buffers-pid my-channel +---- +==== + +.Create a Linux kernel channel which rotates 8 trace files of 4{nbsp}MiB each for each stream +==== +[role="term"] +---- +lttng enable-channel --kernel --tracefile-count=8 \ + --tracefile-size=4194304 my-channel +---- +==== + +.Create a user space channel in overwrite (or _flight recorder_) mode. +==== +[role="term"] +---- +lttng enable-channel --userspace --overwrite my-channel +---- +==== + +You can <> the same event rule in +two different channels: + +[role="term"] +---- +lttng enable-event --userspace --channel=my-channel app:tp +lttng enable-event --userspace --channel=other-channel app:tp +---- + +If both channels are enabled, when a tracepoint named `app:tp` is +reached, LTTng records two events, one for each channel. + + +[[disable-channel]] +=== Disable a channel + +To disable a specific channel that you <> +previously, use the `disable-channel` command. + +.Disable a specific Linux kernel channel. +==== +[role="term"] +---- +lttng disable-channel --kernel my-channel +---- +==== + +The state of a channel precedes the individual states of event rules +attached to it: event rules which belong to a disabled channel, even if +they are enabled, are also considered disabled. + + +[[adding-context]] +=== Add context fields to a channel + +Event record fields in trace files provide important information about +events that occured previously, but sometimes some external context may +help you solve a problem faster. Examples of context fields are: + +* The **process ID**, **thread ID**, **process name**, and + **process priority** of the thread in which the event occurs. +* The **hostname** of the system on which the event occurs. +* The current values of many possible **performance counters** using + perf, for example: +** CPU cycles, stalled cycles, idle cycles, and the other cycle types. +** Cache misses. +** Branch instructions, misses, and loads. +** CPU faults. + +To get the full list of available context fields, see +`lttng add-context --help`. Some context fields are reserved for a +specific <> (Linux kernel or user space). + +You add context fields to <>. All the events +that a channel with added context fields records contain those fields. + +To add context fields to one or all the channels of a given tracing +session, use the `add-context` command. + +.Add context fields to all the channels of the current tracing session. +==== +The following command line adds the virtual process identifier and +the per-thread CPU cycles count fields to all the user space channels +of the current tracing session. + +[role="term"] +---- +lttng add-context --userspace --type=vpid --type=perf:thread:cpu-cycles +---- +==== + +.Add a context field to a specific channel. +==== +The following command line adds the thread identifier context field +to the Linux kernel channel named `my-channel` in the current +tracing session. + +[role="term"] +---- +lttng add-context --kernel --channel=my-channel --type=tid +---- +==== + +NOTE: You cannot remove context fields from a channel once you add it. + + +[role="since-2.7"] +[[pid-tracking]] +=== Track process IDs + +It's often useful to allow only specific process IDs (PIDs) to emit +events. For example, you may wish to record all the system calls made by +a given process (à la http://linux.die.net/man/1/strace[strace]). + +The `track` and `untrack` commands serve this purpose. Both commands +operate on a whitelist of process IDs. You _add_ entries to this +whitelist with the `track` command and remove entries with the `untrack` +command. Any process which has one of the PIDs in the whitelist is +allowed to emit LTTng events which pass an enabled <>. + +NOTE: The PID tracker tracks the _numeric process IDs_. Should a +process with a given tracked ID exit and another process be given this +ID, then the latter would also be allowed to emit events. + +.Track and untrack process IDs. +==== +For the sake of the following example, assume the target system has 16 +possible PIDs. + +When you +<>, +the whitelist contains all the possible PIDs: + +[role="img-100"] +.All PIDs are tracked. +image::track-all.png[] + +When the whitelist is full and you use the `track` command to specify +some PIDs to track, LTTng first clears the whitelist, then it tracks +the specific PIDs. After: + +[role="term"] +---- +lttng track --pid=3,4,7,10,13 +---- + +the whitelist is: + +[role="img-100"] +.PIDs 3, 4, 7, 10, and 13 are tracked. +image::track-3-4-7-10-13.png[] + +You can add more PIDs to the whitelist afterwards: + +[role="term"] +---- +lttng track --pid=1,15,16 +---- + +The result is: + +[role="img-100"] +.PIDs 1, 15, and 16 are added to the whitelist. +image::track-1-3-4-7-10-13-15-16.png[] + +The `untrack` command removes entries from the PID tracker's whitelist. +Given the previous example, the following command: + +[role="term"] +---- +lttng untrack --pid=3,7,10,13 +---- + +leads to this whitelist: + +[role="img-100"] +.PIDs 3, 7, 10, and 13 are removed from the whitelist. +image::track-1-4-15-16.png[] + +LTTng can track all possible PIDs again using the `--all` option: + +[role="term"] +---- +lttng track --pid --all +---- + +The result is, again: + +[role="img-100"] +.All PIDs are tracked. +image::track-all.png[] +==== + +.Track only specific PIDs +==== +A very typical use case with PID tracking is to start with an empty +whitelist, then <>, +and then add PIDs manually while tracers are active. You can accomplish +this by using the `--all` option of the `untrack` command to clear the +whitelist after you create a tracing session: + +[role="term"] +---- +lttng untrack --pid --all +---- + +gives: + +[role="img-100"] +.No PIDs are tracked. +image::untrack-all.png[] + +If you trace with this whitelist configuration, the tracer records no +events for this <> because no processes are +tracked. You can use the `track` command as usual to track specific +PIDs, for example: + +[role="term"] +---- +lttng track --pid=6,11 +---- + +Result: + +[role="img-100"] +.PIDs 6 and 11 are tracked. +image::track-6-11.png[] +==== + + +[role="since-2.5"] +[[saving-loading-tracing-session]] +=== Save and load tracing session configurations + +Configuring a <> can be long. Some of +the tasks involved are: + +* <> with + specific attributes. +* <> to specific channels. +* <> with specific log + level and filter conditions. + +If you use LTTng to solve real world problems, chances are you have to +record events using the same tracing session setup over and over, +modifying a few variables each time in your instrumented program +or environment. To avoid constant tracing session reconfiguration, +the cmd:lttng command-line tool can save and load tracing session +configurations to/from XML files. + +To save a given tracing session configuration: + +* Use the `save` command: ++ +-- +[role="term"] +---- +lttng save my-session +---- +-- ++ +Replace `my-session` with the name of the tracing session to save. + +LTTng saves tracing session configurations to +dir:{$LTTNG_HOME/.lttng/sessions} by default. Note that the +env:LTTNG_HOME environment variable defaults to `$HOME` if not set. Use +the `--output-path` option to change this destination directory. + +LTTng saves all configuration parameters, for example: + +* The tracing session name. +* The trace data output path. +* The channels with their state and all their attributes. +* The context fields you added to channels. +* The event rules with their state, log level and filter conditions. + +To load a tracing session: + +* Use the `load` command: ++ +-- +[role="term"] +---- +lttng load my-session +---- +-- ++ +Replace `my-session` with the name of the tracing session to load. + +When LTTng loads a configuration, it restores your saved tracing session +as if you just configured it manually. + +See man:lttng(1) for the complete list of command-line options. You +can also save and load all many sessions at a time, and decide in which +directory to output the XML files. + + +[[sending-trace-data-over-the-network]] +=== Send trace data over the network + +LTTng can send the recorded trace data to a remote system over the +network instead of writing it to the local file system. + +To send the trace data over the network: + +. On the _remote_ system (which can also be the target system), + start an LTTng <>: ++ +-- +[role="term"] +---- +lttng-relayd +---- +-- + +. On the _target_ system, create a tracing session configured to + send trace data over the network: ++ +-- +[role="term"] +---- +lttng create my-session --set-url=net://remote-system +---- +-- ++ +Replace `remote-system` by the host name or IP address of the +remote system. See `lttng create --help` for the exact URL format. + +. On the target system, use the cmd:lttng command-line tool as usual. + When tracing is active, the target's consumer daemon sends sub-buffers + to the relay daemon running on the remote system intead of flushing + them to the local file system. The relay daemon writes the received + packets to the local file system. + +The relay daemon writes trace files to ++$LTTNG_HOME/lttng-traces/__hostname__/__session__+ by default, where ++__hostname__+ is the host name of the target system and +__session__+ +is the tracing session name. Note that the env:LTTNG_HOME environment +variable defaults to `$HOME` if not set. Use the `--output` option of +cmd:lttng-relayd to write trace files to another base directory. + + +[role="since-2.4"] +[[lttng-live]] +=== View events as LTTng emits them (noch:{LTTng} live) + +LTTng live is a network protocol implemented by the +<> to allow compatible trace viewers to +display events as LTTng emits them on the target system while tracing +is active. + +The relay daemon creates a _tee_: it forwards the trace data to both +the local file system and to connected live viewers: + +[role="img-90"] +.The relay daemon creates a _tee_, forwarding the trace data to both trace files and a connected live viewer. +image::live.png[] + +To use LTTng live: + +. On the _target system_, create a <> + in _live mode_: ++ +-- +[role="term"] +---- +lttng create --live my-session +---- +-- ++ +This spawns a local relay daemon. + +. Start the live viewer and configure it to connect to the relay + daemon. For example, with http://diamon.org/babeltrace[Babeltrace]: ++ +-- +[role="term"] +---- +babeltrace --input-format=lttng-live net://localhost/host/hostname/my-session +---- +-- ++ +Replace: ++ +-- +* `hostname` with the host name of the target system. +* `my-session` with the name of the tracing session to view. +-- + +. Configure the tracing session as usual with the cmd:lttng + command-line tool, and <>. + +You can list the available live tracing sessions with Babeltrace: + +[role="term"] +---- +babeltrace --input-format=lttng-live net://localhost +---- + +You can start the relay daemon on another system. In this case, you need +to specify the relay daemon's URL when you create the tracing session +with the `--set-url` option. You also need to replace `localhost` +in the procedure above with the host name of the system on which the +relay daemon is running. + +See man:lttng(1) and man:lttng-relayd(8) for the complete list of +command-line options. + + +[role="since-2.3"] +[[taking-a-snapshot]] +=== Take a snapshot of the current sub-buffers of a tracing session + +The normal behavior of LTTng is to append full sub-buffers to growing +trace data files. This is ideal to keep a full history of the events +that occurred on the target system, but it can +represent too much data in some situations. For example, you may wish +to trace your application continuously until some critical situation +happens, in which case you only need the latest few recorded +events to perform the desired analysis, not multi-gigabyte trace files. + +With the `snapshot` command, you can take a snapshot of the current +sub-buffers of a given <>. LTTng can +write the snapshot to the local file system or send it over the network. + +To take a snapshot: + +. Create a tracing session in _snapshot mode_: ++ +-- +[role="term"] +---- +lttng create --snapshot my-session +---- +-- ++ +The <> of +<> created in this mode is automatically set to +_overwrite_ (flight recorder mode). + +. Configure the tracing session as usual with the cmd:lttng + command-line tool, and <>. + +. **Optional**: When you need to take a snapshot, stop tracing. ++ +You can take a snapshot when the tracers are active, but if you stop +them first, you are sure that the data in the sub-buffers does not +change before you actually take the snapshot. + +. Take a snapshot: ++ +-- +[role="term"] +---- +lttng snapshot record --name=my-first-snapshot +---- +-- ++ +LTTng writes the current sub-buffers of all the current tracing +session's channels to trace files on the local file system. Those trace +files have `my-first-snapshot` in their name. + +There is no difference between the format of a normal trace file and the +format of a snapshot: viewers of LTTng traces also support LTTng +snapshots. + +By default, LTTng writes snapshot files to the path shown by +`lttng snapshot list-output`. You can change this path or decide to send +snapshots over the network using either: + +. An output path or URL that you specify when you create the + tracing session. +. An snapshot output path or URL that you add using + `lttng snapshot add-output` +. An output path or URL that you provide directly to the + `lttng snapshot record` command. + +Method 3 overrides method 2, which overrides method 1. When you +specify a URL, a relay daemon must listen on a remote system (see +<>). + + +[role="since-2.6"] +[[mi]] +=== Use the machine interface + +With any command of the cmd:lttng command-line tool, you can use the +`--mi=xml` argument (before the command name) to get an XML machine +interface output, for example: + +[role="term"] +---- +lttng --mi=xml enable-event --kernel --syscall open +---- + +A schema definition (XSD) is +https://github.com/lttng/lttng-tools/blob/stable-{revision}/src/common/mi_lttng.xsd[available] +to ease the integration with external tools as much as possible. + + +[role="since-2.7"] +[[persistent-memory-file-systems]] +=== Record trace data on persistent memory file systems + +https://en.wikipedia.org/wiki/Non-volatile_random-access_memory[Non-volatile random-access memory] +(NVRAM) is random-access memory that retains its information when power +is turned off (non-volatile). Systems with such memory can store data +structures in RAM and retrieve them after a reboot, without flushing +to typical _storage_. + +Linux supports NVRAM file systems thanks to either +http://pramfs.sourceforge.net/[PRAMFS] or +https://www.kernel.org/doc/Documentation/filesystems/dax.txt[DAX]{nbsp}+{nbsp}http://lkml.iu.edu/hypermail/linux/kernel/1504.1/03463.html[pmem] +(requires Linux 4.1+). + +This section does not describe how to operate such file systems; +we assume that you have a working persistent memory file system. + +When you create a <>, you can specify +the path of the shared memory holding the sub-buffers. If you specify a +location on an NVRAM file system, then you can retrieve the latest +recorded trace data when the system reboots after a crash. + +To record trace data on a persistent memory file system and retrieve the +trace data after a system crash: + +. Create a tracing session with a sub-buffer shared memory path located + on an NVRAM file system: ++ +-- +[role="term"] +---- +lttng create --shm-path=/path/to/shm +---- +-- + +. Configure the tracing session as usual with the cmd:lttng + command-line tool, and <>. + +. After a system crash, use the cmd:lttng-crash command-line tool to + view the trace data recorded on the NVRAM file system: ++ +-- +[role="term"] +---- +lttng-crash /path/to/shm +---- +-- + +The binary layout of the ring buffer files is not exactly the same as +the trace files layout. This is why you need to use the cmd:lttng-crash +utility instead of your preferred trace viewer directly. + +To convert the ring buffer files to LTTng trace files: + +* Use the `--extract` option of cmd:lttng-crash: ++ +-- +[role="term"] +---- +lttng-crash --extract=/path/to/trace /path/to/shm +---- +-- + +See man:lttng-crash(1) for the complete list of command-line options. + + +[[reference]] +== Reference + +This section presents various references for LTTng packages such as +links to online manpages, tables that the rest of the text needs, +descriptions of library functions, and more. + + +[[online-lttng-manpages]] +=== Online noch:{LTTng} manpages + +LTTng packages currently install the following link:/man[man pages], +available online using the links below: + +* **LTTng-tools** +** man:lttng(1) +** man:lttng-crash(1) +** man:lttng-sessiond(8) +** man:lttng-relayd(8) +* **LTTng-UST** +** man:lttng-gen-tp(1) +** man:lttng-ust(3) +** man:lttng-ust-cyg-profile(3) +** man:lttng-ust-dl(3) + + +[[lttng-ust-ref]] +=== noch:{LTTng-UST} + +This section presents references of the LTTng-UST package. + + +[[liblttng-ust]] +==== noch:{LTTng-UST} library (+liblttng‑ust+) + +The LTTng-UST library, or `liblttng-ust`, is the main shared object +against which user applications are linked to make LTTng user space +tracing possible. + +The <> guide shows the complete +process to instrument, build and run a C/$$C++$$ application using +LTTng-UST, while this section contains a few important tables. + + +[[liblttng-ust-tp-fields]] +===== Tracepoint fields macros (for `TP_FIELDS()`) + +The available macros to define tracepoint fields, which you must use +within `TP_FIELDS()` in `TRACEPOINT_EVENT()`, are: + +[role="func-desc growable",cols="asciidoc,asciidoc"] +.Available macros to define LTTng-UST tracepoint fields +|==== +|Macro |Description and parameters + +| ++ctf_integer(__t__, __n__, __e__)+ + ++ctf_integer_nowrite(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 10. + ++__t__+:: + Integer C type (`int`, `long`, `size_t`, ...). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_hex(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_network(__t__, __n__, __e__)+ +| +Integer in network byte order (big-endian), displayed in base 10. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_network_hex(__t__, __n__, __e__)+ +| +Integer in network byte order, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_float(__t__, __n__, __e__)+ + ++ctf_float_nowrite(__t__, __n__, __e__)+ +| +Floating point number. + ++__t__+:: + Floating point number C type (`float` or `double`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_string(__n__, __e__)+ + ++ctf_string_nowrite(__n__, __e__)+ +| +Null-terminated string; undefined behavior if +__e__+ is `NULL`. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_array(__t__, __n__, __e__, __s__)+ + ++ctf_array_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array of integers + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_array_text(__t__, __n__, __e__, __s__)+ + ++ctf_array_text_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array, printed as text. + +The string does not need to be null-terminated. + ++__t__+:: + Array element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_sequence(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array of integers. + +The type of +__E__+ must be unsigned. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. + +| ++ctf_sequence_text(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array, displayed as text. + +The string does not need to be null-terminated. + +The type of +__E__+ must be unsigned. + +The behaviour is undefined if +__e__+ is `NULL`. + ++__t__+:: + Sequence element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. +|==== + +The `_nowrite` versions omit themselves from the session trace, but are +otherwise identical. This means the tracer does not write the `_nowrite` +fields to the trace. Their primary purpose is to make some of the event +context available to the <> +without having to commit the data to sub-buffers. + + +[[liblttng-ust-tracepoint-loglevel]] +===== Tracepoint log levels (for `TRACEPOINT_LOGLEVEL()`) + +The following table shows the available log level values for the +`TRACEPOINT_LOGLEVEL()` macro: + +`TRACE_EMERG`:: + System is unusable. + +`TRACE_ALERT`:: + Action must be taken immediately. + +`TRACE_CRIT`:: + Critical conditions. + +`TRACE_ERR`:: + Error conditions. + +`TRACE_WARNING`:: + Warning conditions. + +`TRACE_NOTICE`:: + Normal, but significant, condition. + +`TRACE_INFO`:: + Informational message. + +`TRACE_DEBUG_SYSTEM`:: + Debug information with system-level scope (set of programs). + +`TRACE_DEBUG_PROGRAM`:: + Debug information with program-level scope (set of processes). + +`TRACE_DEBUG_PROCESS`:: + Debug information with process-level scope (set of modules). + +`TRACE_DEBUG_MODULE`:: + Debug information with module (executable/library) scope (set of units). + +`TRACE_DEBUG_UNIT`:: + Debug information with compilation unit scope (set of functions). + +`TRACE_DEBUG_FUNCTION`:: + Debug information with function-level scope. + +`TRACE_DEBUG_LINE`:: + Debug information with line-level scope (TRACEPOINT_EVENT default). + +`TRACE_DEBUG`:: + Debug-level message. + +Log levels `TRACE_EMERG` through `TRACE_INFO` and `TRACE_DEBUG` match +http://man7.org/linux/man-pages/man3/syslog.3.html[syslog] +level semantics. Log levels `TRACE_DEBUG_SYSTEM` through `TRACE_DEBUG` +offer more fine-grained selection of debug information. + + +[[lttng-modules-ref]] +=== noch:{LTTng-modules} + +This section presents references of the LTTng-modules package. + + +[role="since-2.7"] +[[lttng-modules-tp-fields]] +==== Tracepoint fields macros (for `TP_FIELDS()`) + +[[tp-fast-assign]][[tp-struct-entry]]The available macros to define +tracepoint fields, which must be listed within `TP_FIELDS()` in +`LTTNG_TRACEPOINT_EVENT()`, are: + +[role="func-desc growable",cols="asciidoc,asciidoc"] +.Available macros to define LTTng-modules tracepoint fields +|==== +|Macro |Description and parameters + +| ++ctf_integer(__t__, __n__, __e__)+ + ++ctf_integer_nowrite(__t__, __n__, __e__)+ + ++ctf_user_integer(__t__, __n__, __e__)+ + ++ctf_user_integer_nowrite(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 10. + ++__t__+:: + Integer C type (`int`, `long`, `size_t`, ...). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_integer_hex(__t__, __n__, __e__)+ + ++ctf_user_integer_hex(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_oct(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 8. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_integer_network(__t__, __n__, __e__)+ + ++ctf_user_integer_network(__t__, __n__, __e__)+ +| +Integer in network byte order (big-endian), displayed in base 10. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_integer_network_hex(__t__, __n__, __e__)+ + ++ctf_user_integer_network_hex(__t__, __n__, __e__)+ +| +Integer in network byte order, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_string(__n__, __e__)+ + ++ctf_string_nowrite(__n__, __e__)+ + ++ctf_user_string(__n__, __e__)+ + ++ctf_user_string_nowrite(__n__, __e__)+ +| +Null-terminated string; undefined behavior if +__e__+ is `NULL`. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_array(__t__, __n__, __e__, __s__)+ + ++ctf_array_nowrite(__t__, __n__, __e__, __s__)+ + ++ctf_user_array(__t__, __n__, __e__, __s__)+ + ++ctf_user_array_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array of integers + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_array_text(__t__, __n__, __e__, __s__)+ + ++ctf_array_text_nowrite(__t__, __n__, __e__, __s__)+ + ++ctf_user_array_text(__t__, __n__, __e__, __s__)+ + ++ctf_user_array_text_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array, printed as text. + +The string does not need to be null-terminated. + ++__t__+:: + Array element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_sequence(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_user_sequence(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_user_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array of integers. + +The type of +__E__+ must be unsigned. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. + +|+ctf_sequence_hex(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array of integers, displayed in base 16. + +The type of +__E__+ must be unsigned. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. + +|+ctf_sequence_network(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array of integers in network byte order (big-endian), +displayed in base 10. + +The type of +__E__+ must be unsigned. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. + +| ++ctf_sequence_text(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_user_sequence_text(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_user_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array, displayed as text. + +The string does not need to be null-terminated. + +The type of +__E__+ must be unsigned. + +The behaviour is undefined if +__e__+ is `NULL`. + ++__t__+:: + Sequence element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. +|==== + +Use the `_user` versions when the argument expression, `e`, is +a user space address. In the cases of `ctf_user_integer*()` and +`ctf_user_float*()`, `&e` must be a user space address, thus `e` must +be addressable. + +The `_nowrite` versions omit themselves from the session trace, but are +otherwise identical. This means the `_nowrite` fields won't be written +in the recorded trace. Their primary purpose is to make some +of the event context available to the +<> without having to +commit the data to sub-buffers. + + +[[glossary]] +== Glossary + +Terms related to LTTng and to tracing in general: + +Babeltrace:: + The http://diamon.org/babeltrace[Babeltrace] project, which includes + the cmd:babeltrace command, some libraries, and Python bindings. + +<>:: + A layout of sub-buffers applied to a given channel. + +<>:: + An entity which is responsible for a set of ring buffers. ++ +<> are always attached to a specific channel. + +clock:: + A reference of time for a tracer. + +<>:: + A process which is responsible for consuming the full sub-buffers + and write them to a file system or send them over the network. + +<>:: The event loss + mode in which the tracer _discards_ new event records when there's no + sub-buffer space left to store them. + +event:: + The consequence of the execution of an instrumentation + point, like a tracepoint that you manually place in some source code, + or a Linux kernel KProbe. ++ +An event is said to _occur_ at a specific time. Different actions can +be taken upon the occurance of an event, like record the event's payload +to a sub-buffer. + +<>:: + The mechanism by which event records of a given channel are lost + (not recorded) when there is no sub-buffer space left to store them. + +[[def-event-name]]event name:: + The name of an event, which is also the name of the event record. + This is also called the _instrumentation point name_. + +event record:: + A record, in a trace, of the payload of an event which occured. + +<>:: + Set of conditions which must be satisfied for one or more occuring + events to be recorded. + +`java.util.logging`:: + Java platform's + https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html[core logging facilities]. + +<>:: + The use of LTTng probes to make a piece of software traceable. + +instrumentation point:: + A point in the execution path of a piece of software that, when + reached by this execution, can emit an event. + +instrumentation point name:: + See _<>_. + +log4j:: + A http://logging.apache.org/log4j/1.2/[logging library] for Java + developed by the Apache Software Foundation. + +log level:: + Level of severity of a log statement or user space + instrumentation point. + +LTTng:: + The _Linux Trace Toolkit: next generation_ project. + +<>:: + A command-line tool provided by the LTTng-tools project which you + can use to send and receive control messages to and from a + session daemon. + +LTTng analyses:: + The https://github.com/lttng/lttng-analyses[LTTng analyses] project, + which is a set of analyzing programs that are used to obtain a + higher level view of an LTTng trace. + +cmd:lttng-consumerd:: + The name of the consumer daemon program. + +cmd:lttng-crash:: + A utility provided by the LTTng-tools project which can convert + ring buffer files (usually + <>) + to trace files. + +LTTng Documentation:: + This document. + +<>:: + A communication protocol between the relay daemon and live viewers + which makes it possible to see events "live", as they are received by + the relay daemon. + +<>:: + The https://github.com/lttng/lttng-modules[LTTng-modules] project, + which contains the Linux kernel modules to make the Linux kernel + instrumentation points available for LTTng tracing. + +cmd:lttng-relayd:: + The name of the relay daemon program. + +cmd:lttng-sessiond:: + The name of the session daemon program. + +LTTng-tools:: + The https://github.com/lttng/lttng-tools[LTTng-tools] project, which + contains the various programs and libraries used to + <>. + +<>:: + The https://github.com/lttng/lttng-ust[LTTng-UST] project, which + contains libraries to instrument user applications. + +<>:: + A Java package provided by the LTTng-UST project to allow the + LTTng instrumentation of `java.util.logging` and Apache log4j 1.2 + logging statements. + +<>:: + A Python package provided by the LTTng-UST project to allow the + LTTng instrumentation of Python logging statements. + +<>:: + The event loss mode in which new event records overwrite older + event records when there's no sub-buffer space left to store them. + +<>:: + A buffering scheme in which each instrumented process has its own + sub-buffers for a given user space channel. + +<>:: + A buffering scheme in which all the processes of a Unix user share the + same sub-buffer for a given user space channel. + +<>:: + A process which is responsible for receiving the trace data sent by + a distant consumer daemon. + +ring buffer:: + A set of sub-buffers. + +<>:: + A process which receives control commands from you and orchestrates + the tracers and various LTTng daemons. + +<>:: + A copy of the current data of all the sub-buffers of a given tracing + session, saved as trace files. + +sub-buffer:: + One part of an LTTng ring buffer which contains event records. + +timestamp:: + The time information attached to an event when it is emitted. + +trace (_noun_):: + A set of files which are the concatenations of one or more + flushed sub-buffers. + +trace (_verb_):: + The action of recording the events emitted by an application + or by a system, or to initiate such recording by controlling + a tracer. + +Trace Compass:: + The http://tracecompass.org[Trace Compass] project and application. + +tracepoint:: + An instrumentation point using the tracepoint mechanism of the Linux + kernel or of LTTng-UST. + +tracepoint definition:: + The definition of a single tracepoint. + +tracepoint name:: + The name of a tracepoint. + +tracepoint provider:: + A set of functions providing tracepoints to an instrumented user + application. ++ +Not to be confused with a _tracepoint provider package_: many tracepoint +providers can exist within a tracepoint provider package. + +tracepoint provider package:: + One or more tracepoint providers compiled as an object file or as + a shared library. + +tracer:: + A software which records emitted events. + +<>:: + A namespace for event sources. + +tracing group:: + The Unix group in which a Unix user can be to be allowed to trace the + Linux kernel. + +<>:: + A stateful dialogue between you and a <>. + +user application:: + An application running in user space, as opposed to a Linux kernel + module, for example. diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc new file mode 100644 index 0000000..6828fb9 --- /dev/null +++ b/CONTRIBUTING.adoc @@ -0,0 +1,692 @@ +The LTTng Documentation: Contributor's guide +============================================ +Philippe Proulx +v1.0, 21 October 2016 + +This guide presents the structure and conventions of the LTTng +Documentation's source. Make sure you read it thoroughly before +you contribute a change. + + +[[principles]] +== Principles + +The LTTng Documentation exists to make the +https://lttng.org/[LTTng project] useable. +Without such a complete documentation consolidating the various +concepts, features, and procedures of LTTng-tools, LTTng-UST, and +LTTng-modules, most of the project would only be useable by +its authors. + +Why not simply read the man pages? While the LTTng man pages are +complementary to the LTTng Documentation, they remain formal +references: they lack the introductory quality and procedural user +guides found in this documentation. + +The core principle of the LTTng Documentation is to make the text as +cleverly organized, easy to follow, precise, and consistent as possible. +This involves keeping a high level of rigor as to such things as the +document's style, voice, grammar, and layout. + +Of course, those guidelines are not new to the technical writing realm, +and it would be bold to devise a brand new manual of style for the sole +existence of the LTTng Documentation when so many have already proven +their value. This is why the LTTng Documentation (especially starting +from version 2.7) does its best to follow the rules of the +https://en.wikipedia.org/wiki/Microsoft_Manual_of_Style[Microsoft Manual +of Style (4th edition)], a landmark work in its field. Of particular +interest in this book are: + +* Chapter 1, _Microsoft style and voice_. +* Chapter 6, _Procedures and technical content_. +* Chapter 7, _Practical issues of style_. +* Chapter 8, _Grammar_. +* Chapter 9, _Punctuation_. +* Chapter 11, _Acronyms and other abbreviations_. + +The <> section of this contributor's guide +adds terms to or overrides terms of Part 2, _Usage Dictionary_. + + +== Organization of the repository and format + +The Git repository of the LTTng Documentation contains all the official +versions of the documentation as separate source files. Each source file +is in its own +2.__x__+ directory, along with documentation resources +specific to this version of LTTng. You can find common source files in +the `common` directory. + +The source files are written in +http://www.methods.co.nz/asciidoc/[AsciiDoc], a rich, lightweight markup +language with all the blocks and inline elements needed to write +backend-agnostic content. + +Although the official LTTng website uses a custom script to generate +its own HTML version of the LTTng Documentation, it is possible to +generate an autonomous HTML preview (see +link:README.adoc[`README.adoc`]). The `asciidoc.html5.conf` AsciiDoc +configuration file sets a few attributes and implements the required +macros for this preview target. + + +== Validation script + +Before you submit any change, make sure that the check script passes. +This is a Python script which validates some elements of a specific +document. + +You need the following dependencies to run the check script: + +* http://www.methods.co.nz/asciidoc/[AsciiDoc] +* Python 3 +* http://lxml.de/[lxml] Python 3 package +* https://pypi.python.org/pypi/termcolor[termcolor] Python 3 package + +Run the check script: + +---- +python3 tools/check.py 2.7/lttng-docs-2.7.txt +---- + +Replace `2.7` by the version of the document to validate in the previous +command line. + + +== Style considerations + +As stated in <>, the LTTng Documentation follows +the Microsoft Manual of Style (4th edition). We encourage you to read +this work before contributing a major change to the document. + +You also need to consider the following rules, often specific to the +AsciiDoc format used to write the LTTng Documentation, when you edit +existing content or when you create new sections. + + +=== Macros + +* **Man page references**: Always use the +man:__command__(__section__)+ + macro you refer to a man page. The official online version of the + LTTng Documentation has hyperlinks to the correct online versions + of the LTTng man pages thanks to this macro. ++ +.Using the `man` macro. +==== +---- +See man:lttng-ust(3) for more details about ... +---- +==== + +* **File names**: Always use the +path:{__path__}+ + macro when you need to write a file name. ++ +.Using the `path` macro. +==== +---- +Load the configuration file path:{hello.lttng} directory by default. +---- +==== + +* **Directory names**: Always use the +dir:{__path__}+ + macro when you need to write a directory name. ++ +.Using the `dir` macro. +==== +---- +Traces are recorded to the dir:{~/lttng-traces} directory by default. +---- +==== + +* **Environment variable**: Always use the +env:__VAR__+ macro when + you need to write an environment variable name. +__VAR__+ must not + contain the shell's `$` prefix. ++ +.Using the `env` macro. +==== +---- +You can set the env:LTTNG_UST_DEBUG environment variable to `1` to +activate LTTng-UST's debug output. +---- +==== + +* **Command names**: Always use the +cmd:__cmd__+ + macro when you need to write a command name. ++ +.Using the `cmd` macro. +==== +---- +Run cmd:lttng-sessiond as the root user. +---- +==== + + +=== Dashes + +Em dashes can usually be written using `--` in AsciiDoc, but sometimes +the two hyphens are outputted as is, for example if the character at the +left or at the right of them is a punctuation. You can avoid this +by using the equivalent `—` HTML entity. + +.Using `--` for an em dash. +==== +---- +And yet, when the car was finally delivered--nearly three months after it +was ordered--she decided she no longer wanted it, leaving the dealer with +an oddly equipped car that would be difficult to sell. +---- +==== + +.Using `—` for an em dash. +==== +---- +As the frequency of recorded events increases--either because the event +throughput is actually higher or because you enabled more events than +usual—__event loss__ might be experienced. +---- +==== + + +=== Non-breaking spaces + +Always use a non-breaking space (`{nbsp}`, or HTML entity ` `) +between a quantity and its unit, or when it would be unnatural to have +two related words split on two lines. + +.Using a non-breaking space between a quantity and its unit. +==== +---- +The size of this file is 1039{nbsp}bytes. +---- +==== + +.Using a non-breaking space to avoid an odd line break. +==== +---- +This integer is displayed in base{nbsp}16. +---- +==== + + +=== Placeholders in inline code + +When a section of an inline code element is a placeholder, or variable, +use the `+` form of the element (instead of +`+), and place `__` +around the placeholder. + +.Using a placeholder in an inline code element. +==== +---- +Name your file +something.__sys__.c+, where +__sys__+ is your system name. +---- +==== + + +=== Listing blocks + +There are two types of listing blocks: + +* [[term-box]]**Terminal boxes** are used to show commands to be entered in a + terminal exclusively, that is, the output of commands must not be + written in terminal boxes. A terminal box is an AsciiDoc literal + block with the `term` role. ++ +.Using a terminal box. +==== +[listing] +.... +[role="term"] +---- +lttng create my-session +lttng enable-event --kernel --all +---- +.... +==== ++ +The output of a command line can be written using a simple, role-less +listing block. + +* **Source code boxes** are used to show syntax-highlighted snippets of + source code. A source code box is an AsciiDoc source code block. ++ +.Using a source code box. +==== +[listing] +.... +[source,c] +---- +#include + +int main(void) +{ + puts("Hello, World!"); + + return 0; +} +---- +.... +==== ++ +The second attribute is the name of the programming language for +proper syntax highlighting (for example, `c`, `python`, `make`, `java`). +This name must be known to http://pygments.org/[Pygments]. ++ +Always indent source code examples with 4{nbsp}spaces. + +In any listing block, the lines must not exceed 80 characters (prefer a +maximum of 72 characters). + + +=== Command-line options + +When specifying command-line options: + +* Always use the long form of the option (with two hyphens). +* Use a code element for the option name (backticks). +* Always follow the option name by the _option_ word. + +.Using a command-line option. +==== +---- +You can use the `lttng` tool's `--group` option to specify a custom +tracing group. +---- +==== + +In <>, always put `=` between the option name +and its argument, if any. + +.Terminal box. +==== +In this example, `provider:'sys_*'` is not the argument of the +`--userspace` option: it's the first positional argument, and +the `--userspace` option has no arguments. + +[listing] +.... +[role="term"] +---- +lttng enable-event --userspace provider:'sys_*' --filter='field < 23' + --exclude=sys_send,sys_block --loglevel=TRACE_INFO +---- +.... +==== + + +=== Procedures + +Use an ordered list to write a procedure. + +If a step is optional, prepend `**Optional**:` followed by a space to +the step's first sentence. Start the first sentence with a capital +letter. Do not use an optional step followed by a condition; use a +conditional step for this. + +If a step is conditional, put the condition (_If something_) in bold, +followed by a comma, followed by the step itself. + + +=== External links + +When using a hyperlink to an LTTng repository's file or directory, +link to the GitHub code browser. Make sure to link to the appropriate +Git branch (usually +stable-2.__x__+). You can use the `revision` +attribute in the URL. + +.Link to source file. +==== +---- +See the file +https://github.com/lttng/lttng-tools/blob/stable-{revision}/src/common/daemonize.c[path:{src/common/daemonize.c}] +for more details about [...] +---- +==== + + +=== "Since" sections + +If a whole section describes a feature which was introduced in LTTng 2.1 +or later, add the +since-2.__x__+ role to the section's heading, where ++__x__+ is the minor version of the LTTng release which introduced +the feature. + +.Section heading describing a feature introduced in LTTng 2.5. +==== +---- +[role="since-2.5"] +[[tracef]] +==== Use `tracef()` +---- +==== + + +[[terminology]] +== Terminology + +What follows is an official, partial list of technical terms used by the +LTTng Documentation. Other forms of those terms are _not_ permitted. For +example, do not write `use-case` or `filesystem`. + +Autotools:: + The GNU Autotools. ++ +Do not use _autotools_. + +Babeltrace:: + The Babeltrace project, which includes the `babeltrace` command, some + libraries, and Python bindings. ++ +Use +`babeltrace`+ to refer to the actual `babeltrace` command. + +Babeltrace Python bindings:: + The Python bindings of Babeltrace. ++ +The plural _bindings_ is important. + +Bash:: + The Bash shell. ++ +Do not use _bash_. + +buffering scheme:: + A layout of tracing buffers applied to a given channel. + +channel:: + An LTTng channel. + +CLI:: + Prefer expanding this acronym to _command-line interface_ in the text. + +clock:: + A reference of time for a tracer. ++ +Use _system time_ to refer to the date and time as seen by a user. + +command-line:: + Adjective version of _command line_: _command-line option_, + _command-line interface_. + +command-line interface:: + An interface in which the user enters command lines to instruct the + system what to do. ++ +Prefer using _command_ or _command-line tool_ to refer to a +specific command. + +command line:: + An actual line of command entered by the user in a terminal, at a + command prompt. ++ +Write _command-line_ when used as an adjective. + +consumer daemon:: + The LTTng consumer daemon. ++ +Do not use _consumerd_. ++ +Use +`lttng-consumerd`+ to refer to the consumer daemon +executable. + +domain:: + Do not use when referring to a _tracing domain_. + +event:: + Occurrence recognised by software, emitted by a tracer when specific + conditions are met, at a given time. An event _occurs_ at a specific + time, after which a tracer can record its payload. + +event loss mode:: + The mechanism by which event records of a given channel are lost + (not recorded) when there is no sub-buffer space left to store them. + +event name:: + The name of an event, which is also the name of the event record. + This is different from a _tracepoint name_, which is only the name + of the instrumentation point, not necessarily equal to the event + name. + +event record:: + Record, in a trace, of the payload of an event which occured. + +event rule:: + Set of conditions which must be satisfied for one or more events + to occur. The `lttng enable-event` command creates and enables + _event rules_, not _events_. + +file system:: + Contains directories, files, and links in an organized structure. ++ +Do not use _filesystem_ or _file-system_. + ++`java.util.logging`+:: + Even though the `--jul` command-line option is an acronym for this + term, there is no such thing as _Java Util Logging_. The only + correct form is the name of the Java package, + +`java.util.logging`+. + +instrumentation:: + The use of LTTng probes to make a software traceable. + +libc:: + Do not use. ++ +Use _the C standard library_ to refer to the standard library for +the C programming language, or _glibc_ to refer to the GNU C Library +specifically. + +log4j:: + LTTng-UST supports Java logging using Apache _log4j_, not Apache + Log4j 2. + +log level:: + Level of severity of a log statement. ++ +Do not hyphenate. + +kernel:: + In general, do not use _kernel_ to refer to the _Linux kernel_: use + the whole _Linux kernel_ term, because other operating system kernels + exist. Since the _L_ in _LTTng_ means _Linux_, it's okay to use _LTTng + kernel modules_. + +Linux Trace Toolkit: next generation:: + The expansion of the _LTTng_ acronym. ++ +The colon and the lowercase _n_ and _g_ are important. + +LTTng-analyses:: + The LTTng-analyses project. + +LTTng-modules:: + The LTTng-modules project. + +LTTng-tools:: + The LTTng-tools project. + +LTTng-UST:: + The LTTng-UST project. + +LTTng-UST Java agent:: +LTTng-UST Python agent:: + An LTTng user space agent. ++ +Do not use _Java LTTng-UST agent_ or _Python LTTng-UST agent_. + +LTTng Documentation:: + The name of this project. ++ +Do not use _LTTng documentation_. ++ +When referring to the project, the _the_ determiner can be lowercase: +_Welcome to the LTTng Documentation!_. + +LTTng live:: + The name of a communication protocol between Babeltrace and the + relay daemon which makes it possible to see events "live", + as they are received by the relay daemon. ++ +Do not hyphenate. + +the +`lttng`+ tool:: +the +`lttng`+ command line tool:: + The `lttng` command line tool. ++ +When _tool_ has been mentioned in the previous sentences, you can use ++`lttng`+ alone. + +Makefile:: + An input for the make tool. ++ +Do not use _makefile_ or _make file_. + +man page:: + Unix-style reference manual page. ++ +Do not hyphenate. + +per-process buffering:: + A buffering scheme in which each process has its own buffer for a + given user space channel. ++ +Do not use _per-PID buffering_. + +per-user buffering:: + A buffering scheme in which all the processes of a user share the same + buffer for a given user space channel. ++ +Do not use _per-UID buffering_. + +probe:: + An instrumentation point. ++ +Prefer _tracepoint_ when referring to a user space or Linux kernel +LTTng tracepoint. + +real-time clock:: + A clock which keeps track of the current time, including eventual + time corrections. ++ +Do not use _realtime clock_ or _real time clock_. + +relay daemon:: + The LTTng relay daemon. ++ +Do not use _relayd_. ++ +Use +`lttng-relayd`+ to refer to the relay daemon executable. + +root user:: + A superuser of a Linux system. ++ +Do not use +`root`+. + +session:: + Do not use when referring to a _tracing session_. + +session daemon:: + The LTTng session daemon. ++ +Do not use _sessiond_. ++ +Use +`lttng-sessiond`+ to refer to the session daemon +executable. + +snapshot:: + Copy of the current data of all the buffers of a given tracing + session, saved as a trace. + +sub-buffer:: + One part of an LTTng ring buffer. ++ +Do not use _subbuffer_ since it's harder to read with the two +contiguous b's. + +timestamp:: + Time information attached to an event when it is emitted. This is not + necessarily a _Unix timestamp_. ++ +Do not use _time stamp_. + +trace:: + As a verb: a user or a tracer can _trace_ an application. + +Trace Compass:: + The Trace Compass project and application. ++ +Do not hyphenate. Do not use _Trace compass_, _TraceCompass_, or +_Tracecompass_. + +tracepoint:: + An instrumentation point using the tracepoint mechanism of + the Linux kernel or of LTTng-UST. ++ +Do not use _trace point_ or _trace-point_. + +tracepoint definition:: + The definition of a single tracepoint. + +tracepoint name:: + The name of a _tracepoint_. ++ +Not to be confused with an _event name_. + +tracepoint provider:: + A set of functions providing tracepoints to an instrumented user + application. ++ +Not to be confused with a _tracepoint provider package_: many tracepoint +providers can exist within a tracepoint provider package. + +tracepoint provider package:: + One or more tracepoint providers compiled as an object file or as + a shared library. + +tracing domain:: + An LTTng tracing domain. ++ +Always use the complete _tracing domain_ term, not _domain_ alone, +unless _tracing domain_ has been used in the few preceding sentences. + +tracing group:: + The Unix group in which a user can be to be allowed to trace the + Linux kernel. ++ +Do not use _`tracing` group_, as the name of the tracing +group is configurable. + +tracing session:: + An LTTng tracing session. ++ +Always use the complete _tracing session_ term, not _session_ alone. + +Unix:: + Unix operating system or philosophy. ++ +Do not use _UNIX_. + +Unix epoch:: + Absolute reference of a real-time clock. ++ +Use the term as a proper noun: do not precede it with _the_. ++ +Do not use _Epoch_ alone. + +Unix timestamp:: + Timestamp represented as the number of seconds since Unix epoch. + +use case:: + According to Wikipedia: List of actions or event steps, typically + defining the interactions between a role and a system, to + achieve a goal. ++ +Do not hyphenate. + +user application:: + An application running in user space, as opposed to a Linux kernel + module, for example. ++ +Do not use _user space application_, as this is redundant. + +user space:: + User processes. ++ +Do not hyphenate. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 620851c..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,238 +0,0 @@ -Contributor's guide -=================== - -This guide presents the structure and conventions of the LTTng -Documentation's source. Make sure you read it thoroughly before -contributing a change. - - -Branches --------- - -The online documentation published at is always -compiled from the sources of this repository's latest stable branch. -The `master` branch contains the current documentation of the upcoming -LTTng release. - - -Structure of sources --------------------- - -`toc/docs.yml` is a YAML tree of all chapters, sections and subsections. -It indicates which unique ID is linked to which position in the -hierarchy and its true title. - -In the `contents` directory, the `preface.md` file is the preface contents. -Each chapter has its own directory (directory names are not significant). -Within those, `intro.md` files are partial introductions and then each -section has its own directory, and so on, unless a section has no -subsections, in which case all its contents is in a single Markdown file -named _more or less_ like its ID. - -Each Markdown file begins with a YAML front matter which only contains -the unique ID of this chapter/section: - -```yaml ---- -id: unique-id-goes-here ---- - -First paragraph goes here. -``` - -Editable image sources are placed in `images/src` and their rendered -equivalents are located in `images/export`. - -`tools/docs2json.py` is a Python 3 script which may be used to get -the graph of internal and external links and to find -typical errors in the whole documentation, like dead internal links. -It needs the -[`termcolor`](https://pypi.python.org/pypi/termcolor) Python 3 package. -Run it from the repository's root and ignore its standard output -to view the warnings and errors: - - tools/docs2json.py > /dev/null - - -Format of sources ------------------ - -The sources are made of a fusion of Markdown and HTML processed by -[kramdown](http://kramdown.gettalong.org/). Markdown is preferred, -HTML being only used for specific cases that need special formatting -not available using plain Markdown. The kramdown processor is clever -enough to support both languages in the same file, even in the same -paragraph! - - -### HTML specifics - -Here's a list of HTML blocks and inline code used throughout the -document. If you need to contribute, please use them when needed to -preserve the document's visual consistency. - - -#### Tip/note/warning/error blocks - -Tip/note block: - -```html -

PD58)$(DvF(vkPsWzZ_hLHkSZuYIA8A zv^i+=-P01Z`NeBoLrGly%V%)= z8V6qSj&a3RalPW{j}^{Z^~<3&RK;yMLf|Ys7Xq9;j!)l#M#qF2%Lp@7B~y>?0Iq40nX~=Ea@h1teCTlyzzpwi@dR;DQ^s%1JIWfXjb_RE zn_h^@eriJAfHyX X-za}k{)`hoy?yr|=$Nj8@WKE9H4bk= literal 0 HcmV?d00001 diff --git a/2.5/images/src/getting-started-lttng-gen-tp b/2.5/images/src/getting-started-lttng-gen-tp new file mode 100644 index 0000000000000000000000000000000000000000..d0e9f9e186487671905f3a79f00f02ee77077c83 GIT binary patch literal 2192 zcmV;B2ygcviwFP!000021MOYilbbjaf6re*Ij=jiBm_dqPExlIxqG;(-KxtyyJV1U zHW*wW&t&f5{`M6g6WbX40f>yfA~jP5Bf61L_wUz@TKV&oLD0E zlOT+jkCXp?{qo>VK7V@mYY_4e>SvkqwWaQev;6FFvXXN1VLE+&eg@G?#$}R%DBOZf zO#jcLh)-3c>EzQp%i0$ZaLMy))m1KK8qT*;STSFV$H|=g-CHqsAsG2Lb~RW2^?lVIG5&Q1m(`*Q=Y4 zt1cQ>T{^D1Fq>_XRHi(X$13MZ5(yrcT4lNw-SuQXkJJ=9)vX@AScFn0XP$q-qwJCn zl$U>4+qIUvOvB)`;U2VTk@6e{ay9#|X}C)1FPfx3g;_X{MAOrUu^deN%P`{WZ>R9y zyW4xthEiH9JOrL_gmXPSEVp4GvNO}{uuY4kRn=^IZq)1TE*+TiQVpyN6%l_CX(j%* z9ZXx*3$8rQ-Y6vVKZP%=?tO`pXMe?0X+2oKCEq7I+M!5C7(7mXhlk@+?~#(GT;I_E zZIU0e$aa2tz;?aM#}1=S`g~p&o~q~P@iG#X0s>f}13>2^QFJLkf$CZ}ogxzJnV+Qb zF)tXXSA~YcdmQ)d)pNK#M6X1+T*-FXxSQ;Gk_I9@_uvp9SRRNlh>(jqstaTF24;t* z-(dW{E9N`ed7X-El|0WHxb1o1zD7$qmu4vs!fkeH;BdzoyWv4_$O?``ca$u}cR4xZ z>T7MlE>J-9TARk(MUhZQ~Bp9c*5Lqkp7g!&5F5jPBtns_+yIfv1RR##5W1T+1t> zx(-vPZf8tg3(3#1$kl%oI|+CiC~oy{c7Ii`!akY;4L76eW^{NnKF(U!p6J>@sX5_j_qJsWa;op>v}O!Qp`);63Y`1| z>rOfL>enS9jAN3H7bYE<@O);Hj`x#vOibjUJ#xssmu+&6I&zN9P)hpKV*OC+?LjHA zM}kt%K&gRJ1EpG^bY-AaHzJdTX4zP^_|<*#MriBzFf6?3CP8?xZb_COwDaEVq^&M zX+lg}IqlVa_;_yg4RpWesCK;WoDE~jfFg+X2D*$DiWnsy2?nrKONe^|OyGSO`_VQK ze>*DRxFkO?rWkoHrfif9I8q@KFY$O9Tp&C|DvIg- zFw0mDhiq@LMZWsNE!JA#5wgncq(Q%~#xMqb-fb$fV1s-eX3g_I$6}F+lcediV z9-5M?cyRApg7UoBTDNhd-AF9O@g}<#S2CaaZ@G(l7aI`*bnm*WRFEIL?m8H_PO+H{ z)k>=S_3IK|?bSY#?9aTxi8cX<9US&eFz-s;S?WDsDE^_gMM?QmlZw~iPOkz#A=K!~GGmskC8w>X6K(L1Z9s%~0mL2RVw>}2!b?({E zhds9zUYd_B2KEf>y-nCtfu@1I!M}sF6sV#8#ilNx1zFKraQdo*V9(1FpXfE-qg|I7 zj_EtTgsLOYX(*+Lt@(?!%|!aQ^CuKK`GGwGv8{gVuU0E34FU|>cecP9-cG^VKz@o1 zp(JVpa$IHBhJCLv`S09F}J zhm`*5h70BUjod}~Q*iikp5DZFL{m<0%IQs_*d&U(B#IRzxF%6-3g@*H&L6BrE>G0Y SGUe+}@BRXj@3}fFi~sR literal 0 HcmV?d00001 diff --git a/2.5/images/src/lttng-live-relayd b/2.5/images/src/lttng-live-relayd new file mode 100644 index 0000000000000000000000000000000000000000..b4d553224763a39e8eaa83a530c6bc0cefe339a0 GIT binary patch literal 1856 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 +v2.5, 21 October 2016 + + +include::../common/copyright.txt[] + + +include::../common/warning-not-maintained.txt[] + + +include::../common/welcome.txt[] + + +include::../common/audience.txt[] + + +[[chapters]] +=== Chapter descriptions + +What follows is a list of brief descriptions of this documentation's +chapters. The latter are ordered in such a way as to make the reading +as linear as possible. + +. <> explains the + rudiments of software tracing and the rationale behind the + LTTng project. +. <> is divided into + sections describing the steps needed to get a working installation + of LTTng packages for common Linux distributions and from its + source. +. <> is a very concise guide to + get started quickly with LTTng kernel and user space tracing. This + chapter is recommended if you're new to LTTng or software tracing + in general. +. <> deals with some + core concepts and components of the LTTng suite. Understanding + those is important since the next chapter assumes you're familiar + with them. +. <> is a complete user guide of the + LTTng project. It shows in great details how to instrument user + applications and the Linux kernel, how to control tracing sessions + using the `lttng` command line tool and miscellaneous practical use + cases. +. <> contains references of LTTng components, + like links to online manpages and various APIs. + +We recommend that you read the above chapters in this order, although +some of them may be skipped depending on your situation. You may skip +<> if you're familiar with tracing +and LTTng. Also, you may jump over <> +if LTTng is already properly installed on your target system. + + +include::../common/convention.txt[] + + +include::../common/acknowledgements.txt[] + + +[[whats-new]] +== What's new in LTTng {revision}? + +The **LTTng {revision}** toolchain introduces many interesting features, +some of them which have been requested by users many times. + +It is now possible to +<>. +Sessions are saved to and loaded from XML files located by default in a +subdirectory of the user's home directory. LTTng daemons are also +configurable by configuration files as of LTTng-tools {revision}. This version +also makes it possible to load user-defined kernel probes with the new +session daemon's `--kmod-probes` option (or using the +`LTTNG_KMOD_PROBES` environment variable). + +<> is a new instrumentation facility in LTTng-UST {revision} +which makes it possible to insert `printf()`-like tracepoints in C/$$C++$$ +code for quick debugging. LTTng-UST {revision} also adds support for perf PMU +counters in user space on the x86 architecture +(see <>). + +As of LTTng-modules {revision}, a new +<> +is made available, making tracing Bash scripts, for example, much more +easier (just `echo` whatever you need to record to path:{/proc/lttng-logger} +while tracing is active). On the kernel side, some tracepoints are +added: state dumps of block devices, file descriptors, and file modes, +as well as http://en.wikipedia.org/wiki/Video4Linux[V4L2] events. Linux +3.15 is now officially supported, and system call tracing is now +possible on the MIPS32 architecture. + +To learn more about the new features of LTTng {revision}, see +http://lttng.org/blog/2014/08/04/lttng-toolchain-2-5-0-is-out/[this +release announcement]. + + +[[nuts-and-bolts]] +== Nuts and bolts + +What is LTTng? As its name suggests, the _Linux Trace Toolkit: next +generation_ is a modern toolkit for tracing Linux systems and +applications. So your first question might rather be: **what is +tracing?** + +As the history of software engineering progressed and led to what +we now take for granted--complex, numerous and +interdependent software applications running in parallel on +sophisticated operating systems like Linux--the authors of such +components, or software developers, began feeling a natural +urge of having tools to ensure the robustness and good performance +of their masterpieces. + +One major achievement in this field is, inarguably, the +https://www.gnu.org/software/gdb/[GNU debugger (GDB)], which is an +essential tool for developers to find and fix bugs. But even the best +debugger won't help make your software run faster, and nowadays, faster +software means either more work done by the same hardware, or cheaper +hardware for the same work. + +A _profiler_ is often the tool of choice to identify performance +bottlenecks. Profiling is suitable to identify _where_ performance is +lost in a given software; the profiler outputs a profile, a statistical +summary of observed events, which you may use to know which functions +took the most time to execute. However, a profiler won't report _why_ +some identified functions are the bottleneck. Also, bottlenecks might +only occur when specific conditions are met. For a thorough +investigation of software performance issues, a history of execution, +with historical values of chosen variables, is essential. This is where +tracing comes in handy. + +_Tracing_ is a technique used to understand what goes on in a running +software system. The software used for tracing is called a _tracer_, +which is conceptually similar to a tape recorder. When recording, +specific points placed in the software source code generate events that +are saved on a giant tape: a _trace_ file. Both user applications and +the operating system may be traced at the same time, opening the +possibility of resolving a wide range of problems that are otherwise +extremely challenging. + +Tracing is often compared to _logging_. However, tracers and loggers are +two different types of tools, serving two different purposes. Tracers +are designed to record much lower-level events that occur much more +frequently than log messages, often in the thousands per second range, +with very little execution overhead. Logging is more appropriate for +very high-level analysis of less frequent events: user accesses, +exceptional conditions (e.g., errors, warnings), database transactions, +instant messaging communications, etc. More formally, logging is one of +several use cases that can be accomplished with tracing. + +The list of recorded events inside a trace file may be read manually +like a log file for the maximum level of detail, but it is generally +much more interesting to perform application-specific analyses to +produce reduced statistics and graphs that are useful to resolve a given +problem. Trace viewers and analysers are specialized tools which achieve +this. + +So, in the end, this is what LTTng is: a powerful, open source set of +tools to trace the Linux kernel and user applications. LTTng is composed +of several components actively maintained and developed by its +http://lttng.org/community/#where[community]. + +Excluding proprietary solutions, a few competing software tracers exist +for Linux. +https://www.kernel.org/doc/Documentation/trace/ftrace.txt[ftrace] is the +de facto function tracer of the Linux kernel. +http://linux.die.net/man/1/strace[strace] is able to record all system +calls made by a user process. +https://sourceware.org/systemtap/[SystemTap] is a Linux kernel and user +space tracer which uses custom user scripts to produce plain text +traces. http://www.sysdig.org/[sysdig] also uses scripts, written in +Lua, to trace and analyze the Linux kernel. + +The main distinctive features of LTTng is that it produces correlated +kernel and user space traces, as well as doing so with the lowest +overhead amongst other solutions. It produces trace files in the +http://www.efficios.com/ctf[CTF] format, an optimized file format for +production and analyses of multi-gigabyte data. LTTng is the result of +close to 10 years of active development by a community of passionate +developers. It is currently available on some major desktop, server, and +embedded Linux distributions. + +The main interface for tracing control is a single command line tool +named `lttng`. The latter can create several tracing sessions, +enable/disable events on the fly, filter them efficiently with custom +user expressions, start/stop tracing and do much more. Traces can be +recorded on disk or sent over the network, kept totally or partially, +and viewed once tracing is inactive or in real-time. + +<> and start tracing! + + +[[installing-lttng]] +== Installing LTTng + +**LTTng** is a set of software components which interact to allow +instrumenting the Linux kernel and user applications and controlling +tracing sessions (starting/stopping tracing, enabling/disabling events, +etc.). Those components are bundled into the following packages: + +LTTng-tools:: + Libraries and command line interface to control tracing sessions. + +LTTng-modules:: + Linux kernel modules allowing Linux to be traced using LTTng. + +LTTng-UST:: + User space tracing library. + +Most distributions mark the LTTng-modules and LTTng-UST packages as +optional. In the following sections, we always provide the steps to +install all three, but be aware that LTTng-modules is only required if +you intend to trace the Linux kernel and LTTng-UST is only required if +you intend to trace user space applications. + +This chapter shows how to install the above packages on a Linux system. +The easiest way is to use the package manager of the system's +distribution (<> or +<>). Support is also available for +<>, such as Red Hat +Enterprise Linux (RHEL) and SUSE Linux Enterprise Server (SLES). +Otherwise, you can +<>. + + +[[desktop-distributions]] +=== Desktop distributions + +Official LTTng {revision} packages are available for <> and +<>. + +More recent versions of LTTng are available for Fedora, openSUSE, +as well as Arch Linux. + +Should any issue arise when following the procedures below, please +inform the http://lttng.org/community[community] about it. + + +[[ubuntu]] +==== Ubuntu + +LTTng {revision} is packaged in Ubuntu 15.04 _Vivid Vervet_. For other +releases of Ubuntu, you need to build and install LTTng +<>. Ubuntu 15.10 _Wily Werewolf_ +ships with link:/docs/v2.6/[LTTng 2.6]. + +To install LTTng {revision} from the official Ubuntu repositories, +simply use `apt-get`: + +[role="term"] +---- +sudo apt-get install lttng-tools +sudo apt-get install lttng-modules-dkms +sudo apt-get install liblttng-ust-dev +---- + + +[[debian]] +==== Debian + +Debian "jessie" has official packages of LTTng {revision}: + +[role="term"] +---- +sudo apt-get install lttng-tools +sudo apt-get install lttng-modules-dkms +sudo apt-get install liblttng-ust-dev +---- + + +[[embedded-distributions]] +=== Embedded distributions + +Some developers may be interested in tracing the Linux kernel and user space +applications running on embedded systems. LTTng is packaged by two popular +embedded Linux distributions: <> and +<>. + + +[[buildroot]] +==== Buildroot + +LTTng {revision} packages in Buildroot 2014.11 and 2015.02 are named +`lttng-tools`, `lttng-modules`, and `lttng-libust`. + +To enable them, start the Buildroot configuration menu as usual: + +[role="term"] +---- +make menuconfig +---- + +In: + +* _Kernel_: make sure _Linux kernel_ is enabled +* _Toolchain_: make sure the following options are enabled: +** _Enable large file (files > 2GB) support_ +** _Enable WCHAR support_ + +In _Target packages_/_Debugging, profiling and benchmark_, enable +_lttng-modules_ and _lttng-tools_. In +_Target packages_/_Libraries_/_Other_, enable _lttng-libust_. + + +[[oe-yocto]] +==== OpenEmbedded/Yocto + +LTTng {revision} recipes are available in the `openembedded-core` layer of +OpenEmbedded from August 15th, 2014 to February 8th, 2015 under the +following names: + +* `lttng-tools` +* `lttng-modules` +* `lttng-ust` + +Using BitBake, the simplest way to include LTTng recipes in your +target image is to add them to `IMAGE_INSTALL_append` in +path:{conf/local.conf}: + +---- +IMAGE_INSTALL_append = " lttng-tools lttng-modules lttng-ust" +---- + +If you're using Hob, click _Edit image recipe_ once you have selected +a machine and an image recipe. Then, in the _All recipes_ tab, search +for `lttng` and you should find and be able to include the three LTTng +recipes. + + +[[enterprise-distributions]] +=== Enterprise distributions (RHEL, SLES) + +To install LTTng on enterprise Linux distributions +(such as RHEL and SLES), please see +http://packages.efficios.com/[EfficiOS Enterprise Packages]. + + +[[building-from-source]] +=== Building from source + +As <>, LTTng is shipped as three +packages: LTTng-tools, LTTng-modules and LTTng-UST. LTTng-tools contains +everything needed to control tracing sessions, while LTTng-modules is +only needed for Linux kernel tracing and LTTng-UST is only needed for +user space tracing. + +The tarballs are available in the +http://lttng.org/download#build-from-source[Download section] +of the LTTng website. + +Please refer to the path:{README.md} files provided by each package to +properly build and install them. + +TIP: The aforementioned path:{README.md} files are rendered as +rich text when https://github.com/lttng[viewed on GitHub]. + + +[[getting-started]] +== Getting started with LTTng + +This is a small guide to get started quickly with LTTng kernel and user +space tracing. For intermediate to advanced use cases and a more +thorough understanding of LTTng, see <> and +<>. + +Before reading this guide, make sure LTTng +<>. You will at least need LTTng-tools. +Also install LTTng-modules for +<> +and LTTng-UST for <>. When your traces are finally written and +complete, the +<> +section of this chapter will help you analyze your tracepoint +events to investigate. + + +[[tracing-the-linux-kernel]] +=== Tracing the Linux kernel + +Make sure LTTng-tools and LTTng-modules packages +<>. + +Since you're about to trace the Linux kernel itself, let's look at the +available kernel events using the `lttng` tool, which has a +Git-like command line structure: + +[role="term"] +---- +lttng list --kernel +---- + +Before tracing, you need to create a session: + +[role="term"] +---- +sudo lttng create my-session +---- + +TIP: You can avoid using `sudo` in the previous and following commands +if your user is a member of the <>. + +`my-session` is the tracing session name and could be anything you +like. `auto` will be used if omitted. + +Let's now enable some events for this session: + +[role="term"] +---- +sudo lttng enable-event --kernel sched_switch,sched_process_fork +---- + +or you might want to simply enable all available kernel events (beware +that trace files will grow rapidly when doing this): + +[role="term"] +---- +sudo lttng enable-event --kernel --all +---- + +Start tracing: + +[role="term"] +---- +sudo lttng start +---- + +By default, traces are saved in ++\~/lttng-traces/__name__-__date__-__time__+, +where +__name__+ is the session name. + +When you're done tracing: + +[role="term"] +---- +sudo lttng stop +sudo lttng destroy +---- + +Although `destroy` looks scary here, it doesn't actually destroy the +outputted trace files: it only destroys the tracing session. + +What's next? Have a look at +<> +to view and analyze the trace you just recorded. + + +[[tracing-your-own-user-application]] +=== Tracing your own user application + +The previous section helped you create a trace out of Linux kernel +events. This section steps you through a simple example showing you how +to trace a _Hello world_ program written in C. + +Make sure LTTng-tools and LTTng-UST packages +<>. + +Tracing is just like having `printf()` calls at specific locations of +your source code, albeit LTTng is much faster and more flexible than +`printf()`. In the LTTng realm, **`tracepoint()`** is analogous to +`printf()`. + +Unlike `printf()`, though, `tracepoint()` does not use a format string to +know the types of its arguments: the formats of all tracepoints must be +defined before using them. So before even writing our _Hello world_ program, +we need to define the format of our tracepoint. This is done by writing a +**template file**, with a name usually ending +with the `.tp` extension (for **t**race**p**oint), +which the `lttng-gen-tp` tool (shipped with LTTng-UST) will use to generate +an object file (along with a `.c` file) and a header to be +included in our application source code. + +Here's the whole flow: + +[role="img-80"] +.Build workflow for LTTng application tracing. +image::lttng-lttng-gen-tp.png[] + +The template file format is a list of tracepoint definitions +and other optional definition entries which we will skip for +this quickstart. Each tracepoint is defined using the +`TRACEPOINT_EVENT()` macro. For each tracepoint, you must provide: + +* a **provider name**, which is the "scope" of this tracepoint (this usually + includes the company and project names) +* a **tracepoint name** +* a **list of arguments** for the eventual `tracepoint()` call, + each item being: +** the argument C type +** the argument name +* a **list of fields**, which will be the actual fields of the recorded events + for this tracepoint + +Here's a simple tracepoint definition example with two arguments: an integer +and a string: + +[source,c] +---- +TRACEPOINT_EVENT( + hello_world, + my_first_tracepoint, + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) +---- + +The exact syntax is well explained in the +<> instrumenting guide of the +<> chapter, as well as in man:lttng-ust(3). + +Save the above snippet as path:{hello-tp.tp} and run: + +[role="term"] +---- +lttng-gen-tp hello-tp.tp +---- + +The following files will be created next to path:{hello-tp.tp}: + +* path:{hello-tp.c} +* path:{hello-tp.o} +* path:{hello-tp.h} + +path:{hello-tp.o} is the compiled object file of path:{hello-tp.c}. + +Now, by including path:{hello-tp.h} in your own application, you may use the +tracepoint defined above by properly refering to it when calling +`tracepoint()`: + +[source,c] +---- +#include +#include "hello-tp.h" + +int main(int argc, char* argv[]) +{ + int x; + + puts("Hello, World!\nPress Enter to continue..."); + + /* The following getchar() call is only placed here for the purpose + * of this demonstration, for pausing the application in order for + * you to have time to list its events. It's not needed otherwise. + */ + getchar(); + + /* A tracepoint() call. Arguments, as defined in hello-tp.tp: + * + * 1st: provider name (always) + * 2nd: tracepoint name (always) + * 3rd: my_integer_arg (first user-defined argument) + * 4th: my_string_arg (second user-defined argument) + * + * Notice the provider and tracepoint names are NOT strings; + * they are in fact parts of variables created by macros in + * hello-tp.h. + */ + tracepoint(hello_world, my_first_tracepoint, 23, "hi there!"); + + for (x = 0; x < argc; ++x) { + tracepoint(hello_world, my_first_tracepoint, x, argv[x]); + } + + puts("Quitting now!"); + + tracepoint(hello_world, my_first_tracepoint, x * x, "x^2"); + + return 0; +} +---- + +Save this as path:{hello.c}, next to path:{hello-tp.tp}. + +Notice path:{hello-tp.h}, the header file generated by path:{lttng-gen-tp} from +our template file path:{hello-tp.tp}, is included by path:{hello.c}. + +You are now ready to compile the application with LTTng-UST support: + +[role="term"] +---- +gcc -o hello hello.c hello-tp.o -llttng-ust -ldl +---- + +If you followed the +<> section, the +following steps will look familiar. + +First, run the application with a few arguments: + +[role="term"] +---- +./hello world and beyond +---- + +You should see + +---- +Hello, World! +Press Enter to continue... +---- + +Use the `lttng` tool to list all available user space events: + +[role="term"] +---- +lttng list --userspace +---- + +You should see the `hello_world:my_first_tracepoint` tracepoint listed +under the `./hello` process. + +Create a tracing session: + +[role="term"] +---- +lttng create my-userspace-session +---- + +Enable the `hello_world:my_first_tracepoint` tracepoint: + +[role="term"] +---- +lttng enable-event --userspace hello_world:my_first_tracepoint +---- + +Start tracing: + +[role="term"] +---- +lttng start +---- + +Go back to the running path:{hello} application and press Enter. All +`tracepoint()` calls will be executed and the program will finally exit. + +Stop tracing: + +[role="term"] +---- +lttng stop +---- + +Done! You may use `lttng view` to list the recorded events. This command +starts +http://www.efficios.com/babeltrace[`babeltrace`] +in the background, if it is installed: + +[role="term"] +---- +lttng view +---- + +should output something like: + +---- +[18:10:27.684304496] (+?.?????????) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "hi there!", my_integer_field = 23 } +[18:10:27.684338440] (+0.000033944) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "./hello", my_integer_field = 0 } +[18:10:27.684340692] (+0.000002252) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "world", my_integer_field = 1 } +[18:10:27.684342616] (+0.000001924) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "and", my_integer_field = 2 } +[18:10:27.684343518] (+0.000000902) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "beyond", my_integer_field = 3 } +[18:10:27.684357978] (+0.000014460) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "x^2", my_integer_field = 16 } +---- + +When you're done, you may destroy the tracing session, which does _not_ +destroy the generated trace files, leaving them available for further +analysis: + +[role="term"] +---- +lttng destroy my-userspace-session +---- + +The next section presents other alternatives to view and analyze your +LTTng traces. + + +[[viewing-and-analyzing-your-traces]] +=== Viewing and analyzing your traces + +This section describes how to visualize the data gathered after tracing +the Linux kernel or a user space application. + +Many ways exist to read your LTTng traces: + +* **`babeltrace`** is a command line utility which converts trace formats; + it supports the format used by LTTng, + CTF, as well as a basic + text output which may be ++grep++ed. The `babeltrace` command is + part of the http://www.efficios.com/babeltrace[Babeltrace] project. +* Babeltrace also includes a **Python binding** so that you may + easily open and read an LTTng trace with your own script, benefiting + from the power of Python. +* **http://projects.eclipse.org/projects/tools.tracecompass[Trace Compass]** + is an Eclipse plugin used to visualize and analyze various types of + traces, including LTTng's. It also comes as a standalone application + and can be downloaded from + http://projects.eclipse.org/projects/tools.tracecompass/downloads[here]. + +LTTng trace files are usually recorded in the path:{~/lttng-traces} directory. +Let's now view the trace and perform a basic analysis using +`babeltrace`. + +The simplest way to list all the recorded events of a trace is to pass its +path to `babeltrace` with no options: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-session +---- + +`babeltrace` will find all traces within the given path recursively and +output all their events, merging them intelligently. + +Listing all the system calls of a Linux kernel trace with their arguments is +easy with `babeltrace` and `grep`: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-kernel-session | grep sys_ +---- + +Counting events is also straightforward: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-kernel-session | grep sys_read | wc --lines +---- + +The text output of `babeltrace` is useful for isolating events by simple +matching using `grep` and similar utilities. However, more elaborate filters +such as keeping only events with a field value falling within a specific range +are not trivial to write using a shell. Moreover, reductions and even the +most basic computations involving multiple events are virtually impossible +to implement. + +Fortunately, Babeltrace ships with a Python 3 binding which makes it +really easy to read the events of an LTTng trace sequentially and compute +the desired information. + +Here's a simple example using the Babeltrace Python binding. The following +script accepts an LTTng Linux kernel trace path as its first argument and +outputs the short names of the top 5 running processes on CPU 0 during the +whole trace: + +[source,python] +---- +import sys +from collections import Counter +import babeltrace + + +def top5proc(): + if len(sys.argv) != 2: + msg = 'Usage: python {} TRACEPATH'.format(sys.argv[0]) + raise ValueError(msg) + + # a trace collection holds one to many traces + col = babeltrace.TraceCollection() + + # add the trace provided by the user + # (LTTng traces always have the 'ctf' format) + if col.add_trace(sys.argv[1], 'ctf') is None: + raise RuntimeError('Cannot add trace') + + # this counter dict will hold execution times: + # + # task command name -> total execution time (ns) + exec_times = Counter() + + # this holds the last `sched_switch` timestamp + last_ts = None + + # iterate events + for event in col.events: + # keep only `sched_switch` events + if event.name != 'sched_switch': + continue + + # keep only events which happened on CPU 0 + if event['cpu_id'] != 0: + continue + + # event timestamp + cur_ts = event.timestamp + + if last_ts is None: + # we start here + last_ts = cur_ts + + # previous task command (short) name + prev_comm = event['prev_comm'] + + # initialize entry in our dict if not yet done + if prev_comm not in exec_times: + exec_times[prev_comm] = 0 + + # compute previous command execution time + diff = cur_ts - last_ts + + # update execution time of this command + exec_times[prev_comm] += diff + + # update last timestamp + last_ts = cur_ts + + # display top 10 + for name, ns in exec_times.most_common(5): + s = ns / 1000000000 + print('{:20}{} s'.format(name, s)) + + +if __name__ == '__main__': + top5proc() +---- + +Save this script as path:{top5proc.py} and run it with Python 3, providing the +path to an LTTng Linux kernel trace as the first argument: + +[role="term"] +---- +python3 top5proc.py ~/lttng-sessions/my-session-.../kernel +---- + +Make sure the path you provide is the directory containing actual trace +files (path:{channel0_0}, path:{metadata}, etc.): the `babeltrace` utility +recurses directories, but the Python binding does not. + +Here's an example of output: + +---- +swapper/0 48.607245889 s +chromium 7.192738188 s +pavucontrol 0.709894415 s +Compositor 0.660867933 s +Xorg.bin 0.616753786 s +---- + +Note that `swapper/0` is the "idle" process of CPU 0 on Linux; since we +weren't using the CPU that much when tracing, its first position in the list +makes sense. + + +[[understanding-lttng]] +== Understanding LTTng + +If you're going to use LTTng in any serious way, it is fundamental that +you become familiar with its core concepts. Technical terms like +_tracing sessions_, _domains_, _channels_ and _events_ are used over +and over in the <> chapter, +and it is assumed that you understand what they mean when reading it. + +LTTng, as you already know, is a _toolkit_. It would be wrong +to call it a simple _tool_ since it is composed of multiple interacting +components. This chapter also describes the latter, providing details +about their respective roles and how they connect together to form +the current LTTng ecosystem. + + +[[core-concepts]] +=== Core concepts + +This section explains the various elementary concepts a user has to deal +with when using LTTng. They are: + +* <> +* <> +* <> +* <> + + +[[tracing-session]] +==== Tracing session + +A _tracing session_ is--like any session--a container of +state. Anything that is done when tracing using LTTng happens in the +scope of a tracing session. In this regard, it is analogous to a bank +website's session: you can't interact online with your bank account +unless you are logged in a session, except for reading a few static +webpages (LTTng, too, can report some static information that does not +need a created tracing session). + +A tracing session holds the following attributes and objects (some of +which are described in the following sections): + +* a name +* the tracing state (tracing started or stopped) +* the trace data output path/URL (local path or sent over the network) +* a mode (normal, snapshot or live) +* the snapshot output paths/URLs (if applicable) +* for each <>, a list of <> +* for each channel: +** a name +** the channel state (enabled or disabled) +** its parameters (event loss mode, sub-buffers size and count, + timer periods, output type, trace files size and count, etc.) +** a list of added context information +** a list of <> +* for each event: +** its state (enabled or disabled) +** a list of instrumentation points (tracepoints, system calls, + dynamic probes, etc.) +** associated log levels +** a filter expression + +All this information is completely isolated between tracing sessions. + +Conceptually, a tracing session is a per-user object; the +<> section shows how this is actually +implemented. Any user may create as many concurrent tracing sessions +as desired. As you can see in the list above, even the tracing state +is a per-tracing session attribute, so that you may trace your target +system/application in a given tracing session with a specific +configuration while another one stays inactive. + +The trace data generated in a tracing session may be either saved +to disk, sent over the network or not saved at all (in which case +snapshots may still be saved to disk or sent to a remote machine). + + +[[domain]] +==== Domain + +A tracing _domain_ is the official term the LTTng project uses to +designate a tracer category. + +There are currently three known domains: + +* Linux kernel +* user space +* `java.util.logging` (JUL) + +Different tracers expose common features in their own interfaces, but, +from a user's perspective, you still need to target a specific type of +tracer to perform some actions. For example, since both kernel and user +space tracers support named tracepoints (probes manually inserted in +source code), you need to specify which one is concerned when enabling +an event because both domains could have existing events with the same +name. + +Some features are not available in all domains. Filtering enabled +events using custom expressions, for example, is currently not +supported in the kernel domain, but support could be added in the +future. + + +[[channel]] +==== Channel + +A _channel_ is a set of events with specific parameters and potential +added context information. Channels have unique names per domain within +a tracing session. A given event is always registered to at least one +channel; having an enabled event in two channels will produce a trace +with this event recorded twice everytime it occurs. + +Channels may be individually enabled or disabled. Occurring events of +a disabled channel will never make it to recorded events. + +The fundamental role of a channel is to keep a shared ring buffer, where +events are eventually recorded by the tracer and consumed by a consumer +daemon. This internal ring buffer is divided into many sub-buffers of +equal size. + +Channels, when created, may be fine-tuned thanks to a few parameters, +many of them related to sub-buffers. The following subsections explain +what those parameters are and in which situations you should manually +adjust them. + + +[[channel-overwrite-mode-vs-discard-mode]] +===== Overwrite and discard event loss modes + +As previously mentioned, a channel's ring buffer is divided into many +equally sized sub-buffers. + +As events occur, they are serialized as trace data into a specific +sub-buffer (yellow arc in the following animation) until it is full: +when this happens, the sub-buffer is marked as consumable (red) and +another, _empty_ (white) sub-buffer starts receiving the following +events. The marked sub-buffer will be consumed eventually by a consumer +daemon (returns to white). + +[NOTE] +[role="docsvg-channel-subbuf-anim"] +==== +{note-no-anim} +==== + +In an ideal world, sub-buffers are consumed faster than filled, like it +is the case above. In the real world, however, all sub-buffers could be +full at some point, leaving no space to record the following events. By +design, LTTng is a _non-blocking_ tracer: when no empty sub-buffer +exists, losing events is acceptable when the alternative would be to +cause substantial delays in the instrumented application's execution. +LTTng privileges performance over integrity, aiming at perturbing the +traced system as little as possible in order to make tracing of subtle +race conditions and rare interrupt cascades possible. + +When it comes to losing events because no empty sub-buffer is available, +the channel's _event loss mode_ determines what to do amongst: + +Discard:: + Drop the newest events until a sub-buffer is released. + +Overwrite:: + Clear the sub-buffer containing the oldest recorded + events and start recording the newest events there. This mode is + sometimes called _flight recorder mode_ because it behaves like a + flight recorder: always keep a fixed amount of the latest data. + +Which mechanism you should choose depends on your context: prioritize +the newest or the oldest events in the ring buffer? + +Beware that, in overwrite mode, a whole sub-buffer is abandoned as soon +as a new event doesn't find an empty sub-buffer, whereas in discard +mode, only the event that doesn't fit is discarded. + +Also note that a count of lost events will be incremented and saved in +the trace itself when an event is lost in discard mode, whereas no +information is kept when a sub-buffer gets overwritten before being +committed. + +There are known ways to decrease your probability of losing events. The +next section shows how tuning the sub-buffers count and size can be +used to virtually stop losing events. + + +[[channel-subbuf-size-vs-subbuf-count]] +===== Sub-buffers count and size + +For each channel, an LTTng user may set its number of sub-buffers and +their size. + +Note that there is a noticeable tracer's CPU overhead introduced when +switching sub-buffers (marking a full one as consumable and switching +to an empty one for the following events to be recorded). Knowing this, +the following list presents a few practical situations along with how +to configure sub-buffers for them: + +High event throughput:: + In general, prefer bigger sub-buffers to + lower the risk of losing events. Having bigger sub-buffers will + also ensure a lower sub-buffer switching frequency. The number of + sub-buffers is only meaningful if the channel is in overwrite mode: + in this case, if a sub-buffer overwrite happens, you will still have + the other sub-buffers left unaltered. + +Low event throughput:: + In general, prefer smaller sub-buffers + since the risk of losing events is already low. Since events + happen less frequently, the sub-buffer switching frequency should + remain low and thus the tracer's overhead should not be a problem. + +Low memory system:: + If your target system has a low memory + limit, prefer fewer first, then smaller sub-buffers. Even if the + system is limited in memory, you want to keep the sub-buffers as + big as possible to avoid a high sub-buffer switching frequency. + +You should know that LTTng uses CTF as its trace format, which means +event data is very compact. For example, the average LTTng Linux kernel +event weights about 32{nbsp}bytes. A sub-buffer size of 1{nbsp}MiB is +thus considered big. + +The previous situations highlight the major trade-off between a few big +sub-buffers and more, smaller sub-buffers: sub-buffer switching +frequency vs. how much data is lost in overwrite mode. Assuming a +constant event throughput and using the overwrite mode, the two +following configurations have the same ring buffer total size: + +[NOTE] +[role="docsvg-channel-subbuf-size-vs-count-anim"] +==== +{note-no-anim} +==== + +* **2 sub-buffers of 4 MiB each** lead to a very low sub-buffer + switching frequency, but if a sub-buffer overwrite happens, half of + the recorded events so far (4{nbsp}MiB) are definitely lost. +* **8 sub-buffers of 1 MiB each** lead to 4{nbsp}times the tracer's + overhead as the previous configuration, but if a sub-buffer + overwrite happens, only the eighth of events recorded so far are + definitely lost. + +In discard mode, the sub-buffers count parameter is pointless: use two +sub-buffers and set their size according to the requirements of your +situation. + + +[[channel-switch-timer]] +===== Switch timer + +The _switch timer_ period is another important configurable feature of +channels to ensure periodic sub-buffer flushing. + +When the _switch timer_ fires, a sub-buffer switch happens. This timer +may be used to ensure that event data is consumed and committed to +trace files periodically in case of a low event throughput: + +[NOTE] +[role="docsvg-channel-switch-timer"] +==== +{note-no-anim} +==== + +It's also convenient when big sub-buffers are used to cope with +sporadic high event throughput, even if the throughput is normally +lower. + + +[[channel-buffering-schemes]] +===== Buffering schemes + +In the user space tracing domain, two **buffering schemes** are +available when creating a channel: + +Per-PID buffering:: + Keep one ring buffer per process. + +Per-UID buffering:: + Keep one ring buffer for all processes of a single user. + +The per-PID buffering scheme will consume more memory than the per-UID +option if more than one process is instrumented for LTTng-UST. However, +per-PID buffering ensures that one process having a high event +throughput won't fill all the shared sub-buffers, only its own. + +The Linux kernel tracing domain only has one available buffering scheme +which is to use a single ring buffer for the whole system. + + +[[event]] +==== Event + +An _event_, in LTTng's realm, is a term often used metonymically, +having multiple definitions depending on the context: + +. When tracing, an event is a _point in space-time_. Space, in a + tracing context, is the set of all executable positions of a + compiled application by a logical processor. When a program is + executed by a processor and some instrumentation point, or + _probe_, is encountered, an event occurs. This event is accompanied + by some contextual payload (values of specific variables at this + point of execution) which may or may not be recorded. +. In the context of a recorded trace file, the term _event_ implies + a _recorded event_. +. When configuring a tracing session, _enabled events_ refer to + specific rules which could lead to the transfer of actual + occurring events (1) to recorded events (2). + +The whole <> section focuses on the +third definition. An event is always registered to _one or more_ +channels and may be enabled or disabled at will per channel. A disabled +event will never lead to a recorded event, even if its channel +is enabled. + +An event (3) is enabled with a few conditions that must _all_ be met +when an event (1) happens in order to generate a recorded event (2): + +. A _probe_ or group of probes in the traced application must be + executed. +. **Optionally**, the probe must have a log level matching a + log level range specified when enabling the event. +. **Optionally**, the occurring event must satisfy a custom + expression, or _filter_, specified when enabling the event. + +The following illustration summarizes how tracing sessions, domains, +channels and events are related: + +[role="img-90"] +.Core concepts. +image::core-concepts.png[] + +This diagram also shows how events may be individually enabled/disabled +(green/grey) and how a given event may be registered to more than one +channel. + + +[[plumbing]] +=== Plumbing + +The previous section described the concepts at the heart of LTTng. +This section summarizes LTTng's implementation: how those objects are +managed by different applications and libraries working together to +form the toolkit. + + +[[plumbing-overview]] +==== Overview + +As <>, the whole LTTng suite +is made of the following packages: LTTng-tools, LTTng-UST, and +LTTng-modules. Together, they provide different daemons, libraries, +kernel modules and command line interfaces. The following tree shows +which usable component belongs to which package: + +* **LTTng-tools**: +** session daemon (`lttng-sessiond`) +** consumer daemon (`lttng-consumerd`) +** relay daemon (`lttng-relayd`) +** tracing control library (`liblttng-ctl`) +** tracing control command line tool (`lttng`) +* **LTTng-UST**: +** user space tracing library (`liblttng-ust`) and its headers +** preloadable user space tracing helpers + (`liblttng-ust-libc-wrapper`, `liblttng-ust-pthread-wrapper`, + `liblttng-ust-cyg-profile`, `liblttng-ust-cyg-profile-fast` + and `liblttng-ust-dl`) +** user space tracepoint code generator command line tool + (`lttng-gen-tp`) +** `java.util.logging` tracepoint provider (`liblttng-ust-jul-jni`) + and JAR file (path:{liblttng-ust-jul.jar}) +* **LTTng-modules**: +** LTTng Linux kernel tracer module +** tracing ring buffer kernel modules +** many LTTng probe kernel modules + +The following diagram shows how the most important LTTng components +interact. Plain black arrows represent trace data paths while dashed +red arrows indicate control communications. The LTTng relay daemon is +shown running on a remote system, although it could as well run on the +target (monitored) system. + +[role="img-90"] +.LTTng plumbing. +image::plumbing.png[] + +Each component is described in the following subsections. + + +[[lttng-sessiond]] +==== Session daemon + +At the heart of LTTng's plumbing is the _session daemon_, often called +by its command name, `lttng-sessiond`. + +The session daemon is responsible for managing tracing sessions and +what they logically contain (channel properties, enabled/disabled +events, etc.). By communicating locally with instrumented applications +(using LTTng-UST) and with the LTTng Linux kernel modules +(LTTng-modules), it oversees all tracing activities. + +One of the many things that `lttng-sessiond` does is to keep +track of the available event types. User space applications and +libraries actively connect and register to the session daemon when they +start. By contrast, `lttng-sessiond` seeks out and loads the appropriate +LTTng kernel modules as part of its own initialization. Kernel event +types are _pulled_ by `lttng-sessiond`, whereas user space event types +are _pushed_ to it by the various user space tracepoint providers. + +Using a specific inter-process communication protocol with Linux kernel +and user space tracers, the session daemon can send channel information +so that they are initialized, enable/disable specific probes based on +enabled/disabled events by the user, send event filters information to +LTTng tracers so that filtering actually happens at the tracer site, +start/stop tracing a specific application or the Linux kernel, etc. + +The session daemon is not useful without some user controlling it, +because it's only a sophisticated control interchange and thus +doesn't make any decision on its own. `lttng-sessiond` opens a local +socket for controlling it, albeit the preferred way to control it is +using `liblttng-ctl`, an installed C library hiding the communication +protocol behind an easy-to-use API. The `lttng` tool makes use of +`liblttng-ctl` to implement a user-friendly command line interface. + +`lttng-sessiond` does not receive any trace data from instrumented +applications; the _consumer daemons_ are the programs responsible for +collecting trace data using shared ring buffers. However, the session +daemon is the one that must spawn a consumer daemon and establish +a control communication with it. + +Session daemons run on a per-user basis. Knowing this, multiple +instances of `lttng-sessiond` may run simultaneously, each belonging +to a different user and each operating independently of the others. +Only `root`'s session daemon, however, may control LTTng kernel modules +(i.e. the kernel tracer). With that in mind, if a user has no root +access on the target system, he cannot trace the system's kernel, but +should still be able to trace its own instrumented applications. + +It has to be noted that, although only `root`'s session daemon may +control the kernel tracer, the `lttng-sessiond` command has a `--group` +option which may be used to specify the name of a special user group +allowed to communicate with `root`'s session daemon and thus record +kernel traces. By default, this group is named `tracing`. + +If not done yet, the `lttng` tool, by default, automatically starts a +session daemon. `lttng-sessiond` may also be started manually: + +[role="term"] +---- +lttng-sessiond +---- + +This will start the session daemon in foreground. Use + +[role="term"] +---- +lttng-sessiond --daemonize +---- + +to start it as a true daemon. + +To kill the current user's session daemon, `pkill` may be used: + +[role="term"] +---- +pkill lttng-sessiond +---- + +The default `SIGTERM` signal will terminate it cleanly. + +Several other options are available and described in +man:lttng-sessiond(8) or by running `lttng-sessiond --help`. + + +[[lttng-consumerd]] +==== Consumer daemon + +The _consumer daemon_, or `lttng-consumerd`, is a program sharing some +ring buffers with user applications or the LTTng kernel modules to +collect trace data and output it at some place (on disk or sent over +the network to an LTTng relay daemon). + +Consumer daemons are created by a session daemon as soon as events are +enabled within a tracing session, well before tracing is activated +for the latter. Entirely managed by session daemons, +consumer daemons survive session destruction to be reused later, +should a new tracing session be created. Consumer daemons are always +owned by the same user as their session daemon. When its owner session +daemon is killed, the consumer daemon also exits. This is because +the consumer daemon is always the child process of a session daemon. +Consumer daemons should never be started manually. For this reason, +they are not installed in one of the usual locations listed in the +`PATH` environment variable. `lttng-sessiond` has, however, a +bunch of options (see man:lttng-sessiond(8)) to +specify custom consumer daemon paths if, for some reason, a consumer +daemon other than the default installed one is needed. + +There are up to two running consumer daemons per user, whereas only one +session daemon may run per user. This is because each process has +independent bitness: if the target system runs a mixture of 32-bit and +64-bit processes, it is more efficient to have separate corresponding +32-bit and 64-bit consumer daemons. The `root` user is an exception: it +may have up to _three_ running consumer daemons: 32-bit and 64-bit +instances for its user space applications and one more reserved for +collecting kernel trace data. + +As new tracing domains are added to LTTng, the development community's +intent is to minimize the need for additionnal consumer daemon instances +dedicated to them. For instance, the `java.util.logging` (JUL) domain +events are in fact mapped to the user space domain, thus tracing this +particular domain is handled by existing user space domain consumer +daemons. + + +[[lttng-relayd]] +==== Relay daemon + +When a tracing session is configured to send its trace data over the +network, an LTTng _relay daemon_ must be used at the other end to +receive trace packets and serialize them to trace files. This setup +makes it possible to trace a target system without ever committing trace +data to its local storage, a feature which is useful for embedded +systems, amongst others. The command implementing the relay daemon +is `lttng-relayd`. + +The basic use case of `lttng-relayd` is to transfer trace data received +over the network to trace files on the local file system. The relay +daemon must listen on two TCP ports to achieve this: one control port, +used by the target session daemon, and one data port, used by the +target consumer daemon. The relay and session daemons agree on common +default ports when custom ones are not specified. + +Since the communication transport protocol for both ports is standard +TCP, the relay daemon may be started either remotely or locally (on the +target system). + +While two instances of consumer daemons (32-bit and 64-bit) may run +concurrently for a given user, `lttng-relayd` needs only be of its +host operating system's bitness. + +The other important feature of LTTng's relay daemon is the support of +_LTTng live_. LTTng live is an application protocol to view events as +they arrive. The relay daemon will still record events in trace files, +but a _tee_ may be created to inspect incoming events. Using LTTng live +locally thus requires to run a local relay daemon. + + +[[liblttng-ctl-lttng]] +==== [[lttng-cli]]Control library and command line interface + +The LTTng control library, `liblttng-ctl`, can be used to communicate +with the session daemon using a C API that hides the underlying +protocol's details. `liblttng-ctl` is part of LTTng-tools. + +`liblttng-ctl` may be used by including its "master" header: + +[source,c] +---- +#include +---- + +Some objects are referred by name (C string), such as tracing sessions, +but most of them require creating a handle first using +`lttng_create_handle()`. The best available developer documentation for +`liblttng-ctl` is, for the moment, its installed header files as such. +Every function/structure is thoroughly documented. + +The `lttng` program is the _de facto_ standard user interface to +control LTTng tracing sessions. `lttng` uses `liblttng-ctl` to +communicate with session daemons behind the scenes. +Its man page, man:lttng(1), is exhaustive, as well as its command +line help (+lttng _cmd_ --help+, where +_cmd_+ is the command name). + +The <> section is a feature +tour of the `lttng` tool. + + +[[lttng-ust]] +==== User space tracing library + +The user space tracing part of LTTng is possible thanks to the user +space tracing library, `liblttng-ust`, which is part of the LTTng-UST +package. + +`liblttng-ust` provides header files containing macros used to define +tracepoints and create tracepoint providers, as well as a shared object +that must be linked to individual applications to connect to and +communicate with a session daemon and a consumer daemon as soon as the +application starts. + +The exact mechanism by which an application is registered to the +session daemon is beyond the scope of this documentation. The only thing +you need to know is that, since the library constructor does this job +automatically, tracepoints may be safely inserted anywhere in the source +code without prior manual initialization of `liblttng-ust`. + +The `liblttng-ust`-session daemon collaboration also provides an +interesting feature: user space events may be enabled _before_ +applications actually start. By doing this and starting tracing before +launching the instrumented application, you make sure that even the +earliest occurring events can be recorded. + +The <> instrumenting guide of the +<> chapter focuses on using `liblttng-ust`: +instrumenting, building/linking and running a user application. + + +[[lttng-modules]] +==== LTTng kernel modules + +The LTTng Linux kernel modules provide everything needed to trace the +Linux kernel: various probes, a ring buffer implementation for a +consumer daemon to read trace data and the tracer itself. + +Only in exceptional circumstances should you ever need to load the +LTTng kernel modules manually: it is normally the responsability of +`root`'s session daemon to do so. If you were to develop your own LTTng +probe module, however--for tracing a custom kernel or some kernel +module (this topic is covered in the +<> instrumenting guide of +the <> chapter)--you should either +load it manually, or use the `--kmod-probes` option of the session +daemon to load a specific list of kernel probes (beware, however, +that the `--kmod-probes` option specifies an _absolute_ list, which +means you also have to specify the default probes you need). The +session and consumer daemons of regular users do not interact with the +LTTng kernel modules at all. + +LTTng kernel modules are installed, by default, in ++/usr/lib/modules/_release_/extra+, where +_release_+ is the +kernel release (see `uname --kernel-release`). + + +[[using-lttng]] +== Using LTTng + +Using LTTng involves two main activities: **instrumenting** and +**controlling tracing**. + +_<>_ is the process of inserting probes +into some source code. It can be done manually, by writing tracepoint +calls at specific locations in the source code of the program to trace, +or more automatically using dynamic probes (address in assembled code, +symbol name, function entry/return, etc.). + +It has to be noted that, as an LTTng user, you may not have to worry +about the instrumentation process. Indeed, you may want to trace a +program already instrumented. As an example, the Linux kernel is +thoroughly instrumented, which is why you can trace it without caring +about adding probes. + +_<>_ is everything +that can be done by the LTTng session daemon, which is controlled using +`liblttng-ctl` or its command line utility, `lttng`: creating tracing +sessions, listing tracing sessions and events, enabling/disabling +events, starting/stopping the tracers, taking snapshots, etc. + +This chapter is a complete user guide of both activities, +with common use cases of LTTng exposed throughout the text. It is +assumed that you are familiar with LTTng's concepts (events, channels, +domains, tracing sessions) and that you understand the roles of its +components (daemons, libraries, command line tools); if not, we invite +you to read the <> chapter +before you begin reading this one. + +If you're new to LTTng, we suggest that you rather start with the +<> small guide first, then come +back here to broaden your knowledge. + +If you're only interested in tracing the Linux kernel with its current +instrumentation, you may skip the +<> section. + + +[[instrumenting]] +=== Instrumenting + +There are many examples of tracing and monitoring in our everyday life. +You have access to real-time and historical weather reports and forecasts +thanks to weather stations installed around the country. You know your +possibly hospitalized friends' and family's hearts are safe thanks to +electrocardiography. You make sure not to drive your car too fast +and have enough fuel to reach your destination thanks to gauges visible +on your dashboard. + +All the previous examples have something in common: they rely on +**probes**. Without electrodes attached to the surface of a body's +skin, cardiac monitoring would be futile. + +LTTng, as a tracer, is no different from the real life examples above. +If you're about to trace a software system, i.e. record its history of +execution, you better have probes in the subject you're +tracing: the actual software. Various ways were developed to do this. +The most straightforward one is to manually place probes, called +_tracepoints_, in the software's source code. The Linux kernel tracing +domain also allows probes added dynamically. + +If you're only interested in tracing the Linux kernel, it may very well +be that your tracing needs are already appropriately covered by LTTng's +built-in Linux kernel tracepoints and other probes. Or you may be in +possession of a user space application which has already been +instrumented. In such cases, the work will reside entirely in the design +and execution of tracing sessions, allowing you to jump to +<> right now. + +This chapter focuses on the following use cases of instrumentation: + +* <> and <> applications +* <> +* <> +* <> module or the + kernel itself +* the <> + +Some advanced techniques are also presented at the very end of this +chapter. + + +[[c-application]] +==== C application + +Instrumenting a C (or $$C++$$) application, be it an executable program or +a library, implies using LTTng-UST, the +user space tracing component of LTTng. For C/$$C++$$ applications, the +LTTng-UST package includes a dynamically loaded library +(`liblttng-ust`), C headers and the `lttng-gen-tp` command line utility. + +Since C and $$C++$$ are the base languages of virtually all other +programming languages +(Java virtual machine, Python, Perl, PHP and Node.js interpreters, etc.), +implementing user space tracing for an unsupported language is just a +matter of using the LTTng-UST C API at the right places. + +The usual work flow to instrument a user space C application with +LTTng-UST is: + +. Define tracepoints (actual probes) +. Write tracepoint providers +. Insert tracepoints into target source code +. Package (build) tracepoint providers +. Build user application and link it with tracepoint providers + +The steps above are discussed in greater detail in the following +subsections. + + +[[tracepoint-provider]] +===== Tracepoint provider + +Before jumping into defining tracepoints and inserting +them into the application source code, you must understand what a +_tracepoint provider_ is. + +For the sake of this guide, consider the following two files: + +[source,c] +.path:{tp.h} +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER my_provider + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./tp.h" + +#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TP_H + +#include + +TRACEPOINT_EVENT( + my_provider, + my_first_tracepoint, + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) + +TRACEPOINT_EVENT( + my_provider, + my_other_tracepoint, + TP_ARGS( + int, my_int + ), + TP_FIELDS( + ctf_integer(int, some_field, my_int) + ) +) + +#endif /* _TP_H */ + +#include +---- + +[source,c] +.path:{tp.c} +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +The two files above are defining a _tracepoint provider_. A tracepoint +provider is some sort of namespace for _tracepoint definitions_. Tracepoint +definitions are written above with the `TRACEPOINT_EVENT()` macro, and allow +eventual `tracepoint()` calls respecting their definitions to be inserted +into the user application's C source code (we explore this in a +later section). + +Many tracepoint definitions may be part of the same tracepoint provider +and many tracepoint providers may coexist in a user space application. A +tracepoint provider is packaged either: + +* directly into an existing user application's C source file +* as an object file +* as a static library +* as a shared library + +The two files above, path:{tp.h} and path:{tp.c}, show a typical template for +writing a tracepoint provider. LTTng-UST was designed so that two +tracepoint providers should not be defined in the same header file. + +We will now go through the various parts of the above files and +give them a meaning. As you may have noticed, the LTTng-UST API for +C/$$C++$$ applications is some preprocessor sorcery. The LTTng-UST macros +used in your application and those in the LTTng-UST headers are +combined to produce actual source code needed to make tracing possible +using LTTng. + +Let's start with the header file, path:{tp.h}. It begins with + +[source,c] +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER my_provider +---- + +`TRACEPOINT_PROVIDER` defines the name of the provider to which the +following tracepoint definitions will belong. It is used internally by +LTTng-UST headers and _must_ be defined. Since `TRACEPOINT_PROVIDER` +could have been defined by another header file also included by the same +C source file, the best practice is to undefine it first. + +NOTE: Names in LTTng-UST follow the C +_identifier_ syntax (starting with a letter and containing either +letters, numbers or underscores); they are _not_ C strings +(not surrounded by double quotes). This is because LTTng-UST macros +use those identifier-like strings to create symbols (named types and +variables). + +The tracepoint provider is a group of tracepoint definitions; its chosen +name should reflect this. A hierarchy like Java packages is recommended, +using underscores instead of dots, e.g., `org_company_project_component`. + +Next is `TRACEPOINT_INCLUDE`: + +[source,c] +---- +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./tp.h" +---- + +This little bit of instrospection is needed by LTTng-UST to include +your header at various predefined places. + +Include guard follows: + +[source,c] +---- +#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TP_H +---- + +Add these precompiler conditionals to ensure the tracepoint event +generation can include this file more than once. + +The `TRACEPOINT_EVENT()` macro is defined in a LTTng-UST header file which +must be included: + +[source,c] +---- +#include +---- + +This will also allow the application to use the `tracepoint()` macro. + +Next is a list of `TRACEPOINT_EVENT()` macro calls which create the +actual tracepoint definitions. We will skip this for the moment and +come back to how to use `TRACEPOINT_EVENT()` +<>. Just pay attention to +the first argument: it's always the name of the tracepoint provider +being defined in this header file. + +End of include guard: + +[source,c] +---- +#endif /* _TP_H */ +---- + +Finally, include `` to expand the macros: + +[source,c] +---- +#include +---- + +That's it for path:{tp.h}. Of course, this is only a header file; it must be +included in some C source file to actually use it. This is the job of +path:{tp.c}: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +When `TRACEPOINT_CREATE_PROBES` is defined, the macros used in path:{tp.h}, +which is included just after, will actually create the source code for +LTTng-UST probes (global data structures and functions) out of your +tracepoint definitions. How exactly this is done is out of this text's scope. +`TRACEPOINT_CREATE_PROBES` is discussed further +in +<>. + +You could include other header files like path:{tp.h} here to create the probes +of different tracepoint providers, e.g.: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp1.h" +#include "tp2.h" +---- + +The rule is: probes of a given tracepoint provider +must be created in exactly one source file. This source file could be one +of your project's; it doesn't have to be on its own like +path:{tp.c}, although +<> +shows that doing so allows packaging the tracepoint providers +independently and keep them out of your application, also making it +possible to reuse them between projects. + +The following sections explain how to define tracepoints, how to use the +`tracepoint()` macro to instrument your user space C application and how +to build/link tracepoint providers and your application with LTTng-UST +support. + + +[[lttng-gen-tp]] +===== Using `lttng-gen-tp` + +LTTng-UST ships with `lttng-gen-tp`, a handy command line utility for +generating most of the stuff discussed above. It takes a _template file_, +with a name usually ending with the `.tp` extension, containing only +tracepoint definitions, and outputs a tracepoint provider (either a C +source file or a precompiled object file) with its header file. + +`lttng-gen-tp` should suffice in <> +situations. When using it, write a template file containing a list of +`TRACEPOINT_EVENT()` macro calls. The tool will find the provider names +used and generate the appropriate files which are going to look a lot +like path:{tp.h} and path:{tp.c} above. + +Just call `lttng-gen-tp` like this: + +[role="term"] +---- +lttng-gen-tp my-template.tp +---- + +path:{my-template.c}, path:{my-template.o} and path:{my-template.h} +will be created in the same directory. + +You may specify custom C flags passed to the compiler invoked by +`lttng-gen-tp` using the `CFLAGS` environment variable: + +[role="term"] +---- +CFLAGS=-I/custom/include/path lttng-gen-tp my-template.tp +---- + +For more information on `lttng-gen-tp`, see man:lttng-gen-tp(1). + + +[[defining-tracepoints]] +===== Defining tracepoints + +As written in <>, +tracepoints are defined using the +`TRACEPOINT_EVENT()` macro. Each tracepoint, when called using the +`tracepoint()` macro in the actual application's source code, generates +a specific event type with its own fields. + +Let's have another look at the example above, with a few added comments: + +[source,c] +---- +TRACEPOINT_EVENT( + /* tracepoint provider name */ + my_provider, + + /* tracepoint/event name */ + my_first_tracepoint, + + /* list of tracepoint arguments */ + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + + /* list of fields of eventual event */ + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) +---- + +The tracepoint provider name must match the name of the tracepoint +provider in which this tracepoint is defined +(see <>). In other words, +always use the same string as the value of `TRACEPOINT_PROVIDER` above. + +The tracepoint name will become the event name once events are recorded +by the LTTng-UST tracer. It must follow the tracepoint provider name +syntax: start with a letter and contain either letters, numbers or +underscores. Two tracepoints under the same provider cannot have the +same name, i.e. you cannot overload a tracepoint like you would +overload functions and methods in $$C++$$/Java. + +NOTE: The concatenation of the tracepoint +provider name and the tracepoint name cannot exceed 254 characters. If +it does, the instrumented application will compile and run, but LTTng +will issue multiple warnings and you could experience serious problems. + +The list of tracepoint arguments gives this tracepoint its signature: +see it like the declaration of a C function. The format of `TP_ARGS()` +arguments is: C type, then argument name; repeat as needed, up to ten +times. For example, if we were to replicate the signature of C standard +library's `fseek()`, the `TP_ARGS()` part would look like: + +[source,c] +---- + TP_ARGS( + FILE*, stream, + long int, offset, + int, origin + ), +---- + +Of course, you will need to include appropriate header files before +the `TRACEPOINT_EVENT()` macro calls if any argument has a complex type. + +`TP_ARGS()` may not be omitted, but may be empty. `TP_ARGS(void)` is +also accepted. + +The list of fields is where the fun really begins. The fields defined +in this list will be the fields of the events generated by the execution +of this tracepoint. Each tracepoint field definition has a C +_argument expression_ which will be evaluated when the execution reaches +the tracepoint. Tracepoint arguments _may be_ used freely in those +argument expressions, but they _don't_ have to. + +There are several types of tracepoint fields available. The macros to +define them are given and explained in the +<> section. + +Field names must follow the standard C identifier syntax: letter, then +optional sequence of letters, numbers or underscores. Each field must have +a different name. + +Those `ctf_*()` macros are added to the `TP_FIELDS()` part of +`TRACEPOINT_EVENT()`. Note that they are not delimited by commas. +`TP_FIELDS()` may be empty, but the `TP_FIELDS(void)` form is _not_ +accepted. + +The following snippet shows how argument expressions may be used in +tracepoint fields and how they may refer freely to tracepoint arguments. + +[source,c] +---- +/* for struct stat */ +#include +#include +#include + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + int, my_int_arg, + char*, my_str_arg, + struct stat*, st + ), + TP_FIELDS( + /* simple integer field with constant value */ + ctf_integer( + int, /* field C type */ + my_constant_field, /* field name */ + 23 + 17 /* argument expression */ + ) + + /* my_int_arg tracepoint argument */ + ctf_integer( + int, + my_int_arg_field, + my_int_arg + ) + + /* my_int_arg squared */ + ctf_integer( + int, + my_int_arg_field2, + my_int_arg * my_int_arg + ) + + /* sum of first 4 characters of my_str_arg */ + ctf_integer( + int, + sum4, + my_str_arg[0] + my_str_arg[1] + + my_str_arg[2] + my_str_arg[3] + ) + + /* my_str_arg as string field */ + ctf_string( + my_str_arg_field, /* field name */ + my_str_arg /* argument expression */ + ) + + /* st_size member of st tracepoint argument, hexadecimal */ + ctf_integer_hex( + off_t, /* field C type */ + size_field, /* field name */ + st->st_size /* argument expression */ + ) + + /* st_size member of st tracepoint argument, as double */ + ctf_float( + double, /* field C type */ + size_dbl_field, /* field name */ + (double) st->st_size /* argument expression */ + ) + + /* half of my_str_arg string as text sequence */ + ctf_sequence_text( + char, /* element C type */ + half_my_str_arg_field, /* field name */ + my_str_arg, /* argument expression */ + size_t, /* length expression C type */ + strlen(my_str_arg) / 2 /* length expression */ + ) + ) +) +---- + +As you can see, having a custom argument expression for each field +makes tracepoints very flexible for tracing a user space C application. +This tracepoint definition is reused later in this guide, when +actually using tracepoints in a user space application. + + +[[using-tracepoint-classes]] +===== Using tracepoint classes + +In LTTng-UST, a _tracepoint class_ is a class of tracepoints sharing the +same field types and names. A _tracepoint instance_ is one instance of +such a declared tracepoint class, with its own event name and tracepoint +provider name. + +What is documented in <> +is actually how to declare a _tracepoint class_ and define a +_tracepoint instance_ at the same time. Without revealing the internals +of LTTng-UST too much, it has to be noted that one serialization +function is created for each tracepoint class. A serialization +function is responsible for serializing the fields of a tracepoint +into a sub-buffer when tracing. For various performance reasons, when +your situation requires multiple tracepoints with different names, but +with the same fields layout, the best practice is to manually create +a tracepoint class and instantiate as many tracepoint instances as +needed. One positive effect of such a design, amongst other advantages, +is that all tracepoint instances of the same tracepoint class will +reuse the same serialization function, thus reducing cache pollution. + +As an example, here are three tracepoint definitions as we know them: + +[source,c] +---- +TRACEPOINT_EVENT( + my_app, + get_account, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +TRACEPOINT_EVENT( + my_app, + get_settings, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +TRACEPOINT_EVENT( + my_app, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) +---- + +In this case, three tracepoint classes are created, with one tracepoint +instance for each of them: `get_account`, `get_settings` and +`get_transaction`. However, they all share the same field names and +types. Declaring one tracepoint class and three tracepoint instances of +the latter is a better design choice: + +[source,c] +---- +/* the tracepoint class */ +TRACEPOINT_EVENT_CLASS( + /* tracepoint provider name */ + my_app, + + /* tracepoint class name */ + my_class, + + /* arguments */ + TP_ARGS( + int, userid, + size_t, len + ), + + /* fields */ + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +/* the tracepoint instances */ +TRACEPOINT_EVENT_INSTANCE( + /* tracepoint provider name */ + my_app, + + /* tracepoint class name */ + my_class, + + /* tracepoint/event name */ + get_account, + + /* arguments */ + TP_ARGS( + int, userid, + size_t, len + ) +) +TRACEPOINT_EVENT_INSTANCE( + my_app, + my_class, + get_settings, + TP_ARGS( + int, userid, + size_t, len + ) +) +TRACEPOINT_EVENT_INSTANCE( + my_app, + my_class, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ) +) +---- + +Of course, all those names and `TP_ARGS()` invocations are redundant, +but some C preprocessor magic can solve this: + +[source,c] +---- +#define MY_TRACEPOINT_ARGS \ + TP_ARGS( \ + int, userid, \ + size_t, len \ + ) + +TRACEPOINT_EVENT_CLASS( + my_app, + my_class, + MY_TRACEPOINT_ARGS, + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +#define MY_APP_TRACEPOINT_INSTANCE(name) \ + TRACEPOINT_EVENT_INSTANCE( \ + my_app, \ + my_class, \ + name, \ + MY_TRACEPOINT_ARGS \ + ) + +MY_APP_TRACEPOINT_INSTANCE(get_account) +MY_APP_TRACEPOINT_INSTANCE(get_settings) +MY_APP_TRACEPOINT_INSTANCE(get_transaction) +---- + + +[[assigning-log-levels]] +===== Assigning log levels to tracepoints + +Optionally, a log level can be assigned to a defined tracepoint. +Assigning different levels of importance to tracepoints can be useful; +when controlling tracing sessions, +<> to only enable tracepoints +falling into a specific log level range. + +Log levels are assigned to defined tracepoints using the +`TRACEPOINT_LOGLEVEL()` macro. The latter must be used _after_ having +used `TRACEPOINT_EVENT()` for a given tracepoint. The +`TRACEPOINT_LOGLEVEL()` macro has the following construct: + +[source,c] +---- +TRACEPOINT_LOGLEVEL(PROVIDER_NAME, TRACEPOINT_NAME, LOG_LEVEL) +---- + +where the first two arguments are the same as the first two arguments +of `TRACEPOINT_EVENT()` and `LOG_LEVEL` is one +of the values given in the +<> +section. + +As an example, let's assign a `TRACE_DEBUG_UNIT` log level to our +previous tracepoint definition: + +[source,c] +---- +TRACEPOINT_LOGLEVEL(my_provider, my_tracepoint, TRACE_DEBUG_UNIT) +---- + + +[[probing-the-application-source-code]] +===== Probing the application's source code + +Once tracepoints are properly defined within a tracepoint provider, +they may be inserted into the user application to be instrumented +using the `tracepoint()` macro. Its first argument is the tracepoint +provider name and its second is the tracepoint name. The next, optional +arguments are defined by the `TP_ARGS()` part of the definition of +the tracepoint to use. + +As an example, let us again take the following tracepoint definition: + +[source,c] +---- +TRACEPOINT_EVENT( + /* tracepoint provider name */ + my_provider, + + /* tracepoint/event name */ + my_first_tracepoint, + + /* list of tracepoint arguments */ + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + + /* list of fields of eventual event */ + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) +---- + +Assuming this is part of a file named path:{tp.h} which defines the tracepoint +provider and which is included by path:{tp.c}, here's a complete C application +calling this tracepoint (multiple times): + +[source,c] +---- +#define TRACEPOINT_DEFINE +#include "tp.h" + +int main(int argc, char* argv[]) +{ + int i; + + tracepoint(my_provider, my_first_tracepoint, 23, "Hello, World!"); + + for (i = 0; i < argc; ++i) { + tracepoint(my_provider, my_first_tracepoint, i, argv[i]); + } + + return 0; +} +---- + +For each tracepoint provider, `TRACEPOINT_DEFINE` must be defined into +exactly one translation unit (C source file) of the user application, +before including the tracepoint provider header file. In other words, +for a given tracepoint provider, you cannot define `TRACEPOINT_DEFINE`, +and then include its header file in two separate C source files of +the same application. `TRACEPOINT_DEFINE` is discussed further in +<>. + +As another example, remember this definition we wrote in a previous +section (comments are stripped): + +[source,c] +---- +/* for struct stat */ +#include +#include +#include + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + int, my_int_arg, + char*, my_str_arg, + struct stat*, st + ), + TP_FIELDS( + ctf_integer(int, my_constant_field, 23 + 17) + ctf_integer(int, my_int_arg_field, my_int_arg) + ctf_integer(int, my_int_arg_field2, my_int_arg * my_int_arg) + ctf_integer(int, sum4_field, my_str_arg[0] + my_str_arg[1] + + my_str_arg[2] + my_str_arg[3]) + ctf_string(my_str_arg_field, my_str_arg) + ctf_integer_hex(off_t, size_field, st->st_size) + ctf_float(double, size_dbl_field, (double) st->st_size) + ctf_sequence_text(char, half_my_str_arg_field, my_str_arg, + size_t, strlen(my_str_arg) / 2) + ) +) +---- + +Here's an example of calling it: + +[source,c] +---- +#define TRACEPOINT_DEFINE +#include "tp.h" + +int main(void) +{ + struct stat s; + + stat("/etc/fstab", &s); + + tracepoint(my_provider, my_tracepoint, 23, "Hello, World!", &s); + + return 0; +} +---- + +When viewing the trace, assuming the file size of path:{/etc/fstab} is +301{nbsp}bytes, the event generated by the execution of this tracepoint +should have the following fields, in this order: + +---- +my_constant_field 40 +my_int_arg_field 23 +my_int_arg_field2 529 +sum4_field 389 +my_str_arg_field "Hello, World!" +size_field 0x12d +size_dbl_field 301.0 +half_my_str_arg_field "Hello," +---- + + +[[building-tracepoint-providers-and-user-application]] +===== Building/linking tracepoint providers and the user application + +The final step of using LTTng-UST for tracing a user space C application +(beside running the application) is building and linking tracepoint +providers and the application itself. + +As discussed above, the macros used by the user-written tracepoint provider +header file are useless until actually used to create probes code +(global data structures and functions) in a translation unit (C source file). +This is accomplished by defining `TRACEPOINT_CREATE_PROBES` in a translation +unit and then including the tracepoint provider header file. +When `TRACEPOINT_CREATE_PROBES` is defined, macros used and included by +the tracepoint provider header will output actual source code needed by any +application using the defined tracepoints. Defining +`TRACEPOINT_CREATE_PROBES` produces code used when registering +tracepoint providers when the tracepoint provider package loads. + +The other important definition is `TRACEPOINT_DEFINE`. This one creates +global, per-tracepoint structures referencing the tracepoint providers +data. Those structures are required by the actual functions inserted +where `tracepoint()` macros are placed and need to be defined by the +instrumented application. + +Both `TRACEPOINT_CREATE_PROBES` and `TRACEPOINT_DEFINE` need to be defined +at some places in order to trace a user space C application using LTTng. +Although explaining their exact mechanism is beyond the scope of this +document, the reason they both exist separately is to allow the trace +providers to be packaged as a shared object (dynamically loaded library). + +There are two ways to compile and link the tracepoint providers +with the application: _<>_ or +_<>_. Both methods are covered in the +following subsections. + + +[[static-linking]] +===== Static linking the tracepoint providers to the application + +With the static linking method, compiled tracepoint providers are copied +into the target application. There are three ways to do this: + +. Use one of your **existing C source files** to create probes. +. Create probes in a separate C source file and build it as an + **object file** to be linked with the application (more decoupled). +. Create probes in a separate C source file, build it as an + object file and archive it to create a **static library** + (more decoupled, more portable). + +The first approach is to define `TRACEPOINT_CREATE_PROBES` and include +your tracepoint provider(s) header file(s) directly into an existing C +source file. Here's an example: + +[source,c] +---- +#include +#include +/* ... */ + +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE +#include "tp.h" + +/* ... */ + +int my_func(int a, const char* b) +{ + /* ... */ + + tracepoint(my_provider, my_tracepoint, buf, sz, limit, &tt) + + /* ... */ +} + +/* ... */ +---- + +Again, before including a given tracepoint provider header file, +`TRACEPOINT_CREATE_PROBES` and `TRACEPOINT_DEFINE` must be defined in +one, **and only one**, translation unit. Other C source files of the +same application may include path:{tp.h} to use tracepoints with +the `tracepoint()` macro, but must not define +`TRACEPOINT_CREATE_PROBES`/`TRACEPOINT_DEFINE` again. + +This translation unit may be built as an object file by making sure to +add `.` to the include path: + +[role="term"] +---- +gcc -c -I. file.c +---- + +The second approach is to isolate the tracepoint provider code into a +separate object file by using a dedicated C source file to create probes: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +`TRACEPOINT_DEFINE` must be defined by a translation unit of the +application. Since we're talking about static linking here, it could as +well be defined directly in the file above, before `#include "tp.h"`: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE + +#include "tp.h" +---- + +This is actually what <> does, and is +the recommended practice. + +Build the tracepoint provider: + +[role="term"] +---- +gcc -c -I. tp.c +---- + +Finally, the resulting object file may be archived to create a +more portable tracepoint provider static library: + +[role="term"] +---- +ar rc tp.a tp.o +---- + +Using a static library does have the advantage of centralising the +tracepoint providers objects so they can be shared between multiple +applications. This way, when the tracepoint provider is modified, the +source code changes don't have to be patched into each application's source +code tree. The applications need to be relinked after each change, but need +not to be otherwise recompiled (unless the tracepoint provider's API +changes). + +Regardless of which method you choose, you end up with an object file +(potentially archived) containing the trace providers assembled code. +To link this code with the rest of your application, you must also link +with `liblttng-ust` and `libdl`: + +[role="term"] +---- +gcc -o app tp.o other.o files.o of.o your.o app.o -llttng-ust -ldl +---- + +or + +[role="term"] +---- +gcc -o app tp.a other.o files.o of.o your.o app.o -llttng-ust -ldl +---- + +If you're using a BSD +system, replace `-ldl` with `-lc`: + +[role="term"] +---- +gcc -o app tp.a other.o files.o of.o your.o app.o -llttng-ust -lc +---- + +The application can be started as usual, e.g.: + +[role="term"] +---- +./app +---- + +The `lttng` command line tool can be used to +<>. + + +[[dynamic-linking]] +===== Dynamic linking the tracepoint providers to the application + +The second approach to package the tracepoint providers is to use +dynamic linking: the library and its member functions are explicitly +sought, loaded and unloaded at runtime using `libdl`. + +It has to be noted that, for a variety of reasons, the created shared +library will be dynamically _loaded_, as opposed to dynamically +_linked_. The tracepoint provider shared object is, however, linked +with `liblttng-ust`, so that `liblttng-ust` is guaranteed to be loaded +as soon as the tracepoint provider is. If the tracepoint provider is +not loaded, since the application itself is not linked with +`liblttng-ust`, the latter is not loaded at all and the tracepoint calls +become inert. + +The process to create the tracepoint provider shared object is pretty +much the same as the static library method, except that: + +* since the tracepoint provider is not part of the application + anymore, `TRACEPOINT_DEFINE` _must_ be defined, for each tracepoint + provider, in exactly one translation unit (C source file) of the + _application_; +* `TRACEPOINT_PROBE_DYNAMIC_LINKAGE` must be defined next to + `TRACEPOINT_DEFINE`. + +Regarding `TRACEPOINT_DEFINE` and `TRACEPOINT_PROBE_DYNAMIC_LINKAGE`, +the recommended practice is to use a separate C source file in your +application to define them, and then include the tracepoint provider +header files afterwards, e.g.: + +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE + +/* include the header files of one or more tracepoint providers below */ +#include "tp1.h" +#include "tp2.h" +#include "tp3.h" +---- + +`TRACEPOINT_PROBE_DYNAMIC_LINKAGE` makes the macros included afterwards +(by including the tracepoint provider header, which itself includes +LTTng-UST headers) aware that the tracepoint provider is to be loaded +dynamically and not part of the application's executable. + +The tracepoint provider object file used to create the shared library +is built like it is using the static library method, only with the +`-fpic` option added: + +[role="term"] +---- +gcc -c -fpic -I. tp.c +---- + +It is then linked as a shared library like this: + +[role="term"] +---- +gcc -shared -Wl,--no-as-needed -o tp.so -llttng-ust tp.o +---- + +As previously stated, this tracepoint provider shared object isn't +linked with the user application: it will be loaded manually. This is +why the application is built with no mention of this tracepoint +provider, but still needs `libdl`: + +[role="term"] +---- +gcc -o app other.o files.o of.o your.o app.o -ldl +---- + +Now, to make LTTng-UST tracing available to the application, the +`LD_PRELOAD` environment variable is used to preload the tracepoint +provider shared library _before_ the application actually starts: + +[role="term"] +---- +LD_PRELOAD=/path/to/tp.so ./app +---- + +[NOTE] +==== +It is not safe to use +`dlclose()` on a tracepoint provider shared object that +is being actively used for tracing, due to a lack of reference +counting from LTTng-UST to the shared object. + +For example, statically linking a tracepoint provider to a +shared object which is to be dynamically loaded by an application +(e.g., a plugin) is not safe: the shared object, which contains the +tracepoint provider, could be dynamically closed +(`dlclose()`) at any time by the application. + +To instrument a shared object, either: + +* Statically link the tracepoint provider to the _application_, or +* Build the tracepoint provider as a shared object (following + the procedure shown in this section), and preload it when + tracing is needed using the `LD_PRELOAD` + environment variable. +==== + +Your application will still work without this preloading, albeit without +LTTng-UST tracing support: + +[role="term"] +---- +./app +---- + + +[[using-lttng-ust-with-daemons]] +===== Using LTTng-UST with daemons + +Some extra care is needed when using `liblttng-ust` with daemon +applications that call `fork()`, `clone()` or BSD's `rfork()` without +a following `exec()` family system call. The `liblttng-ust-fork` +library must be preloaded for the application. + +Example: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-fork.so ./app +---- + +Or, if you're using a tracepoint provider shared library: + +[role="term"] +---- +LD_PRELOAD="liblttng-ust-fork.so /path/to/tp.so" ./app +---- + + +[[lttng-ust-pkg-config]] +===== Using pkg-config + +On some distributions, LTTng-UST is shipped with a pkg-config metadata +file, so that you may use the `pkg-config` tool: + +[role="term"] +---- +pkg-config --libs lttng-ust +---- + +This will return `-llttng-ust -ldl` on Linux systems. + +You may also check the LTTng-UST version using `pkg-config`: + +[role="term"] +---- +pkg-config --modversion lttng-ust +---- + +For more information about pkg-config, see +http://linux.die.net/man/1/pkg-config[its manpage]. + + +[[tracef]] +===== Using `tracef()` + +`tracef()` is a small LTTng-UST API to avoid defining your own +tracepoints and tracepoint providers. The signature of `tracef()` is +the same as `printf()`'s. + +The `tracef()` utility function was developed to make user space tracing +super simple, albeit with notable disadvantages compared to custom, +full-fledged tracepoint providers: + +* All generated events have the same provider/event names, respectively + `lttng_ust_tracef` and `event`. +* There's no static type checking. +* The only event field you actually get, named `msg`, is a string + potentially containing the values you passed to the function + using your own format. This also means that you cannot use filtering + using a custom expression at runtime because there are no isolated + fields. +* Since `tracef()` uses C standard library's `vasprintf()` function + in the background to format the strings at runtime, its + expected performance is lower than using custom tracepoint providers + with typed fields, which do not require a conversion to a string. + +Thus, `tracef()` is useful for quick prototyping and debugging, but +should not be considered for any permanent/serious application +instrumentation. + +To use `tracef()`, first include `` in the C source file +where you need to insert probes: + +[source,c] +---- +#include +---- + +Use `tracef()` like you would use `printf()` in your source code, e.g.: + +[source,c] +---- + /* ... */ + + tracef("my message, my integer: %d", my_integer); + + /* ... */ +---- + +Link your application with `liblttng-ust`: + +[role="term"] +---- +gcc -o app app.c -llttng-ust +---- + +Execute the application as usual: + +[role="term"] +---- +./app +---- + +Voilà! Use the `lttng` command line tool to +<>. You can enable `tracef()` +events like this: + +[role="term"] +---- +lttng enable-event --userspace 'lttng_ust_tracef:*' +---- + + +[[lttng-ust-environment-variables-compiler-flags]] +===== LTTng-UST environment variables and special compilation flags + +A few special environment variables and compile flags may affect the +behavior of LTTng-UST. + +LTTng-UST's debugging can be activated by setting the environment +variable `LTTNG_UST_DEBUG` to `1` when launching the application. It +can also be enabled at compile time by defining `LTTNG_UST_DEBUG` when +compiling LTTng-UST (using the `-DLTTNG_UST_DEBUG` compiler option). + +The environment variable `LTTNG_UST_REGISTER_TIMEOUT` can be used to +specify how long the application should wait for the +<>'s _registration done_ command +before proceeding to execute the main program. The timeout value is +specified in milliseconds. 0 means _don't wait_. -1 means +_wait forever_. Setting this environment variable to 0 is recommended +for applications with time contraints on the process startup time. + +The default value of `LTTNG_UST_REGISTER_TIMEOUT` (when not defined) +is **3000{nbsp}ms**. + +The compilation definition `LTTNG_UST_DEBUG_VALGRIND` should be enabled +at build time (`-DLTTNG_UST_DEBUG_VALGRIND`) to allow `liblttng-ust` +to be used with http://valgrind.org/[Valgrind]. +The side effect of defining `LTTNG_UST_DEBUG_VALGRIND` is that per-CPU +buffering is disabled. + + +[[cxx-application]] +==== $$C++$$ application + +Because of $$C++$$'s cross-compatibility with the C language, $$C++$$ +applications can be readily instrumented with the LTTng-UST C API. + +Follow the <> user guide above. It +should be noted that, in this case, tracepoint providers should have +the typical `.cpp`, `.cxx` or `.cc` extension and be built with `g++` +instead of `gcc`. This is the easiest way of avoiding linking errors +due to symbol name mangling incompatibilities between both languages. + + +[[prebuilt-ust-helpers]] +==== Prebuilt user space tracing helpers + +The LTTng-UST package provides a few helpers that one may find +useful in some situations. They all work the same way: you must +preload the appropriate shared object before running the user +application (using the `LD_PRELOAD` environment variable). + +The shared objects are normally found in dir:{/usr/lib}. + +The current installed helpers are: + +path:{liblttng-ust-libc-wrapper.so} and path:{liblttng-ust-pthread-wrapper.so}:: + <>. + +path:{liblttng-ust-cyg-profile.so} and path:{liblttng-ust-cyg-profile-fast.so}:: + <>. + +path:{liblttng-ust-dl.so}:: + <>. + +The following subsections document what helpers instrument exactly +and how to use them. + + +[[liblttng-ust-libc-pthread-wrapper]] +===== C standard library and POSIX threads tracing + +path:{liblttng-ust-libc-wrapper.so} and path:{liblttng-ust-pthread-wrapper.so} +can add instrumentation to respectively some C standard library and +POSIX threads functions. + +The following functions are traceable by path:{liblttng-ust-libc-wrapper.so}: + +[role="growable"] +.Functions instrumented by path:{liblttng-ust-libc-wrapper.so} +|==== +|TP provider name |TP name |Instrumented function + +.6+|`ust_libc` |`malloc` |`malloc()` + |`calloc` |`calloc()` + |`realloc` |`realloc()` + |`free` |`free()` + |`memalign` |`memalign()` + |`posix_memalign` |`posix_memalign()` +|==== + +The following functions are traceable by +path:{liblttng-ust-pthread-wrapper.so}: + +[role="growable"] +.Functions instrumented by path:{liblttng-ust-pthread-wrapper.so} +|==== +|TP provider name |TP name |Instrumented function + +.4+|`ust_pthread` |`pthread_mutex_lock_req` |`pthread_mutex_lock()` (request time) + |`pthread_mutex_lock_acq` |`pthread_mutex_lock()` (acquire time) + |`pthread_mutex_trylock` |`pthread_mutex_trylock()` + |`pthread_mutex_unlock` |`pthread_mutex_unlock()` +|==== + +All tracepoints have fields corresponding to the arguments of the +function they instrument. + +To use one or the other with any user application, independently of +how the latter is built, do: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-libc-wrapper.so my-app +---- + +or + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-pthread-wrapper.so my-app +---- + +To use both, do: + +[role="term"] +---- +LD_PRELOAD="liblttng-ust-libc-wrapper.so liblttng-ust-pthread-wrapper.so" my-app +---- + +When the shared object is preloaded, it effectively replaces the +functions listed in the above tables by wrappers which add tracepoints +and call the replaced functions. + +Of course, like any other tracepoint, the ones above need to be enabled +in order for LTTng-UST to generate events. This is done using the +`lttng` command line tool +(see <>). + + +[[liblttng-ust-cyg-profile]] +===== Function tracing + +Function tracing is the recording of which functions are entered and +left during the execution of an application. Like with any LTTng event, +the precise time at which this happens is also kept. + +GCC and clang have an option named +https://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Code-Gen-Options.html[`-finstrument-functions`] +which generates instrumentation calls for entry and exit to functions. +The LTTng-UST function tracing helpers, path:{liblttng-ust-cyg-profile.so} +and path:{liblttng-ust-cyg-profile-fast.so}, take advantage of this feature +to add instrumentation to the two generated functions (which contain +`cyg_profile` in their names, hence the shared object's name). + +In order to use LTTng-UST function tracing, the translation units to +instrument must be built using the `-finstrument-functions` compiler +flag. + +LTTng-UST function tracing comes in two flavors, each providing +different trade-offs: path:{liblttng-ust-cyg-profile-fast.so} and +path:{liblttng-ust-cyg-profile.so}. + +**path:{liblttng-ust-cyg-profile-fast.so}** is a lightweight variant that +should only be used where it can be _guaranteed_ that the complete event +stream is recorded without any missing events. Any kind of duplicate +information is left out. This version registers the following +tracepoints: + +[role="growable",options="header,autowidth"] +.Functions instrumented by path:{liblttng-ust-cyg-profile-fast.so} +|==== +|TP provider name |TP name |Instrumented function + +.2+|`lttng_ust_cyg_profile_fast` + +|`func_entry` +a|Function entry + +`addr`:: + Address of called function. + +|`func_exit` +|Function exit +|==== + +Assuming no event is lost, having only the function addresses on entry +is enough for creating a call graph (remember that a recorded event +always contains the ID of the CPU that generated it). A tool like +https://sourceware.org/binutils/docs/binutils/addr2line.html[`addr2line`] +may be used to convert function addresses back to source files names +and line numbers. + +The other helper, +**path:{liblttng-ust-cyg-profile.so}**, +is a more robust variant which also works for use cases where +events might get discarded or not recorded from application startup. +In these cases, the trace analyzer needs extra information to be +able to reconstruct the program flow. This version registers the +following tracepoints: + +[role="growable",options="header,autowidth"] +.Functions instrumented by path:{liblttng-ust-cyg-profile.so} +|==== +|TP provider name |TP name |Instrumented function + +.2+|`lttng_ust_cyg_profile` + +|`func_entry` +a|Function entry + +`addr`:: + Address of called function. + +`call_site`:: + Call site address. + +|`func_exit` +a|Function exit + +`addr`:: + Address of called function. + +`call_site`:: + Call site address. +|==== + +To use one or the other variant with any user application, assuming at +least one translation unit of the latter is compiled with the +`-finstrument-functions` option, do: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-cyg-profile-fast.so my-app +---- + +or + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-cyg-profile.so my-app +---- + +It might be necessary to limit the number of source files where +`-finstrument-functions` is used to prevent excessive amount of trace +data to be generated at runtime. + +TIP: When using GCC, at least, you can use + the `-finstrument-functions-exclude-function-list` + option to avoid instrumenting entries and exits of specific + symbol names. + +All events generated from LTTng-UST function tracing are provided on +log level `TRACE_DEBUG_FUNCTION`, which is useful to easily enable +function tracing events in your tracing session using the +`--loglevel-only` option of `lttng enable-event` +(see <>). + + +[[liblttng-ust-dl]] +===== Dynamic linker tracing + +This LTTng-UST helper causes all calls to `dlopen()` and `dlclose()` +in the target application to be traced with LTTng. + +The helper's shared object, path:{liblttng-ust-dl.so}, registers the +following tracepoints when preloaded: + +[role="growable",options="header,autowidth"] +.Functions instrumented by path:{liblttng-ust-dl.so} +|==== +|TP provider name |TP name |Instrumented function + +.2+|`ust_baddr` + +|`push` +a|`dlopen()` call + +`baddr`:: + Memory base address (where the dynamic linker placed the shared + object). + +`sopath`:: + File system path to the loaded shared object. + +`size`:: + File size of the the loaded shared object. + +`mtime`:: + Last modification time (seconds since Epoch time) of the loaded shared + object. + +|`pop` +a|Function exit + +`baddr`:: + Memory base address (where the dynamic linker placed the shared + object). +|==== + +To use this LTTng-UST helper with any user application, independently of +how the latter is built, do: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-dl.so my-app +---- + +Of course, like any other tracepoint, the ones above need to be enabled +in order for LTTng-UST to generate events. This is done using the +`lttng` command line tool +(see <>). + + +[[java-application]] +==== Java application + +LTTng-UST provides a _logging_ back-end for Java applications using +http://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html[`java.util.logging`] +(JUL). This back-end is called the _LTTng-UST JUL agent_ and is +responsible for communications with an LTTng session daemon. + +From the user's point of view, once the LTTng-UST JUL agent has been +initialized, JUL loggers may be created and used as usual. The agent +adds its own handler to the _root logger_, so that all loggers may +generate LTTng events with no effort. + +Common JUL features are supported using the `lttng` tool +(see <>): + +* listing all logger names +* enabling/disabling events per logger name +* JUL log levels + +Here's an example: + +[source,java] +---- +import java.util.logging.Logger; +import org.lttng.ust.jul.LTTngAgent; + +public class Test +{ + public static void main(String[] argv) throws Exception + { + // create a logger + Logger logger = Logger.getLogger("jello"); + + // call this as soon as possible (before logging) + LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); + + // log at will! + logger.info("some info"); + logger.warning("some warning"); + Thread.sleep(500); + logger.finer("finer information..."); + Thread.sleep(123); + logger.severe("error!"); + + // not mandatory, but cleaner + lttngAgent.dispose(); + } +} +---- + +The LTTng-UST JUL agent Java classes are packaged in a JAR file named +path:{liblttng-ust-jul.jar}. It is typically located in +dir:{/usr/lib/lttng/java}. To compile the snippet above +(saved as path:{Test.java}), do: + +[role="term"] +---- +javac -cp /usr/lib/lttng/java/liblttng-ust-jul.jar Test.java +---- + +You can run the resulting compiled class: + +[role="term"] +---- +java -cp /usr/lib/lttng/java/liblttng-ust-jul.jar:. Test +---- + +NOTE: http://openjdk.java.net/[OpenJDK] 7 is used for development and +continuous integration, thus this version is directly supported. +However, the LTTng-UST JUL agent has also been tested with OpenJDK 6. + + +[[instrumenting-linux-kernel]] +==== Linux kernel + +The Linux kernel can be instrumented for LTTng tracing, either its core +source code or a kernel module. It has to be noted that Linux is +readily traceable using LTTng since many parts of its source code are +already instrumented: this is the job of the upstream +http://git.lttng.org/?p=lttng-modules.git[LTTng-modules] +package. This section presents how to add LTTng instrumentation where it +does not currently exist and how to instrument custom kernel modules. + +All LTTng instrumentation in the Linux kernel is based on an existing +infrastructure which bears the name of its main macro, `TRACE_EVENT()`. +This macro is used to define tracepoints, +each tracepoint having a name, usually with the ++__subsys_____name__+ format, ++_subsys_+ being the subsystem name and ++_name_+ the specific event name. + +Tracepoints defined with `TRACE_EVENT()` may be inserted anywhere in +the Linux kernel source code, after what callbacks, called _probes_, +may be registered to execute some action when a tracepoint is +executed. This mechanism is directly used by ftrace and perf, +but cannot be used as is by LTTng: an adaptation layer is added to +satisfy LTTng's specific needs. + +With that in mind, this documentation does not cover the `TRACE_EVENT()` +format and how to use it, but it is mandatory to understand it and use +it to instrument Linux for LTTng. A series of +LWN articles explain +`TRACE_EVENT()` in details: +http://lwn.net/Articles/379903/[part 1], +http://lwn.net/Articles/381064/[part 2], and +http://lwn.net/Articles/383362/[part 3]. +Once you master `TRACE_EVENT()` enough for your use case, continue +reading this section so that you can add the LTTng adaptation layer of +instrumentation. + +This section first discusses the general method of instrumenting the +Linux kernel for LTTng. This method is then reused for the specific +case of instrumenting a kernel module. + + +[[instrumenting-linux-kernel-itself]] +===== Instrumenting the Linux kernel for LTTng + +The following subsections explain strictly how to add custom LTTng +instrumentation to the Linux kernel. They do not explain how the +macros actually work and the internal mechanics of the tracer. + +You should have a Linux kernel source code tree to work with. +Throughout this section, all file paths are relative to the root of +this tree unless otherwise stated. + +You will need a copy of the LTTng-modules Git repository: + +[role="term"] +---- +git clone git://git.lttng.org/lttng-modules.git +---- + +The steps to add custom LTTng instrumentation to a Linux kernel +involves defining and using the mainline `TRACE_EVENT()` tracepoints +first, then writing and using the LTTng adaptation layer. + + +[[mainline-trace-event]] +===== Defining/using tracepoints with mainline `TRACE_EVENT()` infrastructure + +The first step is to define tracepoints using the mainline Linux +`TRACE_EVENT()` macro and insert tracepoints where you want them. +Your tracepoint definitions reside in a header file in +dir:{include/trace/events}. If you're adding tracepoints to an existing +subsystem, edit its appropriate header file. + +As an example, the following header file (let's call it +path:{include/trace/events/hello.h}) defines one tracepoint using +`TRACE_EVENT()`: + +[source,c] +---- +/* subsystem name is "hello" */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM hello + +#if !defined(_TRACE_HELLO_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HELLO_H + +#include + +TRACE_EVENT( + /* "hello" is the subsystem name, "world" is the event name */ + hello_world, + + /* tracepoint function prototype */ + TP_PROTO(int foo, const char* bar), + + /* arguments for this tracepoint */ + TP_ARGS(foo, bar), + + /* LTTng doesn't need those */ + TP_STRUCT__entry(), + TP_fast_assign(), + TP_printk("", 0) +); + +#endif + +/* this part must be outside protection */ +#include +---- + +Notice that we don't use any of the last three arguments: they +are left empty here because LTTng doesn't need them. You would only fill +`TP_STRUCT__entry()`, `TP_fast_assign()` and `TP_printk()` if you were +to also use this tracepoint for ftrace/perf. + +Once this is done, you may place calls to `trace_hello_world()` +wherever you want in the Linux source code. As an example, let us place +such a tracepoint in the `usb_probe_device()` static function +(path:{drivers/usb/core/driver.c}): + +[source,c] +---- +/* called from driver core with dev locked */ +static int usb_probe_device(struct device *dev) +{ + struct usb_device_driver *udriver = to_usb_device_driver(dev->driver); + struct usb_device *udev = to_usb_device(dev); + int error = 0; + + trace_hello_world(udev->devnum, udev->product); + + /* ... */ +} +---- + +This tracepoint should fire every time a USB device is plugged in. + +At the top of path:{driver.c}, we need to include our actual tracepoint +definition and, in this case (one place per subsystem), define +`CREATE_TRACE_POINTS`, which will create our tracepoint: + +[source,c] +---- +/* ... */ + +#include "usb.h" + +#define CREATE_TRACE_POINTS +#include + +/* ... */ +---- + +Build your custom Linux kernel. In order to use LTTng, make sure the +following kernel configuration options are enabled: + +* `CONFIG_MODULES` (loadable module support) +* `CONFIG_KALLSYMS` (load all symbols for debugging/kksymoops) +* `CONFIG_HIGH_RES_TIMERS` (high resolution timer support) +* `CONFIG_TRACEPOINTS` (kernel tracepoint instrumentation) + +Boot the custom kernel. The directory +dir:{/sys/kernel/debug/tracing/events/hello} should exist if everything +went right, with a dir:{hello_world} subdirectory. + + +[[lttng-adaptation-layer]] +===== Adding the LTTng adaptation layer + +The steps to write the LTTng adaptation layer are, in your +LTTng-modules copy's source code tree: + +. In dir:{instrumentation/events/lttng-module}, + add a header +__subsys__.h+ for your custom + subsystem +__subsys__+ and write your + tracepoint definitions using LTTng-modules macros in it. + Those macros look like the mainline kernel equivalents, + but they present subtle, yet important differences. +. In dir:{probes}, create the C source file of the LTTng probe kernel + module for your subsystem. It should be named + +lttng-probe-__subsys__.c+. +. Edit path:{probes/Makefile} so that the LTTng-modules project + builds your custom LTTng probe kernel module. +. Build and install LTTng kernel modules. + +Following our `hello_world` event example, here's the content of +path:{instrumentation/events/lttng-module/hello.h}: + +[source,c] +---- +#undef TRACE_SYSTEM +#define TRACE_SYSTEM hello + +#if !defined(_TRACE_HELLO_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HELLO_H + +#include + +LTTNG_TRACEPOINT_EVENT( + /* format identical to mainline version for those */ + hello_world, + TP_PROTO(int foo, const char* bar), + TP_ARGS(foo, bar), + + /* possible differences */ + TP_STRUCT__entry( + __field(int, my_int) + __field(char, char0) + __field(char, char1) + __string(product, bar) + ), + + /* notice the use of tp_assign()/tp_strcpy() and no semicolons */ + TP_fast_assign( + tp_assign(my_int, foo) + tp_assign(char0, bar[0]) + tp_assign(char1, bar[1]) + tp_strcpy(product, bar) + ), + + /* This one is actually not used by LTTng either, but must be + * present for the moment. + */ + TP_printk("", 0) + +/* no semicolon after this either */ +) + +#endif + +/* other difference: do NOT include */ +#include "../../../probes/define_trace.h" +---- + +Some possible entries for `TP_STRUCT__entry()` and `TP_fast_assign()`, +in the case of LTTng-modules, are shown in the +<> section. + +The best way to learn how to use the above macros is to inspect +existing LTTng tracepoint definitions in +dir:{instrumentation/events/lttng-module} header files. Compare +them with the Linux kernel mainline versions in +dir:{include/trace/events}. + +The next step is writing the LTTng probe kernel module C source file. +This one is named +lttng-probe-__subsys__.c+ +in dir:{probes}. You may always use the following template: + +[source,c] +---- +#include +#include "../lttng-tracer.h" + +/* Build time verification of mismatch between mainline TRACE_EVENT() + * arguments and LTTng adaptation layer LTTNG_TRACEPOINT_EVENT() arguments. + */ +#include + +/* create LTTng tracepoint probes */ +#define LTTNG_PACKAGE_BUILD +#define CREATE_TRACE_POINTS +#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module + +#include "../instrumentation/events/lttng-module/hello.h" + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Your name "); +MODULE_DESCRIPTION("LTTng hello probes"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION); +---- + +Just replace `hello` with your subsystem name. In this example, +``, which is the original mainline tracepoint +definition header, is included for verification purposes: the +LTTng-modules build system is able to emit an error at build time when +the arguments of the mainline `TRACE_EVENT()` definitions do not match +the ones of the LTTng-modules adaptation layer +(`LTTNG_TRACEPOINT_EVENT()`). + +Edit path:{probes/Makefile} and add your new kernel module object +next to existing ones: + +[source,make] +---- +# ... + +obj-m += lttng-probe-module.o +obj-m += lttng-probe-power.o + +obj-m += lttng-probe-hello.o + +# ... +---- + +Time to build! Point to your custom Linux kernel source tree using +the `KERNELDIR` variable: + +[role="term"] +---- +make KERNELDIR=/path/to/custom/linux +---- + +Finally, install modules: + +[role="term"] +---- +sudo make modules_install +---- + + +[[instrumenting-linux-kernel-tracing]] +===== Tracing + +The <> section explains +how to use the `lttng` tool to create and control tracing sessions. +Although the `lttng` tool will load the appropriate _known_ LTTng kernel +modules when needed (by launching `root`'s session daemon), it won't +load your custom `lttng-probe-hello` module by default. You need to +manually load the `lttng-probe-hello` module, and start an LTTng session +daemon as `root`: + +[role="term"] +---- +sudo pkill -u root lttng-sessiond +sudo modprobe lttng_probe_hello +sudo lttng-sessiond +---- + +The first command makes sure any existing instance is killed. If +you're not interested in using the default probes, or if you only +want to use a few of them, you can use the `--kmod-probes` option +of `lttng-sessiond` instead, which specifies an absolute list of +probes to load (without the `lttng-probe-` prefix): + +[role="term"] +---- +sudo lttng-sessiond --kmod-probes=hello,ext4,net,block,signal,sched +---- + +Confirm the custom probe module is loaded: + +[role="term"] +---- +lsmod | grep lttng_probe_hello +---- + +The `hello_world` event should appear in the list when doing + +[role="term"] +---- +lttng list --kernel | grep hello +---- + +You may now create an LTTng tracing session, enable the `hello_world` +kernel event (and others if you wish) and start tracing: + +[role="term"] +---- +sudo lttng create my-session +sudo lttng enable-event --kernel hello_world +sudo lttng start +---- + +Plug a few USB devices, then stop tracing and inspect the trace (if +http://diamon.org/babeltrace[Babeltrace] +is installed): + +[role="term"] +---- +sudo lttng stop +sudo lttng view +---- + +Here's a sample output: + +---- +[15:30:34.835895035] (+?.?????????) hostname hello_world: { cpu_id = 1 }, { my_int = 8, char0 = 68, char1 = 97, product = "DataTraveler 2.0" } +[15:30:42.262781421] (+7.426886386) hostname hello_world: { cpu_id = 1 }, { my_int = 9, char0 = 80, char1 = 97, product = "Patriot Memory" } +[15:30:48.175621778] (+5.912840357) hostname hello_world: { cpu_id = 1 }, { my_int = 10, char0 = 68, char1 = 97, product = "DataTraveler 2.0" } +---- + +Two USB flash drives were used for this test. + +You may change your LTTng custom probe, rebuild it and reload it at +any time when not tracing. Make sure you remove the old module +(either by killing the root LTTng session daemon which loaded the +module in the first place (if you used `--kmod-probes`), or by +using `modprobe --remove` directly) before loading the updated one. + + +[[instrumenting-out-of-tree-linux-kernel]] +===== Advanced: Instrumenting an out-of-tree Linux kernel module for LTTng + +Instrumenting a custom Linux kernel module for LTTng follows the exact +same steps as +<>, +the only difference being that your mainline tracepoint definition +header doesn't reside in the mainline source tree, but in your +kernel module source tree. + +The only reference to this mainline header is in the LTTng custom +probe's source code (path:{probes/lttng-probe-hello.c} in our example), +for build time verification: + +[source,c] +---- +/* ... */ + +/* Build time verification of mismatch between mainline TRACE_EVENT() + * arguments and LTTng adaptation layer LTTNG_TRACEPOINT_EVENT() arguments. + */ +#include + +/* ... */ +---- + +The preferred, flexible way to include your module's mainline +tracepoint definition header is to put it in a specific directory +relative to your module's root, e.g., dir:{tracepoints}, and include it +relative to your module's root directory in the LTTng custom probe's +source: + +[source,c] +---- +#include +---- + +You may then build LTTng-modules by adding your module's root +directory as an include path to the extra C flags: + +[role="term"] +---- +make ccflags-y=-I/path/to/kernel/module KERNELDIR=/path/to/custom/linux +---- + +Using `ccflags-y` allows you to move your kernel module to another +directory and rebuild the LTTng-modules project with no change to +source files. + + +[[proc-lttng-logger-abi]] +==== LTTng logger ABI + +The `lttng-tracer` Linux kernel module, installed by the LTTng-modules +package, creates a special LTTng logger ABI file path:{/proc/lttng-logger} +when loaded. Writing text data to this file generates an LTTng kernel +domain event named `lttng_logger`. + +Unlike other kernel domain events, `lttng_logger` may be enabled by +any user, not only root users or members of the tracing group. + +To use the LTTng logger ABI, simply write a string to +path:{/proc/lttng-logger}: + +[role="term"] +---- +echo -n 'Hello, World!' > /proc/lttng-logger +---- + +The `msg` field of the `lttng_logger` event contains the recorded +message. + +NOTE: Messages are split in chunks of 1024{nbsp}bytes. + +The LTTng logger ABI is a quick and easy way to trace some events from +user space through the kernel tracer. However, it is much more basic +than LTTng-UST: it's slower (involves system call round-trip to the +kernel and only supports logging strings). The LTTng logger ABI is +particularly useful for recording logs as LTTng traces from shell +scripts, potentially combining them with other Linux kernel/user space +events. + + +[[instrumenting-32-bit-app-on-64-bit-system]] +==== Advanced: Instrumenting a 32-bit application on a 64-bit system + +[[advanced-instrumenting-techniques]]In order to trace a 32-bit +application running on a 64-bit system, +LTTng must use a dedicated 32-bit +<>. This section discusses how to +build that daemon (which is _not_ part of the default 64-bit LTTng +build) and the LTTng 32-bit tracing libraries, and how to instrument +a 32-bit application in that context. + +Make sure you install all 32-bit versions of LTTng dependencies. +Their names can be found in the path:{README.md} files of each LTTng package +source. How to find and install them will vary depending on your target +Linux distribution. `gcc-multilib` is a common package name for the +multilib version of GCC, which you will also need. + +The following packages will be built for 32-bit support on a 64-bit +system: http://urcu.so/[Userspace RCU], +LTTng-UST and LTTng-tools. + + +[[building-32-bit-userspace-rcu]] +===== Building 32-bit Userspace RCU + +Follow this: + +[role="term"] +---- +git clone git://git.urcu.so/urcu.git +cd urcu +./bootstrap +./configure --libdir=/usr/lib32 CFLAGS=-m32 +make +sudo make install +sudo ldconfig +---- + +The `-m32` C compiler flag creates 32-bit object files and `--libdir` +indicates where to install the resulting libraries. + + +[[building-32-bit-lttng-ust]] +===== Building 32-bit LTTng-UST + +Follow this: + +[role="term"] +---- +git clone http://git.lttng.org/lttng-ust.git +cd lttng-ust +./bootstrap +./configure --prefix=/usr \ + --libdir=/usr/lib32 \ + CFLAGS=-m32 CXXFLAGS=-m32 \ + LDFLAGS=-L/usr/lib32 +make +sudo make install +sudo ldconfig +---- + +`-L/usr/lib32` is required for the build to find the 32-bit versions +of Userspace RCU and other dependencies. + +[NOTE] +==== +Depending on your Linux distribution, +32-bit libraries could be installed at a different location than +dir:{/usr/lib32}. For example, Debian is known to install +some 32-bit libraries in dir:{/usr/lib/i386-linux-gnu}. + +In this case, make sure to set `LDFLAGS` to all the +relevant 32-bit library paths, e.g., +`LDFLAGS="-L/usr/lib32 -L/usr/lib/i386-linux-gnu"`. +==== + +NOTE: You may add options to path:{./configure} if you need them, e.g., for +Java and SystemTap support. Look at `./configure --help` for more +information. + + +[[building-32-bit-lttng-tools]] +===== Building 32-bit LTTng-tools + +Since the host is a 64-bit system, most 32-bit binaries and libraries of +LTTng-tools are not needed; the host will use their 64-bit counterparts. +The required step here is building and installing a 32-bit consumer +daemon. + +Follow this: + +[role="term"] +---- +git clone http://git.lttng.org/lttng-tools.git +cd lttng-ust +./bootstrap +./configure --prefix=/usr \ + --libdir=/usr/lib32 CFLAGS=-m32 CXXFLAGS=-m32 \ + LDFLAGS=-L/usr/lib32 +make +cd src/bin/lttng-consumerd +sudo make install +sudo ldconfig +---- + +The above commands build all the LTTng-tools project as 32-bit +applications, but only installs the 32-bit consumer daemon. + + +[[building-64-bit-lttng-tools]] +===== Building 64-bit LTTng-tools + +Finally, you need to build a 64-bit version of LTTng-tools which is +aware of the 32-bit consumer daemon previously built and installed: + +[role="term"] +---- +make clean +./bootstrap +./configure --prefix=/usr \ + --with-consumerd32-libdir=/usr/lib32 \ + --with-consumerd32-bin=/usr/lib32/lttng/libexec/lttng-consumerd +make +sudo make install +sudo ldconfig +---- + +Henceforth, the 64-bit session daemon will automatically find the +32-bit consumer daemon if required. + + +[[building-instrumented-32-bit-c-application]] +===== Building an instrumented 32-bit C application + +Let us reuse the _Hello world_ example of +<> +(<> chapter). + +The instrumentation process is unaltered. + +First, a typical 64-bit build (assuming you're running a 64-bit system): + +[role="term"] +---- +gcc -o hello64 -I. hello.c hello-tp.c -ldl -llttng-ust +---- + +Now, a 32-bit build: + +[role="term"] +---- +gcc -o hello32 -I. -m32 hello.c hello-tp.c -L/usr/lib32 \ + -ldl -llttng-ust -Wl,-rpath,/usr/lib32 +---- + +The `-rpath` option, passed to the linker, will make the dynamic loader +check for libraries in dir:{/usr/lib32} before looking in its default paths, +where it should find the 32-bit version of `liblttng-ust`. + + +[[running-32-bit-and-64-bit-c-applications]] +===== Running 32-bit and 64-bit versions of an instrumented C application + +Now, both 32-bit and 64-bit versions of the _Hello world_ example above +can be traced in the same tracing session. Use the `lttng` tool as usual +to create a tracing session and start tracing: + +[role="term"] +---- +lttng create session-3264 +lttng enable-event -u -a +./hello32 +./hello64 +lttng stop +---- + +Use `lttng view` to verify both processes were +successfully traced. + + +[[controlling-tracing]] +=== Controlling tracing + +Once you're in possession of a software that is properly +<> for LTTng tracing, be it thanks to +the built-in LTTng probes for the Linux kernel, a custom user +application or a custom Linux kernel, all that is left is actually +tracing it. As a user, you control LTTng tracing using a single command +line interface: the `lttng` tool. This tool uses `liblttng-ctl` behind +the scene to connect to and communicate with session daemons. LTTng +session daemons may either be started manually (`lttng-sessiond`) or +automatically by the `lttng` command when needed. Trace data may +be forwarded to the network and used elsewhere using an LTTng relay +daemon (`lttng-relayd`). + +The manpages of `lttng`, `lttng-sessiond` and `lttng-relayd` are pretty +complete, thus this section is not an online copy of the latter (we +leave this contents for the +<> section). +This section is rather a tour of LTTng +features through practical examples and tips. + +If not already done, make sure you understand the core concepts +and how LTTng components connect together by reading the +<> chapter; this section +assumes you are familiar with them. + + +[[creating-destroying-tracing-sessions]] +==== Creating and destroying tracing sessions + +Whatever you want to do with `lttng`, it has to happen inside a +**tracing session**, created beforehand. A session, in general, is a +per-user container of state. A tracing session is no different; it +keeps a specific state of stuff like: + +* session name +* enabled/disabled channels with associated parameters +* enabled/disabled events with associated log levels and filters +* context information added to channels +* tracing activity (started or stopped) + +and more. + +A single user may have many active tracing sessions. LTTng session +daemons are the ultimate owners and managers of tracing sessions. For +user space tracing, each user has its own session daemon. Since Linux +kernel tracing requires root privileges, only `root`'s session daemon +may enable and trace kernel events. However, `lttng` has a `--group` +option (which is passed to `lttng-sessiond` when starting it) to +specify the name of a _tracing group_ which selected users may be part +of to be allowed to communicate with `root`'s session daemon. By +default, the tracing group name is `tracing`. + +To create a tracing session, do: + +[role="term"] +---- +lttng create my-session +---- + +This will create a new tracing session named `my-session` and make it +the current one. If you don't specify any name (calling only +`lttng create`), your tracing session will be named `auto`. Traces +are written in +\~/lttng-traces/__session__-+ followed +by the tracing session's creation date/time by default, where ++__session__+ is the tracing session name. To save them +at a different location, use the `--output` option: + +[role="term"] +---- +lttng create --output /tmp/some-directory my-session +---- + +You may create as many tracing sessions as you wish: + +[role="term"] +---- +lttng create other-session +lttng create yet-another-session +---- + +You may view all existing tracing sessions using the `list` command: + +[role="term"] +---- +lttng list +---- + +The state of a _current tracing session_ is kept in path:{~/.lttngrc}. Each +invocation of `lttng` reads this file to set its current tracing +session name so that you don't have to specify a session name for each +command. You could edit this file manually, but the preferred way to +set the current tracing session is to use the `set-session` command: + +[role="term"] +---- +lttng set-session other-session +---- + +Most `lttng` commands accept a `--session` option to specify the name +of the target tracing session. + +Any existing tracing session may be destroyed using the `destroy` +command: + +[role="term"] +---- +lttng destroy my-session +---- + +Providing no argument to `lttng destroy` will destroy the current +tracing session. Destroying a tracing session will stop any tracing +running within the latter. Destroying a tracing session frees resources +acquired by the session daemon and tracer side, making sure to flush +all trace data. + +You can't do much with LTTng using only the `create`, `set-session` +and `destroy` commands of `lttng`, but it is essential to know them in +order to control LTTng tracing, which always happen within the scope of +a tracing session. + + +[[enabling-disabling-events]] +==== Enabling and disabling events + +Inside a tracing session, individual events may be enabled or disabled +so that tracing them may or may not generate trace data. + +We sometimes use the term _event_ metonymically throughout this text to +refer to a specific condition, or _rule_, that could lead, when +satisfied, to an actual occurring event (a point at a specific position +in source code/binary program, logical processor and time capturing +some payload) being recorded as trace data. This specific condition is +composed of: + +. A **domain** (kernel, user space or `java.util.logging`) (required). +. One or many **instrumentation points** in source code or binary + program (tracepoint name, address, symbol name, function name, + logger name, etc.) to be executed (required). +. A **log level** (each instrumentation point declares its own log + level) or log level range to match (optional; only valid for user + space domain). +. A **custom user expression**, or **filter**, that must evaluate to + _true_ when a tracepoint is executed (optional; only valid for user + space domain). + +All conditions are specified using arguments passed to the +`enable-event` command of the `lttng` tool. + +Condition 1 is specified using either `--kernel/-k` (kernel), +`--userspace/-u` (user space) or `--jul/-j` +(JUL). Exactly one of those +three arguments must be specified. + +Condition 2 is specified using one of: + +`--tracepoint`:: + Tracepoint. + +`--probe`:: + Dynamic probe (address, symbol name or combination + of both in binary program; only valid for kernel domain). + +`--function`:: + function entry/exit (address, symbol name or + combination of both in binary program; only valid for kernel domain). + +`--syscall`:: + System call entry/exit (only valid for kernel domain). + +When none of the above is specified, `enable-event` defaults to +using `--tracepoint`. + +Condition 3 is specified using one of: + +`--loglevel`:: + Log level range from the specified level to the most severe + level. + +`--loglevel-only`:: + Specific log level. + +See `lttng enable-event --help` for the complete list of log level +names. + +Condition 4 is specified using the `--filter` option. This filter is +a C-like expression, potentially reading real-time values of event +fields, that has to evaluate to _true_ for the condition to be satisfied. +Event fields are read using plain identifiers while context fields +must be prefixed with `$ctx.`. See `lttng enable-event --help` for +all usage details. + +The aforementioned arguments are combined to create and enable events. +Each unique combination of arguments leads to a different +_enabled event_. The log level and filter arguments are optional, their +default values being respectively all log levels and a filter which +always returns _true_. + +Here are a few examples (you must +<> +first): + +[role="term"] +---- +lttng enable-event -u --tracepoint my_app:hello_world +lttng enable-event -u --tracepoint my_app:hello_you --loglevel TRACE_WARNING +lttng enable-event -u --tracepoint 'my_other_app:*' +lttng enable-event -u --tracepoint my_app:foo_bar \ + --filter 'some_field <= 23 && !other_field' +lttng enable-event -k --tracepoint sched_switch +lttng enable-event -k --tracepoint gpio_value +lttng enable-event -k --function usb_probe_device usb_probe_device +lttng enable-event -k --syscall --all +---- + +The wildcard symbol, `*`, matches _anything_ and may only be used at +the end of the string when specifying a _tracepoint_. Make sure to +use it between single quotes in your favorite shell to avoid +undesired shell expansion. + +You can see a list of events (enabled or disabled) using + +[role="term"] +---- +lttng list some-session +---- + +where `some-session` is the name of the desired tracing session. + +What you're actually doing when enabling events with specific conditions +is creating a **whitelist** of traceable events for a given channel. +Thus, the following case presents redundancy: + +[role="term"] +---- +lttng enable-event -u --tracepoint my_app:hello_you +lttng enable-event -u --tracepoint my_app:hello_you --loglevel TRACE_DEBUG +---- + +The second command, matching a log level range, is useless since the first +command enables all tracepoints matching the same name, +`my_app:hello_you`. + +Disabling an event is simpler: you only need to provide the event +name to the `disable-event` command: + +[role="term"] +---- +lttng disable-event --userspace my_app:hello_you +---- + +This name has to match a name previously given to `enable-event` (it +has to be listed in the output of `lttng list some-session`). +The `*` wildcard is supported, as long as you also used it in a +previous `enable-event` invocation. + +Disabling an event does not add it to some blacklist: it simply removes +it from its channel's whitelist. This is why you cannot disable an event +which wasn't previously enabled. + +A disabled event will not generate any trace data, even if all its +specified conditions are met. + +Events may be enabled and disabled at will, either when LTTng tracers +are active or not. Events may be enabled before a user space application +is even started. + + +[[basic-tracing-session-control]] +==== Basic tracing session control + +Once you have +<> +and <>, +you may activate the LTTng tracers for the current tracing session at +any time: + +[role="term"] +---- +lttng start +---- + +Subsequently, you may stop the tracers: + +[role="term"] +---- +lttng stop +---- + +LTTng is very flexible: user space applications may be launched before +or after the tracers are started. Events will only be recorded if they +are properly enabled and if they occur while tracers are started. + +A tracing session name may be passed to both the `start` and `stop` +commands to start/stop tracing a session other than the current one. + + +[[enabling-disabling-channels]] +==== Enabling and disabling channels + +<> in the +<> chapter, enabled +events are contained in a specific channel, itself contained in a +specific tracing session. A channel is a group of events with +tunable parameters (event loss mode, sub-buffer size, number of +sub-buffers, trace file sizes and count, etc.). A given channel may +only be responsible for enabled events belonging to one domain: either +kernel or user space. + +If you only used the `create`, `enable-event` and `start`/`stop` +commands of the `lttng` tool so far, one or two channels were +automatically created for you (one for the kernel domain and/or one +for the user space domain). The default channels are both named +`channel0`; channels from different domains may have the same name. + +The current channels of a given tracing session can be viewed with + +[role="term"] +---- +lttng list some-session +---- + +where `some-session` is the name of the desired tracing session. + +To create and enable a channel, use the `enable-channel` command: + +[role="term"] +---- +lttng enable-channel --kernel my-channel +---- + +This will create a kernel domain channel named `my-channel` with +default parameters in the current tracing session. + +[NOTE] +==== +Because of a current limitation, all +channels must be _created_ prior to beginning tracing in a +given tracing session, i.e. before the first time you do +`lttng start`. + +Since a channel is automatically created by +`enable-event` only for the specified domain, you cannot, +for example, enable a kernel domain event, start tracing and then +enable a user space domain event because no user space channel +exists yet and it's too late to create one. + +For this reason, make sure to configure your channels properly +before starting the tracers for the first time! +==== + +Here's another example: + +[role="term"] +---- +lttng enable-channel --userspace --session other-session --overwrite \ + --tracefile-size 1048576 1mib-channel +---- + +This will create a user space domain channel named `1mib-channel` in +the tracing session named `other-session` that loses new events by +overwriting previously recorded events (instead of the default mode of +discarding newer ones) and saves trace files with a maximum size of +1{nbsp}MiB each. + +Note that channels may also be created using the `--channel` option of +the `enable-event` command when the provided channel name doesn't exist +for the specified domain: + +[role="term"] +---- +lttng enable-event --kernel --channel some-channel sched_switch +---- + +If no kernel domain channel named `some-channel` existed before calling +the above command, it would be created with default parameters. + +You may enable the same event in two different channels: + +[role="term"] +---- +lttng enable-event --userspace --channel my-channel app:tp +lttng enable-event --userspace --channel other-channel app:tp +---- + +If both channels are enabled, the occurring `app:tp` event will +generate two recorded events, one for each channel. + +Disabling a channel is done with the `disable-event` command: + +[role="term"] +---- +lttng disable-event --kernel some-channel +---- + +The state of a channel precedes the individual states of events within +it: events belonging to a disabled channel, even if they are +enabled, won't be recorded. + + + +[[fine-tuning-channels]] +===== Fine-tuning channels + +There are various parameters that may be fine-tuned with the +`enable-channel` command. The latter are well documented in +man:lttng(1) and in the <> section of the +<> chapter. For basic +tracing needs, their default values should be just fine, but here are a +few examples to break the ice. + +As the frequency of recorded events increases--either because the +event throughput is actually higher or because you enabled more events +than usual—__event loss__ might be experienced. Since LTTng never +waits, by design, for sub-buffer space availability (non-blocking +tracer), when a sub-buffer is full and no empty sub-buffers are left, +there are two possible outcomes: either the new events that do not fit +are rejected, or they start replacing the oldest recorded events. +The choice of which algorithm to use is a per-channel parameter, the +default being discarding the newest events until there is some space +left. If your situation always needs the latest events at the expense +of writing over the oldest ones, create a channel with the `--overwrite` +option: + +[role="term"] +---- +lttng enable-channel --kernel --overwrite my-channel +---- + +When an event is lost, it means no space was available in any +sub-buffer to accommodate it. Thus, if you want to cope with sporadic +high event throughput situations and avoid losing events, you need to +allocate more room for storing them in memory. This can be done by +either increasing the size of sub-buffers or by adding sub-buffers. +The following example creates a user space domain channel with +16{nbsp}sub-buffers of 512{nbsp}kiB each: + +[role="term"] +---- +lttng enable-channel --userspace --num-subbuf 16 --subbuf-size 512k big-channel +---- + +Both values need to be powers of two, otherwise they are rounded up +to the next one. + +Two other interesting available parameters of `enable-channel` are +`--tracefile-size` and `--tracefile-count`, which respectively limit +the size of each trace file and the their count for a given channel. +When the number of written trace files reaches its limit for a given +channel-CPU pair, the next trace file will overwrite the very first +one. The following example creates a kernel domain channel with a +maximum of three trace files of 1{nbsp}MiB each: + +[role="term"] +---- +lttng enable-channel --kernel --tracefile-size 1M --tracefile-count 3 my-channel +---- + +An efficient way to make sure lots of events are generated is enabling +all kernel events in this channel and starting the tracer: + +[role="term"] +---- +lttng enable-event --kernel --all --channel my-channel +lttng start +---- + +After a few seconds, look at trace files in your tracing session +output directory. For two CPUs, it should look like: + +---- +my-channel_0_0 my-channel_1_0 +my-channel_0_1 my-channel_1_1 +my-channel_0_2 my-channel_1_2 +---- + +Amongst the files above, you might see one in each group with a size +lower than 1{nbsp}MiB: they are the files currently being written. + +Since all those small files are valid LTTng trace files, LTTng trace +viewers may read them. It is the viewer's responsibility to properly +merge the streams so as to present an ordered list to the user. +http://diamon.org/babeltrace[Babeltrace] +merges LTTng trace files correctly and is fast at doing it. + + +[[adding-context]] +==== Adding some context to channels + +If you read all the sections of +<> so far, you should be +able to create tracing sessions, create and enable channels and events +within them and start/stop the LTTng tracers. Event fields recorded in +trace files provide important information about occurring events, but +sometimes external context may help you solve a problem faster. This +section discusses how to add context information to events of a +specific channel using the `lttng` tool. + +There are various available context values which can accompany events +recorded by LTTng, for example: + +* **process information**: +** identifier (PID) +** name +** priority +** scheduling priority (niceness) +** thread identifier (TID) +* the **hostname** of the system on which the event occurred +* plenty of **performance counters** using perf: +** CPU cycles, stalled cycles, idle cycles, etc. +** cache misses +** branch instructions, misses, loads, etc. +** CPU faults +** etc. + +The full list is available in the output of `lttng add-context --help`. +Some of them are reserved for a specific domain (kernel or +user space) while others are available for both. + +To add context information to one or all channels of a given tracing +session, use the `add-context` command: + +[role="term"] +---- +lttng add-context --userspace --type vpid --type perf:thread:cpu-cycles +---- + +The above example adds the virtual process identifier and per-thread +CPU cycles count values to all recorded user space domain events of the +current tracing session. Use the `--channel` option to select a specific +channel: + +[role="term"] +---- +lttng add-context --kernel --channel my-channel --type tid +---- + +adds the thread identifier value to all recorded kernel domain events +in the channel `my-channel` of the current tracing session. + +Beware that context information cannot be removed from channels once +it's added for a given tracing session. + + +[[saving-loading-tracing-session]] +==== Saving and loading tracing session configurations + +Configuring a tracing session may be long: creating and enabling +channels with specific parameters, enabling kernel and user space +domain events with specific log levels and filters, adding context +to some channels, etc. If you're going to use LTTng to solve real +world problems, chances are you're going to have to record events using +the same tracing session setup over and over, modifying a few variables +each time in your instrumented program or environment. To avoid +constant tracing session reconfiguration, the `lttng` tool is able to +save and load tracing session configurations to/from XML files. + +To save a given tracing session configuration, do: + +[role="term"] +---- +lttng save my-session +---- + +where `my-session` is the name of the tracing session to save. Tracing +session configurations are saved to dir:{~/.lttng/sessions} by default; +use the `--output-path` option to change this destination directory. + +All configuration parameters are saved: + +* tracing session name +* trace data output path +* channels with their state and all their parameters +* context information added to channels +* events with their state, log level and filter +* tracing activity (started or stopped) + +To load a tracing session, simply do: + +[role="term"] +---- +lttng load my-session +---- + +or, if you used a custom path: + +[role="term"] +---- +lttng load --input-path /path/to/my-session.lttng +---- + +Your saved tracing session will be restored as if you just configured +it manually. + + +[[sending-trace-data-over-the-network]] +==== Sending trace data over the network + +The possibility of sending trace data over the network comes as a +built-in feature of LTTng-tools. For this to be possible, an LTTng +_relay daemon_ must be executed and listening on the machine where +trace data is to be received, and the user must create a tracing +session using appropriate options to forward trace data to the remote +relay daemon. + +The relay daemon listens on two different TCP ports: one for control +information and the other for actual trace data. + +Starting the relay daemon on the remote machine is as easy as: + +[role="term"] +---- +lttng-relayd +---- + +This will make it listen to its default ports: 5342 for control and +5343 for trace data. The `--control-port` and `--data-port` options may +be used to specify different ports. + +Traces written by `lttng-relayd` are written to ++\~/lttng-traces/__hostname__/__session__+ by +default, where +__hostname__+ is the host name of the +traced (monitored) system and +__session__+ is the +tracing session name. Use the `--output` option to write trace data +outside dir:{~/lttng-traces}. + +On the sending side, a tracing session must be created using the +`lttng` tool with the `--set-url` option to connect to the distant +relay daemon: + +[role="term"] +---- +lttng create my-session --set-url net://distant-host +---- + +The URL format is described in the output of `lttng create --help`. +The above example will use the default ports; the `--ctrl-url` and +`--data-url` options may be used to set the control and data URLs +individually. + +Once this basic setup is completed and the connection is established, +you may use the `lttng` tool on the target machine as usual; everything +you do will be transparently forwarded to the remote machine if needed. +For example, a parameter changing the maximum size of trace files will +have an effect on the distant relay daemon actually writing the trace. + + +[[lttng-live]] +==== Viewing events as they arrive + +We have seen how trace files may be produced by LTTng out of generated +application and Linux kernel events. We have seen that those trace files +may be either recorded locally by consumer daemons or remotely using +a relay daemon. And we have seen that the maximum size and count of +trace files is configurable for each channel. With all those features, +it's still not possible to read a trace file as it is being written +because it could be incomplete and appear corrupted to the viewer. +There is a way to view events as they arrive, however: using +_LTTng live_. + +LTTng live is implemented, in LTTng, solely on the relay daemon side. +As trace data is sent over the network to a relay daemon by a (possibly +remote) consumer daemon, a _tee_ may be created: trace data will be +recorded to trace files _as well as_ being transmitted to a +connected live viewer: + +[role="img-90"] +.LTTng live and the relay daemon. +image::lttng-live-relayd.png[] + +In order to use this feature, a tracing session must created in live +mode on the target system: + +[role="term"] +---- +lttng create --live +---- + +An optional parameter may be passed to `--live` to set the interval +of time (in microseconds) between flushes to the network +(1{nbsp}second is the default): + +[role="term"] +---- +lttng create --live 100000 +---- + +will flush every 100{nbsp}ms. + +If no network output is specified to the `create` command, a local +relay daemon will be spawned. In this very common case, viewing a live +trace is easy: enable events and start tracing as usual, then use +`lttng view` to start the default live viewer: + +[role="term"] +---- +lttng view +---- + +The correct arguments will be passed to the live viewer so that it +may connect to the local relay daemon and start reading live events. + +You may also wish to use a live viewer not running on the target +system. In this case, you should specify a network output when using +the `create` command (`--set-url` or `--ctrl-url`/`--data-url` options). +A distant LTTng relay daemon should also be started to receive control +and trace data. By default, `lttng-relayd` listens on 127.0.0.1:5344 +for an LTTng live connection. Otherwise, the desired URL may be +specified using its `--live-port` option. + +The +http://diamon.org/babeltrace[`babeltrace`] +viewer supports LTTng live as one of its input formats. `babeltrace` is +the default viewer when using `lttng view`. To use it manually, first +list active tracing sessions by doing the following (assuming the relay +daemon to connect to runs on the same host): + +[role="term"] +---- +babeltrace --input-format lttng-live net://localhost +---- + +Then, choose a tracing session and start viewing events as they arrive +using LTTng live, e.g.: + +[role="term"] +---- +babeltrace --input-format lttng-live net://localhost/host/hostname/my-session +---- + + +[[taking-a-snapshot]] +==== Taking a snapshot + +The normal behavior of LTTng is to record trace data as trace files. +This is ideal for keeping a long history of events that occurred on +the target system and applications, but may be too much data in some +situations. For example, you may wish to trace your application +continuously until some critical situation happens, in which case you +would only need the latest few recorded events to perform the desired +analysis, not multi-gigabyte trace files. + +LTTng has an interesting feature called _snapshots_. When creating +a tracing session in snapshot mode, no trace files are written; the +tracers' sub-buffers are constantly overwriting the oldest recorded +events with the newest. At any time, either when the tracers are started +or stopped, you may take a snapshot of those sub-buffers. + +There is no difference between the format of a normal trace file and the +format of a snapshot: viewers of LTTng traces will also support LTTng +snapshots. By default, snapshots are written to disk, but they may also +be sent over the network. + +To create a tracing session in snapshot mode, do: + +[role="term"] +---- +lttng create --snapshot my-snapshot-session +---- + +Next, enable channels, events and add context to channels as usual. +Once a tracing session is created in snapshot mode, channels will be +forced to use the +<> mode +(`--overwrite` option of the `enable-channel` command; also called +_flight recorder mode_) and have an `mmap()` channel type +(`--output mmap`). + +Start tracing. When you're ready to take a snapshot, do: + +[role="term"] +---- +lttng snapshot record --name my-snapshot +---- + +This will record a snapshot named `my-snapshot` of all channels of +all domains of the current tracing session. By default, snapshots files +are recorded in the path returned by `lttng snapshot list-output`. You +may change this path or decide to send snapshots over the network +using either: + +. an output path/URL specified when creating the tracing session + (`lttng create`) +. an added snapshot output path/URL using + `lttng snapshot add-output` +. an output path/URL provided directly to the + `lttng snapshot record` command + +Method 3 overrides method 2 which overrides method 1. When specifying +a URL, a relay daemon must be listening on some machine (see +<>). + +If you need to make absolutely sure that the output file won't be +larger than a certain limit, you can set a maximum snapshot size when +taking it with the `--max-size` option: + +[role="term"] +---- +lttng snapshot record --name my-snapshot --max-size 2M +---- + +Older recorded events will be discarded in order to respect this +maximum size. + + +[[reference]] +== Reference + +This chapter presents various references for LTTng packages such as links +to online manpages, tables needed by the rest of the text, descriptions +of library functions, etc. + + +[[online-lttng-manpages]] +=== Online LTTng manpages + +LTTng packages currently install the following manpages, available +online using the links below: + +* **LTTng-tools** +** man:lttng(1) +** man:lttng-sessiond(8) +** man:lttng-relayd(8) +* **LTTng-UST** +** man:lttng-gen-tp(1) +** man:lttng-ust(3) +** man:lttng-ust-cyg-profile(3) +** man:lttng-ust-dl(3) + + +[[lttng-ust-ref]] +=== LTTng-UST + +This section presents references of the LTTng-UST package. + + +[[liblttng-ust]] +==== LTTng-UST library (+liblttng‑ust+) + +The LTTng-UST library, or `liblttng-ust`, is the main shared object +against which user applications are linked to make LTTng user space +tracing possible. + +The <> guide shows the complete +process to instrument, build and run a C/$$C++$$ application using +LTTng-UST, while this section contains a few important tables. + + +[[liblttng-ust-tp-fields]] +===== Tracepoint fields macros (for `TP_FIELDS()`) + +The available macros to define tracepoint fields, which should be listed +within `TP_FIELDS()` in `TRACEPOINT_EVENT()`, are: + +[role="growable func-desc",cols="asciidoc,asciidoc"] +.Available macros to define LTTng-UST tracepoint fields +|==== +|Macro |Description and parameters + +| ++ctf_integer(__t__, __n__, __e__)+ + ++ctf_integer_nowrite(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 10. + ++__t__+:: + Integer C type (`int`, `long`, `size_t`, etc.). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_hex(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_network(__t__, __n__, __e__)+ +| +Integer in network byte order (big endian), displayed in base 10. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_network_hex(__t__, __n__, __e__)+ +| +Integer in network byte order, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_float(__t__, __n__, __e__)+ + ++ctf_float_nowrite(__t__, __n__, __e__)+ +| +Floating point number. + ++__t__+:: + Floating point number C type (`float` or `double`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_string(__n__, __e__)+ + ++ctf_string_nowrite(__n__, __e__)+ +| +Null-terminated string; undefined behavior if +__e__+ is `NULL`. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_array(__t__, __n__, __e__, __s__)+ + ++ctf_array_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array of integers + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_array_text(__t__, __n__, __e__, __s__)+ + ++ctf_array_text_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array, printed as text. + +The string does not need to be null-terminated. + ++__t__+:: + Array element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_sequence(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array of integers. + +The type of +__E__+ needs to be unsigned. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. + +| ++ctf_sequence_text(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array, displayed as text. + +The string does not need to be null-terminated. + +The type of +__E__+ needs to be unsigned. + +The behaviour is undefined if +__e__+ is `NULL`. + ++__t__+:: + Sequence element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. +|==== + +The `_nowrite` versions omit themselves from the session trace, but are +otherwise identical. This means the `_nowrite` fields won't be written +in the recorded trace. Their primary purpose is to make some +of the event context available to the +<> without having to +commit the data to sub-buffers. + + +[[liblttng-ust-tracepoint-loglevel]] +===== Tracepoint log levels (for `TRACEPOINT_LOGLEVEL()`) + +The following table shows the available log level values for the +`TRACEPOINT_LOGLEVEL()` macro: + +`TRACE_EMERG`:: + System is unusable. + +`TRACE_ALERT`:: + Action must be taken immediately. + +`TRACE_CRIT`:: + Critical conditions. + +`TRACE_ERR`:: + Error conditions. + +`TRACE_WARNING`:: + Warning conditions. + +`TRACE_NOTICE`:: + Normal, but significant, condition. + +`TRACE_INFO`:: + Informational message. + +`TRACE_DEBUG_SYSTEM`:: + Debug information with system-level scope (set of programs). + +`TRACE_DEBUG_PROGRAM`:: + Debug information with program-level scope (set of processes). + +`TRACE_DEBUG_PROCESS`:: + Debug information with process-level scope (set of modules). + +`TRACE_DEBUG_MODULE`:: + Debug information with module (executable/library) scope (set of units). + +`TRACE_DEBUG_UNIT`:: + Debug information with compilation unit scope (set of functions). + +`TRACE_DEBUG_FUNCTION`:: + Debug information with function-level scope. + +`TRACE_DEBUG_LINE`:: + Debug information with line-level scope (TRACEPOINT_EVENT default). + +`TRACE_DEBUG`:: + Debug-level message. + +Log levels `TRACE_EMERG` through `TRACE_INFO` and `TRACE_DEBUG` match +http://man7.org/linux/man-pages/man3/syslog.3.html[syslog] +level semantics. Log levels `TRACE_DEBUG_SYSTEM` through `TRACE_DEBUG` +offer more fine-grained selection of debug information. + + +[[lttng-modules-ref]] +=== LTTng-modules + +This section presents references of the LTTng-modules package. + + +[[lttng-modules-tp-struct-entry]] +==== Tracepoint fields macros (for `TP_STRUCT__entry()`) + +This table describes possible entries for the `TP_STRUCT__entry()` part +of `LTTNG_TRACEPOINT_EVENT()`: + +[role="growable func-desc",cols="asciidoc,asciidoc"] +.Available entries for `TP_STRUCT__entry()` (in `LTTNG_TRACEPOINT_EVENT()`) +|==== +|Macro |Description and parameters + +|+\__field(__t__, __n__)+ +| +Standard integer, displayed in base 10. + ++__t__+:: + Integer C type (`int`, `unsigned char`, `size_t`, etc.). + ++__n__+:: + Field name. + +|+\__field_hex(__t__, __n__)+ +| +Standard integer, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__field_oct(__t__, __n__)+ +| +Standard integer, displayed in base 8. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__field_network(__t__, __n__)+ +| +Integer in network byte order (big endian), displayed in base 10. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__field_network_hex(__t__, __n__)+ +| +Integer in network byte order (big endian), displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__array(__t__, __n__, __s__)+ +| +Statically-sized array, elements displayed in base 10. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__s__+:: + Number of elements. + +|+\__array_hex(__t__, __n__, __s__)+ +| +Statically-sized array, elements displayed in base 16. + ++__t__+:: + array element C type. ++__n__+:: + field name. ++__s__+:: + number of elements. + +|+\__array_text(__t__, __n__, __s__)+ +| +Statically-sized array, displayed as text. + ++__t__+:: + Array element C type (always char). + ++__n__+:: + Field name. + ++__s__+:: + Number of elements. + +|+\__dynamic_array(__t__, __n__, __s__)+ +| +Dynamically-sized array, displayed in base 10. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__s__+:: + Length C expression. + +|+\__dynamic_array_hex(__t__, __n__, __s__)+ +| +Dynamically-sized array, displayed in base 16. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__s__+:: + Length C expression. + +|+\__dynamic_array_text(__t__, __n__, __s__)+ +| +Dynamically-sized array, displayed as text. + ++__t__+:: + Array element C type (always char). + ++__n__+:: + Field name. + ++__s__+:: + Length C expression. + +|+\__string(n, __s__)+ +| +Null-terminated string. + +The behaviour is undefined behavior if +__s__+ is `NULL`. + ++__n__+:: + Field name. + ++__s__+:: + String source (pointer). +|==== + +The above macros should cover the majority of cases. For advanced items, +see path:{probes/lttng-events.h}. + + +[[lttng-modules-tp-fast-assign]] +==== Tracepoint assignment macros (for `TP_fast_assign()`) + +This table describes possible entries for the `TP_fast_assign()` part +of `LTTNG_TRACEPOINT_EVENT()`: + +.Available entries for `TP_fast_assign()` (in `LTTNG_TRACEPOINT_EVENT()`) +[role="growable func-desc",cols="asciidoc,asciidoc"] +|==== +|Macro |Description and parameters + +|+tp_assign(__d__, __s__)+ +| +Assignment of C expression +__s__+ to tracepoint field +__d__+. + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + +|+tp_memcpy(__d__, __s__, __l__)+ +| +Memory copy of +__l__+ bytes from +__s__+ to tracepoint field ++__d__+ (use with array fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + ++__l__+:: + Number of bytes to copy. + +|+tp_memcpy_from_user(__d__, __s__, __l__)+ +| +Memory copy of +__l__+ bytes from user space +__s__+ to tracepoint +field +__d__+ (use with array fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + ++__l__+:: + Number of bytes to copy. + +|+tp_memcpy_dyn(__d__, __s__)+ +| +Memory copy of dynamically-sized array from +__s__+ to tracepoint field ++__d__+. + +The number of bytes is known from the field's length expression +(use with dynamically-sized array fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + ++__l__+:: + Number of bytes to copy. + +|+tp_strcpy(__d__, __s__)+ +| +String copy of +__s__+ to tracepoint field +__d__+ (use with string +fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). +|==== diff --git a/2.6/images/export/concepts.png b/2.6/images/export/concepts.png new file mode 100644 index 0000000000000000000000000000000000000000..676e9cfca7a2c3cdfe284714344bc39b92b5f927 GIT binary patch literal 26173 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 U@4W=Cg<-n-o5^LAo@4BP0qMZLasU7T literal 0 HcmV?d00001 diff --git a/2.6/images/export/lttng-live.png b/2.6/images/export/lttng-live.png new file mode 100644 index 0000000000000000000000000000000000000000..0266574fab6920f611f2a8c6e8a0032004364bb5 GIT binary patch literal 4634 zcmZ`-c{r5O+n#6B}*Yo-~0QzuJ8J;>$|@DkLTRabIy65`#tCUan74yWT?YP&q)sgff%8>S|%XS z863dV=x71!7jw1`1fpRyf|+Um{rfjAOX7t$>blIyl?vd#jQVEP8(YN?_M+- z{m)JRn)>~D;{Q&PnVI>oD=jSz;67vC|J*r8FV|7$e;kOv2 z(6t;Am64J0FDIZ12o}%3SkKA@5@IkIz^4B2M{1tR#p};5jkW5)SA+_xFLQ+L{a1pAOD>@ccitX6%-Vdg@sj&lr=Oow5;yw z+>zAN(=%{}nJOrnnwkPK;J)U-Tx)Aa2pcCSCzk|gcU`ELmzQ^zSD=w`U|?WS zao|$`lMzw)r_T{c;4>2v5)w)AfcP{!)IS+O^~}x;KuLCXc5ZHNo~s+6FmDi>4`2>k zSXlVt#f#$N;+FvCi%I}YzAP;*Er0A=US3{NQBhf0SyfeqU#hCEuCA%6sjI6a289rb z#QOUB#>U2`rl#iR=GNBM_NUL<+uJ)jI(m9~C=^OxeA3|H;8=Plu#!{yi22<7MZeIs zw5)Xu_D6BaD{9Fya6aJvCWfY2KfW0j&M}`EzGyXLon+_x}FD!NK9-;h#T8M@PpeCnu+;r`ZaFs~`}Q zGgM2%ENF7GFfEdEiTmT0N+{;lC?nx5*h8*OWXzyZQGaF`53d*;Fu!}5SyNLN#sbqD zUZnYA7x@$pfm%ZIVk|lH1@HIGzWubz6%|c0hZYPJ{j^X0;IscYtZ3y#Wp?EVXqz5$ zu`DdTqoMLV77P2vo1Ik$IA8MPNd3zWKCuZhJO7QSfl3p8z# z4*WC954XHe>6D062qZzVM?aV1kO|iWk7nN z4f|fVuQ}Mf2CX}cxm*(v`WtFd(O>9T=A3*HHa*t2_T(A(xU_kY-T)sw zGbB6-`oVpcf%g|DUs3xmPHc(TJz9M;L1ORE#>02#Phag%Qwz@c{<7ZUC8hVWnUchD z$HCzabGwIUNwxcZ1sXd}wWn2+sI@VdhM?Vf$6d+t-XwW;mgzZ?Z)|TZ<=yhh*^#+pws;kAalas{^{JjW5)C;_sxNPSKXB`JbCNS)OntP}# zARghj09SljiMUu*;jcBBsU0v%E(t~kn`tPgkD6S5TaGZcWf*sn!tP=kBv+)d*mVYy zoPZP;?3oR@15@_C;EkMG9tSZ)-Xl#VmRNz zDM4I17i?+X&6G&Q(VdlX1P`Q;?d$8SMw>PXdcEy<_@e4WoJ#Lp@rM2qk$*y7U78oI zQNpC20UG~EL-aoD(xX`lGC8Bjn!VumWRL(HrkOex(ifwVy#o!PSkN zD2!$7^A*-lE#^u6u=7}4>_R;CdnPTdE>(!7p>J~kkfw4DbSUS`7gs+NtX>o6e}tz5 z)LevTJ`X@L=Je0fQAUN*_&QWs6?WJ*u2#8u z{32iFyzxWOtne)+v)KT#-73`#d;s!S_tB!NtMZke>!aKkHQVMS-^hwN(E9Re@kPI! zP}*ElS5(_k*S(DKH{7}ciKrelucutPe}e#9y%!3~P5Fa4xO?f;;j;lrc(VrM zNHE2DNnPc~u5rLfXZXS0qU1*HNlB2#BNP)T!L`PXH+IZkOpR7?kCayXWX#@b#+*`adCpty&9Rf2SOUV^ z{khb#(X@H7!~*SrWabjO%?l!vIY@0N+X%l{sInvN)x6JZ)?i3vnfH#)Pfdh@0d=2t zj`q?ergyP1^BTgoBGimI`#O3u?d$Y)PLach%Pz@VugCmio%%aOhU`NQBsf#Y?|z0@2_~KNO?d zkeb;*RiuBT{qzlkjSEDuP)~Ym>HK13-V6PT1>N+XzoI7(Ojf>QhXeI3$Q{FXO%z_v z%(u6!^|cCbr!24`U!6Z}@+^3LU#3$cgO|ZX9wXR`{(SSR>pbzdNAU3AQ2tPwvP?U1 zjO*dAz^~r42E0so2c<^N7VUkO>F|K{aYgxu%3c|j9Iaz^w}!jbzM*^&LAJ`%&INb% zH-3oMF?+-oDCXDO7UFmwG9Je5RCiHsH<`oECE3<41|ZGCh+d(F0u9Q}>b|2d1T*qd z>(d$?tYtrI$_+iM^ca+7R!5sDy+OTf<9tD5ofp6tupEbb?H1E9A3`KtB4<2=%q^5U-zEZ8a80lCg>uI-+Ck-JQ-03l-+1YlEzHvA6bqDtHJ+V8%B6MP8%8xR+q30S|pnG4&SaI4Y+LKJeT954K z&8_=%fp_FQQ1F89#?X~%OZ;~lQRuHAv4Z$tutx&9rOz=P;i%!QErDubHP$GI!WUJ^ zHQqvj-J4+e$G<4+ueA|oLNMb6+XEk|c=l+)amhoW?T*kVl107AsHd{jud1wl zj>o3CBQ(vh(8w6-+)8raaTELA7DhUw`PmG;hmhCpNi%yY_wAU83MuUG_uab6t1YpU zH%|xob2~mK=Ij10J{^4B8adJ8%@As2P$K?>CwPOg-#QZ?3reix+zGsI_w!ABXsMsS z-ufHCu|u|Lhqh1GP!=`q)T1wKQf@o}Q`0G$EU!ot4FxPSS>V;&8y@)cpPQvl4ikQ{ z++0Ko99`y>pXWdOk!fqnBt<5vnJsPcv4Sw9WszC&Gu63%Quo_62T0sE6K=N6X9Fm| z9k%hF_wzj*Bj1Dzd(s+oer7-H|KxnUIdgg%WRyO(orw13GdaqQ&N;b&Gm4^H;QnWB84GFgeo=( z&8UL$K^#2JeI%B5@?5m^M!b`!Ot$RUh2^4ZsD2uT3?>bu6f?p2^z zJ7e8r=%{$Qj}+=!K5bMWr1*i67r+uLiqMR&^aU zUsHiEHLiBh<{{hN-i$HvP&Hz7Q5jBM_xrXw&b$>K z&^Bo2G56y~ZkAJE6m0C?F-WdfV>?=SJPh=h5s*L&YhCFbpswH=Dmeh&8bbIbGd z2CXx>*x=oOf{5)(ou)RCb)=8SgG-+|v7IH&WM;LrOmVOGx6FySCwPJSO!IS%+>dO5 zTkoDL>N(flL^T@nrjy${y>2OPGju4XY`)Z9)$td#4%3s-N6Y1(L`{#`g%CtZrys_lTWbJ zOhPWzYe(HoP`NMh&+0zmhW>HsFML7QT-~FcVtYYlWw!E#hXdy0=X($v9&?I>J(yyR zKZf*ECWcHI^pq4-;T$bdLMk@UK)$ZMsTUmO#OLOwW4<@&nJK)FIq7}I5|tjIGIhr$Z{lWUTgB_%|rp*gIM| zbT44VFS7%q2xtoa&C}@U^rHN!wHhYDmQKC;kngp0GCh=jxjKWR7LGC@Sp_Vk%u8?n zY{W$#(bVo&ekqu#9tzoCwI%5+nw*G8C6N?2TL;Qz<(KR8(=gwvWqG@MJ~%seM-xyV z5Rz~h2ShNLYI`-#bO>?LkPRl^^pl60Qjs<>Qw(=VC=5@^C$aWk1;=U`q#n8sb>y z3cT5NT<{!_p2UAzlfe%Ekqtz433-OYq(%3(vkUsk7$~C9nCzhe9cyZz_K76`7iZK- zPkk!|fvvVFG#3Y3U{dG(yv+*8}&%s?$tyOZ3^GH?n(!Fy88Wt z%Z+pHXC;0K4{pDesV*=_(<@wsjs@y+;JBR|O84GT3XPW;VraI7vbPUCuj1j* z77dcz*#c5&tl(V5qtd3;zJF3Lj&4$Xfy;{P_(zbyp^xTw$&Rr{q{ zom3U?Z?;W22w+on;1S-_Jfk`QM}M?VcBYiQ__5ByJv)mR40eHH1suB)9^)W0B~ Yu+r1JU9W+kJs=QN+fb`U)9%@S0sOc)!vFvP literal 0 HcmV?d00001 diff --git a/2.6/images/export/many-sessions.png b/2.6/images/export/many-sessions.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4d27f179ebce1f934457b4ea26370ac1121d82 GIT binary patch literal 5144 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%0D{kI#42n&M>C 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 literal 0 HcmV?d00001 diff --git a/2.6/images/export/ust-flow.png b/2.6/images/export/ust-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3ecc20a18973e3f7292bcbcb14a72259f41fb6 GIT binary patch literal 11167 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 +v2.6, May 26, 2016 + + +include::../common/copyright.txt[] + + +include::../common/warning-not-maintained.txt[] + + +include::../common/welcome.txt[] + + +include::../common/audience.txt[] + + +[[chapters]] +=== Chapter descriptions + +What follows is a list of brief descriptions of this documentation's +chapters. The latter are ordered in such a way as to make the reading +as linear as possible. + +. <> explains the + rudiments of software tracing and the rationale behind the + LTTng project. +. <> is divided into + sections describing the steps needed to get a working installation + of LTTng packages for common Linux distributions and from its + source. +. <> is a very concise guide to + get started quickly with LTTng kernel and user space tracing. This + chapter is recommended if you're new to LTTng or software tracing + in general. +. <> deals with some + core concepts and components of the LTTng suite. Understanding + those is important since the next chapter assumes you're familiar + with them. +. <> is a complete user guide of the + LTTng project. It shows in great details how to instrument user + applications and the Linux kernel, how to control tracing sessions + using the `lttng` command line tool and miscellaneous practical use + cases. +. <> contains references of LTTng components, + like links to online manpages and various APIs. + +We recommend that you read the above chapters in this order, although +some of them may be skipped depending on your situation. You may skip +<> if you're familiar with tracing +and LTTng. Also, you may jump over <> +if LTTng is already properly installed on your target system. + + +include::../common/convention.txt[] + + +include::../common/acknowledgements.txt[] + + +[[whats-new]] +== What's new in LTTng {revision}? + +Most of the changes of LTTng {revision} are bug fixes, making the toolchain +more stable than ever before. Still, LTTng {revision} adds some interesting +features to the project. + +LTTng 2.5 already supported the instrumentation and tracing of +<> through `java.util.logging` +(JUL). LTTng {revision} goes one step further by supporting +https://logging.apache.org/log4j/1.2/[Apache log4j 1.2]. +The new log4j domain is selected using the `--log4j` option in various +commands of the `lttng` tool. + +LTTng-modules has supported system call tracing for a long time, +but until now, it was only possible to record either all of them, +or none of them. LTTng {revision} allows the user to record specific +system call events, for example: + +[role="term"] +---- +lttng enable-event --kernel --syscall open,fork,chdir,pipe +---- + +Finally, the `lttng` command line tool is not only able to communicate +with humans as it used to do, but also with machines thanks to its new +<> feature. + +To learn more about the new features of LTTng {revision}, see the +http://lttng.org/blog/2015/02/27/lttng-2.6-released/[release announcement]. + + +[[nuts-and-bolts]] +== Nuts and bolts + +What is LTTng? As its name suggests, the _Linux Trace Toolkit: next +generation_ is a modern toolkit for tracing Linux systems and +applications. So your first question might rather be: **what is +tracing?** + + +[[what-is-tracing]] +=== What is tracing? + +As the history of software engineering progressed and led to what +we now take for granted--complex, numerous and +interdependent software applications running in parallel on +sophisticated operating systems like Linux--the authors of such +components, or software developers, began feeling a natural +urge of having tools to ensure the robustness and good performance +of their masterpieces. + +One major achievement in this field is, inarguably, the +https://www.gnu.org/software/gdb/[GNU debugger (GDB)], +which is an essential tool for developers to find and fix +bugs. But even the best debugger won't help make your software run +faster, and nowadays, faster software means either more work done by +the same hardware, or cheaper hardware for the same work. + +A _profiler_ is often the tool of choice to identify performance +bottlenecks. Profiling is suitable to identify _where_ performance is +lost in a given software; the profiler outputs a profile, a +statistical summary of observed events, which you may use to discover +which functions took the most time to execute. However, a profiler +won't report _why_ some identified functions are the bottleneck. +Bottlenecks might only occur when specific conditions are met, sometimes +almost impossible to capture by a statistical profiler, or impossible to +reproduce with an application altered by the overhead of an event-based +profiler. For a thorough investigation of software performance issues, +a history of execution, with the recorded values of chosen variables +and context, is essential. This is where tracing comes in handy. + +_Tracing_ is a technique used to understand what goes on in a running +software system. The software used for tracing is called a _tracer_, +which is conceptually similar to a tape recorder. When recording, +specific probes placed in the software source code generate events +that are saved on a giant tape: a _trace_ file. Both user applications +and the operating system may be traced at the same time, opening the +possibility of resolving a wide range of problems that are otherwise +extremely challenging. + +Tracing is often compared to _logging_. However, tracers and loggers +are two different tools, serving two different purposes. Tracers are +designed to record much lower-level events that occur much more +frequently than log messages, often in the thousands per second range, +with very little execution overhead. Logging is more appropriate for +very high-level analysis of less frequent events: user accesses, +exceptional conditions (errors and warnings, for example), database +transactions, instant messaging communications, and such. More formally, +logging is one of several use cases that can be accomplished with +tracing. + +The list of recorded events inside a trace file may be read manually +like a log file for the maximum level of detail, but it is generally +much more interesting to perform application-specific analyses to +produce reduced statistics and graphs that are useful to resolve a +given problem. Trace viewers and analysers are specialized tools +designed to do this. + +So, in the end, this is what LTTng is: a powerful, open source set of +tools to trace the Linux kernel and user applications at the same time. +LTTng is composed of several components actively maintained and +developed by its link:/community/#where[community]. + + +[[lttng-alternatives]] +=== Alternatives to LTTng + +Excluding proprietary solutions, a few competing software tracers +exist for Linux: + +* https://www.kernel.org/doc/Documentation/trace/ftrace.txt[ftrace] + is the de facto function tracer of the Linux kernel. Its user + interface is a set of special files in sysfs. +* https://perf.wiki.kernel.org/[perf] is + a performance analyzing tool for Linux which supports hardware + performance counters, tracepoints, as well as other counters and + types of probes. perf's controlling utility is the `perf` command + line/curses tool. +* http://linux.die.net/man/1/strace[strace] + is a command line utility which records system calls made by a + user process, as well as signal deliveries and changes of process + state. strace makes use of https://en.wikipedia.org/wiki/Ptrace[ptrace] + to fulfill its function. +* https://sourceware.org/systemtap/[SystemTap] + is a Linux kernel and user space tracer which uses custom user scripts + to produce plain text traces. Scripts are converted to the C language, + then compiled as Linux kernel modules which are loaded to produce + trace data. SystemTap's primary user interface is the `stap` + command line tool. +* http://www.sysdig.org/[sysdig], like + SystemTap, uses scripts to analyze Linux kernel events. Scripts, + or _chisels_ in sysdig's jargon, are written in Lua and executed + while the system is being traced, or afterwards. sysdig's interface + is the `sysdig` command line tool as well as the curses-based + `csysdig` tool. + +The main distinctive features of LTTng is that it produces correlated +kernel and user space traces, as well as doing so with the lowest +overhead amongst other solutions. It produces trace files in the +http://diamon.org/ctf[CTF] format, an optimized file format +for production and analyses of multi-gigabyte data. LTTng is the +result of close to 10 years of +active development by a community of passionate developers. LTTng {revision} +is currently available on some major desktop, server, and embedded Linux +distributions. + +The main interface for tracing control is a single command line tool +named `lttng`. The latter can create several tracing sessions, +enable/disable events on the fly, filter them efficiently with custom +user expressions, start/stop tracing, and do much more. Traces can be +recorded on disk or sent over the network, kept totally or partially, +and viewed once tracing becomes inactive or in real-time. + +<> and start tracing! + + +[[installing-lttng]] +== Installing LTTng + +**LTTng** is a set of software components which interact to allow +instrumenting the Linux kernel and user applications as well as +controlling tracing sessions (starting/stopping tracing, +enabling/disabling events, and more). Those components are bundled into +the following packages: + +LTTng-tools:: + Libraries and command line interface to control tracing sessions. + +LTTng-modules:: + Linux kernel modules for tracing the kernel. + +LTTng-UST:: + User space tracing library. + +Most distributions mark the LTTng-modules and LTTng-UST packages as +optional. In the following sections, the steps to install all three are +always provided, but note that LTTng-modules is only required if +you intend to trace the Linux kernel and LTTng-UST is only required if +you intend to trace user space applications. + +This chapter shows how to install the above packages on a Linux system. +The easiest way is to use the package manager of the system's +distribution (<> or +<>). Support is also available for +<>, such as Red Hat +Enterprise Linux (RHEL) and SUSE Linux Enterprise Server (SLES). +Otherwise, you can +<>. + + +[[desktop-distributions]] +=== Desktop distributions + +Official LTTng {revision} packages are available for +<>, <>, and +<> (and other RPM-based distributions). + +More recent versions of LTTng are available for Debian and Arch Linux. + +Should any issue arise when +following the procedures below, please inform the +link:/community[community] about it. + + +[[ubuntu]] +==== Ubuntu + +LTTng {revision} is packaged in Ubuntu 15.10 _Wily Werewolf_. For other +releases of Ubuntu, you need to build and install LTTng {revision} +<>. Ubuntu 15.04 _Vivid Vervet_ +ships with link:/docs/v2.5/[LTTng 2.5], whilst +Ubuntu 16.04 _Xenial Xerus_ ships with +link:/docs/v2.7/[LTTng 2.7]. + +To install LTTng {revision} from the official Ubuntu repositories, +simply use `apt-get`: + +[role="term"] +---- +sudo apt-get install lttng-tools +sudo apt-get install lttng-modules-dkms +sudo apt-get install liblttng-ust-dev +---- + +If you need to trace +<>, +you need to install the LTTng-UST Java agent also: + +[role="term"] +---- +sudo apt-get install liblttng-ust-agent-java +---- + + +[[fedora]] +==== Fedora + +Fedora 22 and Fedora 23 ship with official LTTng-tools {revision} and +LTTng-UST {revision} packages. Simply use `yum`: + +[role="term"] +---- +sudo yum install lttng-tools +sudo yum install lttng-ust +sudo yum install lttng-ust-devel +---- + +LTTng-modules {revision} still needs to be built and installed from +source. For that, make sure that the `kernel-devel` package is +already installed beforehand: + +[role="term"] +---- +sudo yum install kernel-devel +---- + +Proceed on to fetch +<>. Build and +install it as follows: + +[role="term"] +---- +KERNELDIR=/usr/src/kernels/$(uname -r) make +sudo make modules_install +---- + +NOTE: If you need to trace <> on +Fedora, you need to build and install LTTng-UST {revision} +<> and use the +`--enable-java-agent-jul`, `--enable-java-agent-log4j`, or +`--enable-java-agent-all` options. + + +[[opensuse]] +==== openSUSE/RPM + +openSUSE 13.1 and openSUSE 13.2 have LTTng {revision} packages. To install +LTTng {revision}, you first need to add an entry to your repository +configuration. All LTTng repositories are available +http://download.opensuse.org/repositories/devel:/tools:/lttng/[here]. +For example, the following commands adds the LTTng repository for +openSUSE{nbsp}13.1: + +[role="term"] +---- +sudo zypper addrepo http://download.opensuse.org/repositories/devel:/tools:/lttng/openSUSE_13.1/devel:tools:lttng.repo +---- + +Then, refresh the package database: + +[role="term"] +---- +sudo zypper refresh +---- + +and install `lttng-tools`, `lttng-modules` and `lttng-ust-devel`: + +[role="term"] +---- +sudo zypper install lttng-tools +sudo zypper install lttng-modules +sudo zypper install lttng-ust-devel +---- + +NOTE: If you need to trace <> on +openSUSE, you need to build and install LTTng-UST {revision} +<> and use the +`--enable-java-agent-jul`, `--enable-java-agent-log4j`, or +`--enable-java-agent-all` options. + + +[[embedded-distributions]] +=== Embedded distributions + +LTTng is packaged by two popular +embedded Linux distributions: <> and +<>. + + +[[buildroot]] +==== Buildroot + +LTTng {revision} is available in Buildroot since Buildroot 2015.05. The +LTTng packages are named `lttng-tools`, `lttng-modules`, and `lttng-libust`. + +To enable them, start the Buildroot configuration menu as usual: + +[role="term"] +---- +make menuconfig +---- + +In: + +* _Kernel_: make sure _Linux kernel_ is enabled +* _Toolchain_: make sure the following options are enabled: +** _Enable large file (files > 2GB) support_ +** _Enable WCHAR support_ + +In _Target packages_/_Debugging, profiling and benchmark_, enable +_lttng-modules_ and _lttng-tools_. In +_Target packages_/_Libraries_/_Other_, enable _lttng-libust_. + +NOTE: If you need to trace <> on +Buildroot, you need to build and install LTTng-UST {revision} +<> and use the +`--enable-java-agent-jul`, `--enable-java-agent-log4j`, or +`--enable-java-agent-all` options. + + +[[oe-yocto]] +==== OpenEmbedded/Yocto + +LTTng {revision} recipes are available in the +http://layers.openembedded.org/layerindex/branch/master/layer/openembedded-core/[`openembedded-core`] +layer of OpenEmbedded since February 8th, 2015 under the following names: + +* `lttng-tools` +* `lttng-modules` +* `lttng-ust` + +Using BitBake, the simplest way to include LTTng recipes in your +target image is to add them to `IMAGE_INSTALL_append` in +path:{conf/local.conf}: + +---- +IMAGE_INSTALL_append = " lttng-tools lttng-modules lttng-ust" +---- + +If you're using Hob, click _Edit image recipe_ once you have selected +a machine and an image recipe. Then, under the _All recipes_ tab, search +for `lttng` and include the three LTTng recipes. + +NOTE: If you need to trace <> on +OpenEmbedded/Yocto, you need to build and install LTTng-UST {revision} +<> and use the +`--enable-java-agent-jul`, `--enable-java-agent-log4j`, or +`--enable-java-agent-all` options. + + +[[enterprise-distributions]] +=== Enterprise distributions (RHEL, SLES) + +To install LTTng on enterprise Linux distributions +(such as RHEL and SLES), please see +http://packages.efficios.com/[EfficiOS Enterprise Packages]. + + +[[building-from-source]] +=== Building from source + +As <>, LTTng is shipped as +three packages: LTTng-tools, LTTng-modules, and LTTng-UST. LTTng-tools +contains everything needed to control tracing sessions, while +LTTng-modules is only needed for Linux kernel tracing and LTTng-UST is +only needed for user space tracing. + +The tarballs are available in the +http://lttng.org/download#build-from-source[Download section] +of the LTTng website. + +Please refer to the path:{README.md} files provided by each package to +properly build and install them. + +TIP: The aforementioned path:{README.md} files +are rendered as rich text when https://github.com/lttng[viewed on GitHub]. + + +[[getting-started]] +== Getting started with LTTng + +This is a small guide to get started quickly with LTTng kernel and user +space tracing. For a more thorough understanding of LTTng and intermediate +to advanced use cases and, see <> +and <>. + +Before reading this guide, make sure LTTng +<>. LTTng-tools is required. Also install +LTTng-modules for +<> and LTTng-UST +for +<>. +When the traces are finally written and complete, the +<> +section of this chapter will help you analyze your tracepoint events +to investigate. + + +[[tracing-the-linux-kernel]] +=== Tracing the Linux kernel + +Make sure LTTng-tools and LTTng-modules packages +<>. + +Since you're about to trace the Linux kernel itself, let's look at the +available kernel events using the `lttng` tool, which has a +Git-like command line structure: + +[role="term"] +---- +lttng list --kernel +---- + +Before tracing, you need to create a session: + +[role="term"] +---- +sudo lttng create +---- + +TIP: You can avoid using `sudo` in the previous and following commands +if your user is a member of the <>. + +Let's now enable some events for this session: + +[role="term"] +---- +sudo lttng enable-event --kernel sched_switch,sched_process_fork +---- + +Or you might want to simply enable all available kernel events (beware +that trace files grow rapidly when doing this): + +[role="term"] +---- +sudo lttng enable-event --kernel --all +---- + +Start tracing: + +[role="term"] +---- +sudo lttng start +---- + +By default, traces are saved in ++\~/lttng-traces/__name__-__date__-__time__+, +where +__name__+ is the session name. + +When you're done tracing: + +[role="term"] +---- +sudo lttng stop +sudo lttng destroy +---- + +Although `destroy` looks scary here, it doesn't actually destroy the +written trace files: it only destroys the tracing session. + +What's next? Have a look at +<> +to view and analyze the trace you just recorded. + + +[[tracing-your-own-user-application]] +=== Tracing your own user application + +The previous section helped you create a trace out of Linux kernel +events. This section steps you through a simple example showing you how +to trace a _Hello world_ program written in C. + +Make sure the LTTng-tools and LTTng-UST packages +<>. + +Tracing is just like having `printf()` calls at specific locations of +your source code, albeit LTTng is much faster and more flexible than +`printf()`. In the LTTng realm, **`tracepoint()`** is analogous to +`printf()`. + +Unlike `printf()`, though, `tracepoint()` does not use a format string to +know the types of its arguments: the formats of all tracepoints must be +defined before using them. So before even writing our _Hello world_ program, +we need to define the format of our tracepoint. This is done by creating a +**tracepoint provider**, which consists of a tracepoint provider header +(`.h` file) and a tracepoint provider definition (`.c` file). + +The tracepoint provider header contains some boilerplate as well as a +list of tracepoint definitions and other optional definition entries +which we skip for this quickstart. Each tracepoint is defined using the +`TRACEPOINT_EVENT()` macro. For each tracepoint, you must provide: + +* a **provider name**, which is the "scope" or namespace of this + tracepoint (this usually includes the company and project names) +* a **tracepoint name** +* a **list of arguments** for the eventual `tracepoint()` call, each + item being: +** the argument C type +** the argument name +* a **list of fields**, which correspond to the actual fields of the + recorded events for this tracepoint + +Here's an example of a simple tracepoint provider header with two +arguments: an integer and a string: + +[source,c] +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER hello_world + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./hello-tp.h" + +#if !defined(_HELLO_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _HELLO_TP_H + +#include + +TRACEPOINT_EVENT( + hello_world, + my_first_tracepoint, + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) + +#endif /* _HELLO_TP_H */ + +#include +---- + +The exact syntax is well explained in the +<> instrumentation guide of the +<> chapter, as well as in +man:lttng-ust(3). + +Save the above snippet as path:{hello-tp.h}. + +Write the tracepoint provider definition as path:{hello-tp.c}: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE + +#include "hello-tp.h" +---- + +Create the tracepoint provider: + +[role="term"] +---- +gcc -c -I. hello-tp.c +---- + +Now, by including path:{hello-tp.h} in your own application, you may use the +tracepoint defined above by properly refering to it when calling +`tracepoint()`: + +[source,c] +---- +#include +#include "hello-tp.h" + +int main(int argc, char *argv[]) +{ + int x; + + puts("Hello, World!\nPress Enter to continue..."); + + /* + * The following getchar() call is only placed here for the purpose + * of this demonstration, for pausing the application in order for + * you to have time to list its events. It's not needed otherwise. + */ + getchar(); + + /* + * A tracepoint() call. Arguments, as defined in hello-tp.h: + * + * 1st: provider name (always) + * 2nd: tracepoint name (always) + * 3rd: my_integer_arg (first user-defined argument) + * 4th: my_string_arg (second user-defined argument) + * + * Notice the provider and tracepoint names are NOT strings; + * they are in fact parts of variables created by macros in + * hello-tp.h. + */ + tracepoint(hello_world, my_first_tracepoint, 23, "hi there!"); + + for (x = 0; x < argc; ++x) { + tracepoint(hello_world, my_first_tracepoint, x, argv[x]); + } + + puts("Quitting now!"); + + tracepoint(hello_world, my_first_tracepoint, x * x, "x^2"); + + return 0; +} +---- + +Save this as path:{hello.c}, next to path:{hello-tp.c}. + +Notice path:{hello-tp.h}, the tracepoint provider header, is included +by path:{hello.c}. + +You are now ready to compile the application with LTTng-UST support: + +[role="term"] +---- +gcc -c hello.c +gcc -o hello hello.o hello-tp.o -llttng-ust -ldl +---- + +Here's the whole build process: + +[role="img-100"] +.User space tracing's build process. +image::ust-flow.png[] + +If you followed the +<> tutorial, the +following steps should look familiar. + +First, run the application with a few arguments: + +[role="term"] +---- +./hello world and beyond +---- + +You should see + +---- +Hello, World! +Press Enter to continue... +---- + +Use the `lttng` tool to list all available user space events: + +[role="term"] +---- +lttng list --userspace +---- + +You should see the `hello_world:my_first_tracepoint` tracepoint listed +under the `./hello` process. + +Create a tracing session: + +[role="term"] +---- +lttng create +---- + +Enable the `hello_world:my_first_tracepoint` tracepoint: + +[role="term"] +---- +lttng enable-event --userspace hello_world:my_first_tracepoint +---- + +Start tracing: + +[role="term"] +---- +lttng start +---- + +Go back to the running `hello` application and press Enter. All `tracepoint()` +calls are executed and the program finally exits. + +Stop tracing: + +[role="term"] +---- +lttng stop +---- + +Done! You may use `lttng view` to list the recorded events. This command +starts http://diamon.org/babeltrace[`babeltrace`] +in the background, if it's installed: + +[role="term"] +---- +lttng view +---- + +should output something like: + +---- +[18:10:27.684304496] (+?.?????????) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "hi there!", my_integer_field = 23 } +[18:10:27.684338440] (+0.000033944) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "./hello", my_integer_field = 0 } +[18:10:27.684340692] (+0.000002252) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "world", my_integer_field = 1 } +[18:10:27.684342616] (+0.000001924) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "and", my_integer_field = 2 } +[18:10:27.684343518] (+0.000000902) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "beyond", my_integer_field = 3 } +[18:10:27.684357978] (+0.000014460) hostname hello_world:my_first_tracepoint: { cpu_id = 0 }, { my_string_field = "x^2", my_integer_field = 16 } +---- + +When you're done, you may destroy the tracing session, which does _not_ +destroy the generated trace files, leaving them available for further +analysis: + +[role="term"] +---- +lttng destroy +---- + +The next section presents other alternatives to view and analyze your +LTTng traces. + + +[[viewing-and-analyzing-your-traces]] +=== Viewing and analyzing your traces + +This section describes how to visualize the data gathered after tracing +the Linux kernel or a user space application. + +Many ways exist to read LTTng traces: + +* **`babeltrace`** is a command line utility which converts trace formats; + it supports the format used by LTTng, + CTF, as well as a basic + text output which may be ++grep++ed. The `babeltrace` command is + part of the + http://diamon.org/babeltrace[Babeltrace] project. +* Babeltrace also includes **Python bindings** so that you may + easily open and read an LTTng trace with your own script, benefiting + from the power of Python. +* **http://tracecompass.org/[Trace Compass]** + is an Eclipse plugin used to visualize and analyze various types of + traces, including LTTng's. It also comes as a standalone application. + +LTTng trace files are usually recorded in the dir:{~/lttng-traces} directory. +Let's now view the trace and perform a basic analysis using +`babeltrace`. + +The simplest way to list all the recorded events of a trace is to pass its +path to `babeltrace` with no options: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-session +---- + +`babeltrace` finds all traces recursively within the given path and +prints all their events, merging them in order of time. + +Listing all the system calls of a Linux kernel trace with their arguments is +easy with `babeltrace` and `grep`: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-kernel-session | grep sys_ +---- + +Counting events is also straightforward: + +[role="term"] +---- +babeltrace ~/lttng-traces/my-kernel-session | grep sys_read | wc --lines +---- + +The text output of `babeltrace` is useful for isolating events by simple +matching using `grep` and similar utilities. However, more elaborate filters +such as keeping only events with a field value falling within a specific range +are not trivial to write using a shell. Moreover, reductions and even the +most basic computations involving multiple events are virtually impossible +to implement. + +Fortunately, Babeltrace ships with Python 3 bindings which makes it +really easy to read the events of an LTTng trace sequentially and compute +the desired information. + +Here's a simple example using the Babeltrace Python bindings. The following +script accepts an LTTng Linux kernel trace path as its first argument and +prints the short names of the top 5 running processes on CPU 0 during the +whole trace: + +[source,python] +---- +import sys +from collections import Counter +import babeltrace + + +def top5proc(): + if len(sys.argv) != 2: + msg = 'Usage: python {} TRACEPATH'.format(sys.argv[0]) + raise ValueError(msg) + + # a trace collection holds one to many traces + col = babeltrace.TraceCollection() + + # add the trace provided by the user + # (LTTng traces always have the 'ctf' format) + if col.add_trace(sys.argv[1], 'ctf') is None: + raise RuntimeError('Cannot add trace') + + # this counter dict will hold execution times: + # + # task command name -> total execution time (ns) + exec_times = Counter() + + # this holds the last `sched_switch` timestamp + last_ts = None + + # iterate events + for event in col.events: + # keep only `sched_switch` events + if event.name != 'sched_switch': + continue + + # keep only events which happened on CPU 0 + if event['cpu_id'] != 0: + continue + + # event timestamp + cur_ts = event.timestamp + + if last_ts is None: + # we start here + last_ts = cur_ts + + # previous task command (short) name + prev_comm = event['prev_comm'] + + # initialize entry in our dict if not yet done + if prev_comm not in exec_times: + exec_times[prev_comm] = 0 + + # compute previous command execution time + diff = cur_ts - last_ts + + # update execution time of this command + exec_times[prev_comm] += diff + + # update last timestamp + last_ts = cur_ts + + # display top 10 + for name, ns in exec_times.most_common(5): + s = ns / 1000000000 + print('{:20}{} s'.format(name, s)) + + +if __name__ == '__main__': + top5proc() +---- + +Save this script as path:{top5proc.py} and run it with Python 3, providing the +path to an LTTng Linux kernel trace as the first argument: + +[role="term"] +---- +python3 top5proc.py ~/lttng-sessions/my-session-.../kernel +---- + +Make sure the path you provide is the directory containing actual trace +files (`channel0_0`, `metadata`, and the rest): the `babeltrace` utility +recurses directories, but the Python bindings do not. + +Here's an example of output: + +---- +swapper/0 48.607245889 s +chromium 7.192738188 s +pavucontrol 0.709894415 s +Compositor 0.660867933 s +Xorg.bin 0.616753786 s +---- + +Note that `swapper/0` is the "idle" process of CPU 0 on Linux; since we +weren't using the CPU that much when tracing, its first position in the list +makes sense. + + +[[understanding-lttng]] +== Understanding LTTng + +If you're going to use LTTng in any serious way, it is fundamental that +you become familiar with its core concepts. Technical terms like +_tracing sessions_, _domains_, _channels_ and _events_ are used over +and over in the <> chapter, +and it is assumed that you understand what they mean when reading it. + +LTTng, as you already know, is a _toolkit_. It would be wrong +to call it a simple _tool_ since it is composed of multiple interacting +components. This chapter also describes the latter, providing details +about their respective roles and how they connect together to form +the current LTTng ecosystem. + + +[[core-concepts]] +=== Core concepts + +This section explains the various elementary concepts a user has to deal +with when using LTTng. They are: + +* <> +* <> +* <> +* <> + + +[[tracing-session]] +==== Tracing session + +A _tracing session_ is--like any session--a container of +state. Anything that is done when tracing using LTTng happens in the +scope of a tracing session. In this regard, it is analogous to a bank +website's session: you can't interact online with your bank account +unless you are logged in a session, except for reading a few static +webpages (LTTng, too, can report some static information that does not +need a created tracing session). + +A tracing session holds the following attributes and objects (some of +which are described in the following sections): + +* a name +* the tracing state (tracing started or stopped) +* the trace data output path/URL (local path or sent over the network) +* a mode (normal, snapshot or live) +* the snapshot output paths/URLs (if applicable) +* for each <>, a list of <> +* for each channel: +** a name +** the channel state (enabled or disabled) +** its parameters (event loss mode, sub-buffers size and count, + timer periods, output type, trace files size and count, and the rest) +** a list of added context information +** a list of <> +* for each event: +** its state (enabled or disabled) +** a list of instrumentation points (tracepoints, system calls, + dynamic probes, other types of probes) +** associated log levels +** a filter expression + +All this information is completely isolated between tracing sessions. +As you can see in the list above, even the tracing state +is a per-tracing session attribute, so that you may trace your target +system/application in a given tracing session with a specific +configuration while another one stays inactive. + +[role="img-100"] +.A _tracing session_ is a container of domains, channels, and events. +image::concepts.png[] + +Conceptually, a tracing session is a per-user object; the +<> section shows how this is actually +implemented. Any user may create as many concurrent tracing sessions +as desired. + +[role="img-100"] +.Each user may create as many tracing sessions as desired. +image::many-sessions.png[] + +The trace data generated in a tracing session may be either saved +to disk, sent over the network or not saved at all (in which case +snapshots may still be saved to disk or sent to a remote machine). + + +[[domain]] +==== Domain + +A tracing _domain_ is the official term the LTTng project uses to +designate a tracer category. + +There are currently four known domains: + +* Linux kernel +* user space +* `java.util.logging` (JUL) +* log4j + +Different tracers expose common features in their own interfaces, but, +from a user's perspective, you still need to target a specific type of +tracer to perform some actions. For example, since both kernel and user +space tracers support named tracepoints (probes manually inserted in +source code), you need to specify which one is concerned when enabling +an event because both domains could have existing events with the same +name. + +Some features are not available in all domains. Filtering enabled +events using custom expressions, for example, is currently not +supported in the kernel domain, but support could be added in the +future. + + +[[channel]] +==== Channel + +A _channel_ is a set of events with specific parameters and potential +added context information. Channels have unique names per domain within +a tracing session. A given event is always registered to at least one +channel; having the same enabled event in two channels makes +this event being recorded twice everytime it occurs. + +Channels may be individually enabled or disabled. Occurring events of +a disabled channel never make it to recorded events. + +The fundamental role of a channel is to keep a shared ring buffer, where +events are eventually recorded by the tracer and consumed by a consumer +daemon. This internal ring buffer is divided into many sub-buffers of +equal size. + +Channels, when created, may be fine-tuned thanks to a few parameters, +many of them related to sub-buffers. The following subsections explain +what those parameters are and in which situations you should manually +adjust them. + + +[[channel-overwrite-mode-vs-discard-mode]] +===== Overwrite and discard event loss modes + +As previously mentioned, a channel's ring buffer is divided into many +equally sized sub-buffers. + +As events occur, they are serialized as trace data into a specific +sub-buffer (yellow arc in the following animation) until it is full: +when this happens, the sub-buffer is marked as consumable (red) and +another, _empty_ (white) sub-buffer starts receiving the following +events. The marked sub-buffer is eventually consumed by a consumer +daemon (returns to white). + +[NOTE] +[role="docsvg-channel-subbuf-anim"] +==== +{note-no-anim} +==== + +In an ideal world, sub-buffers are consumed faster than filled, like it +is the case above. In the real world, however, all sub-buffers could be +full at some point, leaving no space to record the following events. By +design, LTTng is a _non-blocking_ tracer: when no empty sub-buffer +exists, losing events is acceptable when the alternative would be to +cause substantial delays in the instrumented application's execution. +LTTng privileges performance over integrity, aiming at perturbing the +traced system as little as possible in order to make tracing of subtle +race conditions and rare interrupt cascades possible. + +When it comes to losing events because no empty sub-buffer is available, +the channel's _event loss mode_ determines what to do amongst: + +Discard:: + Drop the newest events until a sub-buffer is released. + +Overwrite:: + Clear the sub-buffer containing the oldest recorded + events and start recording the newest events there. This mode is + sometimes called _flight recorder mode_ because it behaves like a + flight recorder: always keep a fixed amount of the latest data. + +Which mechanism you should choose depends on your context: prioritize +the newest or the oldest events in the ring buffer? + +Beware that, in overwrite mode, a whole sub-buffer is abandoned as soon +as a new event doesn't find an empty sub-buffer, whereas in discard +mode, only the event that doesn't fit is discarded. + +Also note that a count of lost events is incremented and saved in +the trace itself when an event is lost in discard mode, whereas no +information is kept when a sub-buffer gets overwritten before being +committed. + +There are known ways to decrease your probability of losing events. The +next section shows how tuning the sub-buffers count and size can be +used to virtually stop losing events. + + +[[channel-subbuf-size-vs-subbuf-count]] +===== Sub-buffers count and size + +For each channel, an LTTng user may set its number of sub-buffers and +their size. + +Note that there is a noticeable tracer's CPU overhead introduced when +switching sub-buffers (marking a full one as consumable and switching +to an empty one for the following events to be recorded). Knowing this, +the following list presents a few practical situations along with how +to configure sub-buffers for them: + +High event throughput:: + In general, prefer bigger sub-buffers to + lower the risk of losing events. Having bigger sub-buffers + also ensures a lower sub-buffer switching frequency. The number of + sub-buffers is only meaningful if the channel is enabled in + overwrite mode: in this case, if a sub-buffer overwrite happens, the + other sub-buffers are left unaltered. + +Low event throughput:: + In general, prefer smaller sub-buffers + since the risk of losing events is already low. Since events + happen less frequently, the sub-buffer switching frequency should + remain low and thus the tracer's overhead should not be a problem. + +Low memory system:: + If your target system has a low memory + limit, prefer fewer first, then smaller sub-buffers. Even if the + system is limited in memory, you want to keep the sub-buffers as + big as possible to avoid a high sub-buffer switching frequency. + +You should know that LTTng uses CTF as its trace format, which means +event data is very compact. For example, the average LTTng Linux kernel +event weights about 32{nbsp}bytes. A sub-buffer size of 1{nbsp}MiB is +thus considered big. + +The previous situations highlight the major trade-off between a few big +sub-buffers and more, smaller sub-buffers: sub-buffer switching +frequency vs. how much data is lost in overwrite mode. Assuming a +constant event throughput and using the overwrite mode, the two +following configurations have the same ring buffer total size: + +[NOTE] +[role="docsvg-channel-subbuf-size-vs-count-anim"] +==== +{note-no-anim} +==== + +* **2 sub-buffers of 4 MiB each** lead to a very low sub-buffer + switching frequency, but if a sub-buffer overwrite happens, half of + the recorded events so far (4{nbsp}MiB) are definitely lost. +* **8 sub-buffers of 1 MiB each** lead to 4{nbsp}times the tracer's + overhead as the previous configuration, but if a sub-buffer + overwrite happens, only the eighth of events recorded so far are + definitely lost. + +In discard mode, the sub-buffers count parameter is pointless: use two +sub-buffers and set their size according to the requirements of your +situation. + + +[[channel-switch-timer]] +===== Switch timer + +The _switch timer_ period is another important configurable feature of +channels to ensure periodic sub-buffer flushing. + +When the _switch timer_ fires, a sub-buffer switch happens. This timer +may be used to ensure that event data is consumed and committed to +trace files periodically in case of a low event throughput: + +[NOTE] +[role="docsvg-channel-switch-timer"] +==== +{note-no-anim} +==== + +It's also convenient when big sub-buffers are used to cope with +sporadic high event throughput, even if the throughput is normally +lower. + + +[[channel-buffering-schemes]] +===== Buffering schemes + +In the user space tracing domain, two **buffering schemes** are +available when creating a channel: + +Per-PID buffering:: + Keep one ring buffer per process. + +Per-UID buffering:: + Keep one ring buffer for all processes of a single user. + +The per-PID buffering scheme consumes more memory than the per-UID +option if more than one process is instrumented for LTTng-UST. However, +per-PID buffering ensures that one process having a high event +throughput won't fill all the shared sub-buffers, only its own. + +The Linux kernel tracing domain only has one available buffering scheme +which is to use a single ring buffer for the whole system. + + +[[event]] +==== Event + +An _event_, in LTTng's realm, is a term often used metonymically, +having multiple definitions depending on the context: + +. When tracing, an event is a _point in space-time_. Space, in a + tracing context, is the set of all executable positions of a + compiled application by a logical processor. When a program is + executed by a processor and some instrumentation point, or + _probe_, is encountered, an event occurs. This event is accompanied + by some contextual payload (values of specific variables at this + point of execution) which may or may not be recorded. +. In the context of a recorded trace file, the term _event_ implies + a _recorded event_. +. When configuring a tracing session, _enabled events_ refer to + specific rules which could lead to the transfer of actual + occurring events (1) to recorded events (2). + +The whole <> section focuses on the +third definition. An event is always registered to _one or more_ +channels and may be enabled or disabled at will per channel. A disabled +event never leads to a recorded event, even if its channel is enabled. + +An event (3) is enabled with a few conditions that must _all_ be met +when an event (1) happens in order to generate a recorded event (2): + +. A _probe_ or group of probes in the traced application must be + executed. +. **Optionally**, the probe must have a log level matching a + log level range specified when enabling the event. +. **Optionally**, the occurring event must satisfy a custom + expression, or _filter_, specified when enabling the event. + + +[[plumbing]] +=== Plumbing + +The previous section described the concepts at the heart of LTTng. +This section summarizes LTTng's implementation: how those objects are +managed by different applications and libraries working together to +form the toolkit. + + +[[plumbing-overview]] +==== Overview + +As <>, the whole LTTng suite +is made of the LTTng-tools, LTTng-UST, and +LTTng-modules packages. Together, they provide different daemons, libraries, +kernel modules and command line interfaces. The following tree shows +which usable component belongs to which package: + +* **LTTng-tools**: +** session daemon (`lttng-sessiond`) +** consumer daemon (`lttng-consumerd`) +** relay daemon (`lttng-relayd`) +** tracing control library (`liblttng-ctl`) +** tracing control command line tool (`lttng`) +* **LTTng-UST**: +** user space tracing library (`liblttng-ust`) and its headers +** preloadable user space tracing helpers + (`liblttng-ust-libc-wrapper`, `liblttng-ust-pthread-wrapper`, + `liblttng-ust-cyg-profile`, `liblttng-ust-cyg-profile-fast` + and `liblttng-ust-dl`) +** user space tracepoint code generator command line tool + (`lttng-gen-tp`) +** `java.util.logging`/log4j tracepoint providers + (`liblttng-ust-jul-jni` and `liblttng-ust-log4j-jni`) and JAR + file (path:{liblttng-ust-agent.jar}) +* **LTTng-modules**: +** LTTng Linux kernel tracer module +** tracing ring buffer kernel modules +** many LTTng probe kernel modules + +The following diagram shows how the most important LTTng components +interact. Plain purple arrows represent trace data paths while dashed +red arrows indicate control communications. The LTTng relay daemon is +shown running on a remote system, although it could as well run on the +target (monitored) system. + +[role="img-100"] +.Control and data paths between LTTng components. +image::plumbing-26.png[] + +Each component is described in the following subsections. + + +[[lttng-sessiond]] +==== Session daemon + +At the heart of LTTng's plumbing is the _session daemon_, often called +by its command name, `lttng-sessiond`. + +The session daemon is responsible for managing tracing sessions and +what they logically contain (channel properties, enabled/disabled +events, and the rest). By communicating locally with instrumented +applications (using LTTng-UST) and with the LTTng Linux kernel modules +(LTTng-modules), it oversees all tracing activities. + +One of the many things that `lttng-sessiond` does is to keep +track of the available event types. User space applications and +libraries actively connect and register to the session daemon when they +start. By contrast, `lttng-sessiond` seeks out and loads the appropriate +LTTng kernel modules as part of its own initialization. Kernel event +types are _pulled_ by `lttng-sessiond`, whereas user space event types +are _pushed_ to it by the various user space tracepoint providers. + +Using a specific inter-process communication protocol with Linux kernel +and user space tracers, the session daemon can send channel information +so that they are initialized, enable/disable specific probes based on +enabled/disabled events by the user, send event filters information to +LTTng tracers so that filtering actually happens at the tracer site, +start/stop tracing a specific application or the Linux kernel, and more. + +The session daemon is not useful without some user controlling it, +because it's only a sophisticated control interchange and thus +doesn't make any decision on its own. `lttng-sessiond` opens a local +socket for controlling it, albeit the preferred way to control it is +using `liblttng-ctl`, an installed C library hiding the communication +protocol behind an easy-to-use API. The `lttng` tool makes use of +`liblttng-ctl` to implement a user-friendly command line interface. + +`lttng-sessiond` does not receive any trace data from instrumented +applications; the _consumer daemons_ are the programs responsible for +collecting trace data using shared ring buffers. However, the session +daemon is the one that must spawn a consumer daemon and establish +a control communication with it. + +Session daemons run on a per-user basis. Knowing this, multiple +instances of `lttng-sessiond` may run simultaneously, each belonging +to a different user and each operating independently of the others. +Only `root`'s session daemon, however, may control LTTng kernel modules +(that is, the kernel tracer). With that in mind, if a user has no root +access on the target system, he cannot trace the system's kernel, but +should still be able to trace its own instrumented applications. + +It has to be noted that, although only `root`'s session daemon may +control the kernel tracer, the `lttng-sessiond` command has a `--group` +option which may be used to specify the name of a special user group +allowed to communicate with `root`'s session daemon and thus record +kernel traces. By default, this group is named `tracing`. + +If not done yet, the `lttng` tool, by default, automatically starts a +session daemon. `lttng-sessiond` may also be started manually: + +[role="term"] +---- +lttng-sessiond +---- + +This starts the session daemon in foreground. Use + +[role="term"] +---- +lttng-sessiond --daemonize +---- + +to start it as a true daemon. + +To kill the current user's session daemon, `pkill` may be used: + +[role="term"] +---- +pkill lttng-sessiond +---- + +The default `SIGTERM` signal terminates it cleanly. + +Several other options are available and described in +man:lttng-sessiond(8) or by running `lttng-sessiond --help`. + + +[[lttng-consumerd]] +==== Consumer daemon + +The _consumer daemon_, or `lttng-consumerd`, is a program sharing some +ring buffers with user applications or the LTTng kernel modules to +collect trace data and output it at some place (on disk or sent over +the network to an LTTng relay daemon). + +Consumer daemons are created by a session daemon as soon as events are +enabled within a tracing session, well before tracing is activated +for the latter. Entirely managed by session daemons, +consumer daemons survive session destruction to be reused later, +should a new tracing session be created. Consumer daemons are always +owned by the same user as their session daemon. When its owner session +daemon is killed, the consumer daemon also exits. This is because +the consumer daemon is always the child process of a session daemon. +Consumer daemons should never be started manually. For this reason, +they are not installed in one of the usual locations listed in the +`PATH` environment variable. `lttng-sessiond` has, however, a +bunch of options (see man:lttng-sessiond(8)) to +specify custom consumer daemon paths if, for some reason, a consumer +daemon other than the default installed one is needed. + +There are up to two running consumer daemons per user, whereas only one +session daemon may run per user. This is because each process has +independent bitness: if the target system runs a mixture of 32-bit and +64-bit processes, it is more efficient to have separate corresponding +32-bit and 64-bit consumer daemons. The `root` user is an exception: it +may have up to _three_ running consumer daemons: 32-bit and 64-bit +instances for its user space applications and one more reserved for +collecting kernel trace data. + +As new tracing domains are added to LTTng, the development community's +intent is to minimize the need for additionnal consumer daemon instances +dedicated to them. For instance, the `java.util.logging` (JUL) domain +events are in fact mapped to the user space domain, thus tracing this +particular domain is handled by existing user space domain consumer +daemons. + + +[[lttng-relayd]] +==== Relay daemon + +When a tracing session is configured to send its trace data over the +network, an LTTng _relay daemon_ must be used at the other end to +receive trace packets and serialize them to trace files. This setup +makes it possible to trace a target system without ever committing trace +data to its local storage, a feature which is useful for embedded +systems, amongst others. The command implementing the relay daemon +is `lttng-relayd`. + +The basic use case of `lttng-relayd` is to transfer trace data received +over the network to trace files on the local file system. The relay +daemon must listen on two TCP ports to achieve this: one control port, +used by the target session daemon, and one data port, used by the +target consumer daemon. The relay and session daemons agree on common +default ports when custom ones are not specified. + +Since the communication transport protocol for both ports is standard +TCP, the relay daemon may be started either remotely or locally (on the +target system). + +While two instances of consumer daemons (32-bit and 64-bit) may run +concurrently for a given user, `lttng-relayd` needs only be of its +host operating system's bitness. + +The other important feature of LTTng's relay daemon is the support of +_LTTng live_. LTTng live is an application protocol to view events as +they arrive. The relay daemon still records events in trace files, +but a _tee_ allows to inspect incoming events. + +[role="img-100"] +.The relay daemon creates a _tee_, forwarding the trace data to both trace files and a live viewer. +image::lttng-live.png[] + +Using LTTng live locally thus requires to run a local relay daemon. + + +[[liblttng-ctl-lttng]] +==== [[lttng-cli]]Control library and command line interface + +The LTTng control library, `liblttng-ctl`, can be used to communicate +with the session daemon using a C API that hides the underlying +protocol's details. `liblttng-ctl` is part of LTTng-tools. + +`liblttng-ctl` may be used by including its "master" header: + +[source,c] +---- +#include +---- + +Some objects are referred by name (C string), such as tracing sessions, +but most of them require creating a handle first using +`lttng_create_handle()`. The best available developer documentation for +`liblttng-ctl` is, for the moment, its installed header files as such. +Every function/structure is thoroughly documented. + +The `lttng` program is the _de facto_ standard user interface to +control LTTng tracing sessions. `lttng` uses `liblttng-ctl` to +communicate with session daemons behind the scenes. +Its man page, man:lttng(1), is exhaustive, as well as its command +line help (+lttng _cmd_ --help+, where +_cmd_+ is the command name). + +The <> section is a feature +tour of the `lttng` tool. + + +[[lttng-ust]] +==== User space tracing library + +The user space tracing part of LTTng is possible thanks to the user +space tracing library, `liblttng-ust`, which is part of the LTTng-UST +package. + +`liblttng-ust` provides header files containing macros used to define +tracepoints and create tracepoint providers, as well as a shared object +that must be linked to individual applications to connect to and +communicate with a session daemon and a consumer daemon as soon as the +application starts. + +The exact mechanism by which an application is registered to the +session daemon is beyond the scope of this documentation. The only thing +you need to know is that, since the library constructor does this job +automatically, tracepoints may be safely inserted anywhere in the source +code without prior manual initialization of `liblttng-ust`. + +The `liblttng-ust`-session daemon collaboration also provides an +interesting feature: user space events may be enabled _before_ +applications actually start. By doing this and starting tracing before +launching the instrumented application, you make sure that even the +earliest occurring events can be recorded. + +The <> instrumenting guide of the +<> chapter focuses on using `liblttng-ust`: +instrumenting, building/linking and running a user application. + + +[[lttng-modules]] +==== LTTng kernel modules + +The LTTng Linux kernel modules provide everything needed to trace the +Linux kernel: various probes, a ring buffer implementation for a +consumer daemon to read trace data and the tracer itself. + +Only in exceptional circumstances should you ever need to load the +LTTng kernel modules manually: it is normally the responsability of +`root`'s session daemon to do so. Even if you were to develop your +own LTTng probe module--for tracing a custom kernel or some kernel +module (this topic is covered in the +<> instrumenting guide of +the <> chapter)—you +should use the `--extra-kmod-probes` option of the session daemon to +append your probe to the default list. The session and consumer daemons +of regular users do not interact with the LTTng kernel modules at all. + +LTTng kernel modules are installed, by default, in ++/usr/lib/modules/_release_/extra+, where +_release_+ is the +kernel release (see `uname --kernel-release`). + + +[[using-lttng]] +== Using LTTng + +Using LTTng involves two main activities: **instrumenting** and +**controlling tracing**. + +_<>_ is the process of inserting probes +into some source code. It can be done manually, by writing tracepoint +calls at specific locations in the source code of the program to trace, +or more automatically using dynamic probes (address in assembled code, +symbol name, function entry/return, and others). + +It has to be noted that, as an LTTng user, you may not have to worry +about the instrumentation process. Indeed, you may want to trace a +program already instrumented. As an example, the Linux kernel is +thoroughly instrumented, which is why you can trace it without caring +about adding probes. + +_<>_ is everything +that can be done by the LTTng session daemon, which is controlled using +`liblttng-ctl` or its command line utility, `lttng`: creating tracing +sessions, listing tracing sessions and events, enabling/disabling +events, starting/stopping the tracers, taking snapshots, amongst many +other commands. + +This chapter is a complete user guide of both activities, +with common use cases of LTTng exposed throughout the text. It is +assumed that you are familiar with LTTng's concepts (events, channels, +domains, tracing sessions) and that you understand the roles of its +components (daemons, libraries, command line tools); if not, we invite +you to read the <> chapter +before you begin reading this one. + +If you're new to LTTng, we suggest that you rather start with the +<> small guide first, then come +back here to broaden your knowledge. + +If you're only interested in tracing the Linux kernel with its current +instrumentation, you may skip the +<> section. + + +[[instrumenting]] +=== Instrumenting + +There are many examples of tracing and monitoring in our everyday life. +You have access to real-time and historical weather reports and forecasts +thanks to weather stations installed around the country. You know your +possibly hospitalized friends' and family's hearts are safe thanks to +electrocardiography. You make sure not to drive your car too fast +and have enough fuel to reach your destination thanks to gauges visible +on your dashboard. + +All the previous examples have something in common: they rely on +**probes**. Without electrodes attached to the surface of a body's +skin, cardiac monitoring would be futile. + +LTTng, as a tracer, is no different from the real life examples above. +If you're about to trace a software system or, put in other words, record its +history of execution, you better have probes in the subject you're +tracing: the actual software. Various ways were developed to do this. +The most straightforward one is to manually place probes, called +_tracepoints_, in the software's source code. The Linux kernel tracing +domain also allows probes added dynamically. + +If you're only interested in tracing the Linux kernel, it may very well +be that your tracing needs are already appropriately covered by LTTng's +built-in Linux kernel tracepoints and other probes. Or you may be in +possession of a user space application which has already been +instrumented. In such cases, the work resides entirely in the design +and execution of tracing sessions, allowing you to jump to +<> right now. + +This chapter focuses on the following use cases of instrumentation: + +* <> and <> applications +* <> +* <> +* <> module or the + kernel itself +* the <> + +Some advanced techniques are also presented at the very end of this +chapter. + + +[[c-application]] +==== C application + +Instrumenting a C (or $$C++$$) application, be it an executable program +or a library, implies using LTTng-UST, the +user space tracing component of LTTng. For C/$$C++$$ applications, the +LTTng-UST package includes a dynamically loaded library +(`liblttng-ust`), C headers and the `lttng-gen-tp` command line utility. + +Since C and $$C++$$ are the base languages of virtually all other +programming languages +(Java virtual machine, Python, Perl, PHP and Node.js interpreters, to +name a few), implementing user space tracing for an unsupported language +is just a matter of using the LTTng-UST C API at the right places. + +The usual work flow to instrument a user space C application with +LTTng-UST is: + +. Define tracepoints (actual probes) +. Write tracepoint providers +. Insert tracepoints into target source code +. Package (build) tracepoint providers +. Build user application and link it with tracepoint providers + +The steps above are discussed in greater detail in the following +subsections. + + +[[tracepoint-provider]] +===== Tracepoint provider + +Before jumping into defining tracepoints and inserting +them into the application source code, you must understand what a +_tracepoint provider_ is. + +For the sake of this guide, consider the following two files: + +[source,c] +.path:{tp.h} +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER my_provider + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./tp.h" + +#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TP_H + +#include + +TRACEPOINT_EVENT( + my_provider, + my_first_tracepoint, + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) + +TRACEPOINT_EVENT( + my_provider, + my_other_tracepoint, + TP_ARGS( + int, my_int + ), + TP_FIELDS( + ctf_integer(int, some_field, my_int) + ) +) + +#endif /* _TP_H */ + +#include +---- + +[source,c] +.path:{tp.c} +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +The two files above are defining a _tracepoint provider_. A tracepoint +provider is some sort of namespace for _tracepoint definitions_. Tracepoint +definitions are written above with the `TRACEPOINT_EVENT()` macro, and allow +eventual `tracepoint()` calls respecting their definitions to be inserted +into the user application's C source code (we explore this in a +later section). + +Many tracepoint definitions may be part of the same tracepoint provider +and many tracepoint providers may coexist in a user space application. A +tracepoint provider is packaged either: + +* directly into an existing user application's C source file +* as an object file +* as a static library +* as a shared library + +The two files above, path:{tp.h} and path:{tp.c}, show a typical template for +writing a tracepoint provider. LTTng-UST was designed so that two +tracepoint providers should not be defined in the same header file. + +We will now go through the various parts of the above files and +give them a meaning. As you may have noticed, the LTTng-UST API for +C/$$C++$$ applications is some preprocessor sorcery. The LTTng-UST macros +used in your application and those in the LTTng-UST headers are +combined to produce actual source code needed to make tracing possible +using LTTng. + +Let's start with the header file, path:{tp.h}. It begins with + +[source,c] +---- +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER my_provider +---- + +`TRACEPOINT_PROVIDER` defines the name of the provider to which the +following tracepoint definitions belong. It is used internally by +LTTng-UST headers and _must_ be defined. Since `TRACEPOINT_PROVIDER` +could have been defined by another header file also included by the same +C source file, the best practice is to undefine it first. + +NOTE: Names in LTTng-UST follow the C +_identifier_ syntax (starting with a letter and containing either +letters, numbers or underscores); they are _not_ C strings +(not surrounded by double quotes). This is because LTTng-UST macros +use those identifier-like strings to create symbols (named types and +variables). + +The tracepoint provider is a group of tracepoint definitions; its chosen +name should reflect this. A hierarchy like Java packages is recommended, +using underscores instead of dots, for example, +`org_company_project_component`. + +Next is `TRACEPOINT_INCLUDE`: + +[source,c] +---- +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./tp.h" +---- + +This little bit of instrospection is needed by LTTng-UST to include +your header at various predefined places. + +Include guard follows: + +[source,c] +---- +#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TP_H +---- + +Add these precompiler conditionals to ensure the tracepoint event +generation can include this file more than once. + +The `TRACEPOINT_EVENT()` macro is defined in a LTTng-UST header file which +must be included: + +[source,c] +---- +#include +---- + +This also allows the application to use the `tracepoint()` macro. + +Next is a list of `TRACEPOINT_EVENT()` macro calls which create the +actual tracepoint definitions. We skip this for the moment and +come back to how to use `TRACEPOINT_EVENT()` +<>. Just pay attention to +the first argument: it's always the name of the tracepoint provider +being defined in this header file. + +End of include guard: + +[source,c] +---- +#endif /* _TP_H */ +---- + +Finally, include `` to expand the macros: + +[source,c] +---- +#include +---- + +That's it for path:{tp.h}. Of course, this is only a header file; it must be +included in some C source file to actually use it. This is the job of +path:{tp.c}: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +When `TRACEPOINT_CREATE_PROBES` is defined, the macros used in path:{tp.h}, +which is included just after, actually create the source code for +LTTng-UST probes (global data structures and functions) out of your +tracepoint definitions. How exactly this is done is out of this text's scope. +`TRACEPOINT_CREATE_PROBES` is discussed further +in +<>. + +You could include other header files like path:{tp.h} here to create the probes +of different tracepoint providers, for example: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp1.h" +#include "tp2.h" +---- + +The rule is: probes of a given tracepoint provider +must be created in exactly one source file. This source file could be one +of your project's; it doesn't have to be on its own like +path:{tp.c}, although +<> +shows that doing so allows packaging the tracepoint providers +independently and keep them out of your application, also making it +possible to reuse them between projects. + +The following sections explain how to define tracepoints, how to use the +`tracepoint()` macro to instrument your user space C application and how +to build/link tracepoint providers and your application with LTTng-UST +support. + + +[[lttng-gen-tp]] +===== Using `lttng-gen-tp` + +LTTng-UST ships with `lttng-gen-tp`, a handy command line utility for +generating most of the stuff discussed above. It takes a _template file_, +with a name usually ending with the `.tp` extension, containing only +tracepoint definitions, and outputs a tracepoint provider (either a C +source file or a precompiled object file) with its header file. + +`lttng-gen-tp` should suffice in <> +situations. When using it, write a template file containing a list of +`TRACEPOINT_EVENT()` macro calls. The tool finds the provider names +used and generate the appropriate files which are going to look a lot +like path:{tp.h} and path:{tp.c} above. + +Just call `lttng-gen-tp` like this: + +[role="term"] +---- +lttng-gen-tp my-template.tp +---- + +path:{my-template.c}, path:{my-template.o} and path:{my-template.h} +are created in the same directory. + +You may specify custom C flags passed to the compiler invoked by +`lttng-gen-tp` using the `CFLAGS` environment variable: + +[role="term"] +---- +CFLAGS=-I/custom/include/path lttng-gen-tp my-template.tp +---- + +For more information on `lttng-gen-tp`, see man:lttng-gen-tp(1). + + +[[defining-tracepoints]] +===== Defining tracepoints + +As written in <>, +tracepoints are defined using the +`TRACEPOINT_EVENT()` macro. Each tracepoint, when called using the +`tracepoint()` macro in the actual application's source code, generates +a specific event type with its own fields. + +Let's have another look at the example above, with a few added comments: + +[source,c] +---- +TRACEPOINT_EVENT( + /* tracepoint provider name */ + my_provider, + + /* tracepoint/event name */ + my_first_tracepoint, + + /* list of tracepoint arguments */ + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + + /* list of fields of eventual event */ + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) +---- + +The tracepoint provider name must match the name of the tracepoint +provider in which this tracepoint is defined +(see <>). In other words, +always use the same string as the value of `TRACEPOINT_PROVIDER` above. + +The tracepoint name becomes the event name once events are recorded +by the LTTng-UST tracer. It must follow the tracepoint provider name +syntax: start with a letter and contain either letters, numbers or +underscores. Two tracepoints under the same provider cannot have the +same name. In other words, you cannot overload a tracepoint like you +would overload functions and methods in $$C++$$/Java. + +NOTE: The concatenation of the tracepoint +provider name and the tracepoint name cannot exceed 254 characters. If +it does, the instrumented application compiles and runs, but LTTng +issues multiple warnings and you could experience serious problems. + +The list of tracepoint arguments gives this tracepoint its signature: +see it like the declaration of a C function. The format of `TP_ARGS()` +arguments is: C type, then argument name; repeat as needed, up to ten +times. For example, if we were to replicate the signature of C standard +library's `fseek()`, the `TP_ARGS()` part would look like: + +[source,c] +---- + TP_ARGS( + FILE*, stream, + long int, offset, + int, origin + ), +---- + +Of course, you need to include appropriate header files before +the `TRACEPOINT_EVENT()` macro calls if any argument has a complex type. + +`TP_ARGS()` may not be omitted, but may be empty. `TP_ARGS(void)` is +also accepted. + +The list of fields is where the fun really begins. The fields defined +in this list are the fields of the events generated by the execution +of this tracepoint. Each tracepoint field definition has a C +_argument expression_ which is evaluated when the execution reaches +the tracepoint. Tracepoint arguments _may be_ used freely in those +argument expressions, but they _don't_ have to. + +There are several types of tracepoint fields available. The macros to +define them are given and explained in the +<> section. + +Field names must follow the standard C identifier syntax: letter, then +optional sequence of letters, numbers or underscores. Each field must have +a different name. + +Those `ctf_*()` macros are added to the `TP_FIELDS()` part of +`TRACEPOINT_EVENT()`. Note that they are not delimited by commas. +`TP_FIELDS()` may be empty, but the `TP_FIELDS(void)` form is _not_ +accepted. + +The following snippet shows how argument expressions may be used in +tracepoint fields and how they may refer freely to tracepoint arguments. + +[source,c] +---- +/* for struct stat */ +#include +#include +#include + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + int, my_int_arg, + char*, my_str_arg, + struct stat*, st + ), + TP_FIELDS( + /* simple integer field with constant value */ + ctf_integer( + int, /* field C type */ + my_constant_field, /* field name */ + 23 + 17 /* argument expression */ + ) + + /* my_int_arg tracepoint argument */ + ctf_integer( + int, + my_int_arg_field, + my_int_arg + ) + + /* my_int_arg squared */ + ctf_integer( + int, + my_int_arg_field2, + my_int_arg * my_int_arg + ) + + /* sum of first 4 characters of my_str_arg */ + ctf_integer( + int, + sum4, + my_str_arg[0] + my_str_arg[1] + + my_str_arg[2] + my_str_arg[3] + ) + + /* my_str_arg as string field */ + ctf_string( + my_str_arg_field, /* field name */ + my_str_arg /* argument expression */ + ) + + /* st_size member of st tracepoint argument, hexadecimal */ + ctf_integer_hex( + off_t, /* field C type */ + size_field, /* field name */ + st->st_size /* argument expression */ + ) + + /* st_size member of st tracepoint argument, as double */ + ctf_float( + double, /* field C type */ + size_dbl_field, /* field name */ + (double) st->st_size /* argument expression */ + ) + + /* half of my_str_arg string as text sequence */ + ctf_sequence_text( + char, /* element C type */ + half_my_str_arg_field, /* field name */ + my_str_arg, /* argument expression */ + size_t, /* length expression C type */ + strlen(my_str_arg) / 2 /* length expression */ + ) + ) +) +---- + +As you can see, having a custom argument expression for each field +makes tracepoints very flexible for tracing a user space C application. +This tracepoint definition is reused later in this guide, when +actually using tracepoints in a user space application. + + +[[using-tracepoint-classes]] +===== Using tracepoint classes + +In LTTng-UST, a _tracepoint class_ is a class of tracepoints sharing the +same field types and names. A _tracepoint instance_ is one instance of +such a declared tracepoint class, with its own event name and tracepoint +provider name. + +What is documented in <> +is actually how to declare a _tracepoint class_ and define a +_tracepoint instance_ at the same time. Without revealing the internals +of LTTng-UST too much, it has to be noted that one serialization +function is created for each tracepoint class. A serialization +function is responsible for serializing the fields of a tracepoint +into a sub-buffer when tracing. For various performance reasons, when +your situation requires multiple tracepoints with different names, but +with the same fields layout, the best practice is to manually create +a tracepoint class and instantiate as many tracepoint instances as +needed. One positive effect of such a design, amongst other advantages, +is that all tracepoint instances of the same tracepoint class +reuse the same serialization function, thus reducing cache pollution. + +As an example, here are three tracepoint definitions as we know them: + +[source,c] +---- +TRACEPOINT_EVENT( + my_app, + get_account, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +TRACEPOINT_EVENT( + my_app, + get_settings, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +TRACEPOINT_EVENT( + my_app, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ), + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) +---- + +In this case, three tracepoint classes are created, with one tracepoint +instance for each of them: `get_account`, `get_settings` and +`get_transaction`. However, they all share the same field names and +types. Declaring one tracepoint class and three tracepoint instances of +the latter is a better design choice: + +[source,c] +---- +/* the tracepoint class */ +TRACEPOINT_EVENT_CLASS( + /* tracepoint provider name */ + my_app, + + /* tracepoint class name */ + my_class, + + /* arguments */ + TP_ARGS( + int, userid, + size_t, len + ), + + /* fields */ + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +/* the tracepoint instances */ +TRACEPOINT_EVENT_INSTANCE( + /* tracepoint provider name */ + my_app, + + /* tracepoint class name */ + my_class, + + /* tracepoint/event name */ + get_account, + + /* arguments */ + TP_ARGS( + int, userid, + size_t, len + ) +) +TRACEPOINT_EVENT_INSTANCE( + my_app, + my_class, + get_settings, + TP_ARGS( + int, userid, + size_t, len + ) +) +TRACEPOINT_EVENT_INSTANCE( + my_app, + my_class, + get_transaction, + TP_ARGS( + int, userid, + size_t, len + ) +) +---- + +Of course, all those names and `TP_ARGS()` invocations are redundant, +but some C preprocessor magic can solve this: + +[source,c] +---- +#define MY_TRACEPOINT_ARGS \ + TP_ARGS( \ + int, userid, \ + size_t, len \ + ) + +TRACEPOINT_EVENT_CLASS( + my_app, + my_class, + MY_TRACEPOINT_ARGS, + TP_FIELDS( + ctf_integer(int, userid, userid) + ctf_integer(size_t, len, len) + ) +) + +#define MY_APP_TRACEPOINT_INSTANCE(name) \ + TRACEPOINT_EVENT_INSTANCE( \ + my_app, \ + my_class, \ + name, \ + MY_TRACEPOINT_ARGS \ + ) + +MY_APP_TRACEPOINT_INSTANCE(get_account) +MY_APP_TRACEPOINT_INSTANCE(get_settings) +MY_APP_TRACEPOINT_INSTANCE(get_transaction) +---- + + +[[assigning-log-levels]] +===== Assigning log levels to tracepoints + +Optionally, a log level can be assigned to a defined tracepoint. +Assigning different levels of importance to tracepoints can be useful; +when controlling tracing sessions, +<> to only enable tracepoints +falling into a specific log level range. + +Log levels are assigned to defined tracepoints using the +`TRACEPOINT_LOGLEVEL()` macro. The latter must be used _after_ having +used `TRACEPOINT_EVENT()` for a given tracepoint. The +`TRACEPOINT_LOGLEVEL()` macro has the following construct: + +[source,c] +---- +TRACEPOINT_LOGLEVEL(PROVIDER_NAME, TRACEPOINT_NAME, LOG_LEVEL) +---- + +where the first two arguments are the same as the first two arguments +of `TRACEPOINT_EVENT()` and `LOG_LEVEL` is one +of the values given in the +<> +section. + +As an example, let's assign a `TRACE_DEBUG_UNIT` log level to our +previous tracepoint definition: + +[source,c] +---- +TRACEPOINT_LOGLEVEL(my_provider, my_tracepoint, TRACE_DEBUG_UNIT) +---- + + +[[probing-the-application-source-code]] +===== Probing the application's source code + +Once tracepoints are properly defined within a tracepoint provider, +they may be inserted into the user application to be instrumented +using the `tracepoint()` macro. Its first argument is the tracepoint +provider name and its second is the tracepoint name. The next, optional +arguments are defined by the `TP_ARGS()` part of the definition of +the tracepoint to use. + +As an example, let us again take the following tracepoint definition: + +[source,c] +---- +TRACEPOINT_EVENT( + /* tracepoint provider name */ + my_provider, + + /* tracepoint/event name */ + my_first_tracepoint, + + /* list of tracepoint arguments */ + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + + /* list of fields of eventual event */ + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) +---- + +Assuming this is part of a file named path:{tp.h} which defines the tracepoint +provider and which is included by path:{tp.c}, here's a complete C application +calling this tracepoint (multiple times): + +[source,c] +---- +#define TRACEPOINT_DEFINE +#include "tp.h" + +int main(int argc, char* argv[]) +{ + int i; + + tracepoint(my_provider, my_first_tracepoint, 23, "Hello, World!"); + + for (i = 0; i < argc; ++i) { + tracepoint(my_provider, my_first_tracepoint, i, argv[i]); + } + + return 0; +} +---- + +For each tracepoint provider, `TRACEPOINT_DEFINE` must be defined into +exactly one translation unit (C source file) of the user application, +before including the tracepoint provider header file. In other words, +for a given tracepoint provider, you cannot define `TRACEPOINT_DEFINE`, +and then include its header file in two separate C source files of +the same application. `TRACEPOINT_DEFINE` is discussed further in +<>. + +As another example, remember this definition we wrote in a previous +section (comments are stripped): + +[source,c] +---- +/* for struct stat */ +#include +#include +#include + +TRACEPOINT_EVENT( + my_provider, + my_tracepoint, + TP_ARGS( + int, my_int_arg, + char*, my_str_arg, + struct stat*, st + ), + TP_FIELDS( + ctf_integer(int, my_constant_field, 23 + 17) + ctf_integer(int, my_int_arg_field, my_int_arg) + ctf_integer(int, my_int_arg_field2, my_int_arg * my_int_arg) + ctf_integer(int, sum4_field, my_str_arg[0] + my_str_arg[1] + + my_str_arg[2] + my_str_arg[3]) + ctf_string(my_str_arg_field, my_str_arg) + ctf_integer_hex(off_t, size_field, st->st_size) + ctf_float(double, size_dbl_field, (double) st->st_size) + ctf_sequence_text(char, half_my_str_arg_field, my_str_arg, + size_t, strlen(my_str_arg) / 2) + ) +) +---- + +Here's an example of calling it: + +[source,c] +---- +#define TRACEPOINT_DEFINE +#include "tp.h" + +int main(void) +{ + struct stat s; + + stat("/etc/fstab", &s); + + tracepoint(my_provider, my_tracepoint, 23, "Hello, World!", &s); + + return 0; +} +---- + +When viewing the trace, assuming the file size of path:{/etc/fstab} is +301{nbsp}bytes, the event generated by the execution of this tracepoint +should have the following fields, in this order: + +---- +my_constant_field 40 +my_int_arg_field 23 +my_int_arg_field2 529 +sum4_field 389 +my_str_arg_field "Hello, World!" +size_field 0x12d +size_dbl_field 301.0 +half_my_str_arg_field "Hello," +---- + + +[[building-tracepoint-providers-and-user-application]] +===== Building/linking tracepoint providers and the user application + +The final step of using LTTng-UST for tracing a user space C application +(beside running the application) is building and linking tracepoint +providers and the application itself. + +As discussed above, the macros used by the user-written tracepoint provider +header file are useless until actually used to create probes code +(global data structures and functions) in a translation unit (C source file). +This is accomplished by defining `TRACEPOINT_CREATE_PROBES` in a translation +unit and then including the tracepoint provider header file. +When `TRACEPOINT_CREATE_PROBES` is defined, macros used and included by +the tracepoint provider header produce actual source code needed by any +application using the defined tracepoints. Defining +`TRACEPOINT_CREATE_PROBES` produces code used when registering +tracepoint providers when the tracepoint provider package loads. + +The other important definition is `TRACEPOINT_DEFINE`. This one creates +global, per-tracepoint structures referencing the tracepoint providers +data. Those structures are required by the actual functions inserted +where `tracepoint()` macros are placed and need to be defined by the +instrumented application. + +Both `TRACEPOINT_CREATE_PROBES` and `TRACEPOINT_DEFINE` need to be defined +at some places in order to trace a user space C application using LTTng. +Although explaining their exact mechanism is beyond the scope of this +document, the reason they both exist separately is to allow the trace +providers to be packaged as a shared object (dynamically loaded library). + +There are two ways to compile and link the tracepoint providers +with the application: _<>_ or +_<>_. Both methods are covered in the +following subsections. + + +[[static-linking]] +===== Static linking the tracepoint providers to the application + +With the static linking method, compiled tracepoint providers are copied +into the target application. There are three ways to do this: + +. Use one of your **existing C source files** to create probes. +. Create probes in a separate C source file and build it as an + **object file** to be linked with the application (more decoupled). +. Create probes in a separate C source file, build it as an + object file and archive it to create a **static library** + (more decoupled, more portable). + +The first approach is to define `TRACEPOINT_CREATE_PROBES` and include +your tracepoint provider(s) header file(s) directly into an existing C +source file. Here's an example: + +[source,c] +---- +#include +#include +/* ... */ + +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE +#include "tp.h" + +/* ... */ + +int my_func(int a, const char* b) +{ + /* ... */ + + tracepoint(my_provider, my_tracepoint, buf, sz, limit, &tt) + + /* ... */ +} + +/* ... */ +---- + +Again, before including a given tracepoint provider header file, +`TRACEPOINT_CREATE_PROBES` and `TRACEPOINT_DEFINE` must be defined in +one, **and only one**, translation unit. Other C source files of the +same application may include path:{tp.h} to use tracepoints with +the `tracepoint()` macro, but must not define +`TRACEPOINT_CREATE_PROBES`/`TRACEPOINT_DEFINE` again. + +This translation unit may be built as an object file by making sure to +add `.` to the include path: + +[role="term"] +---- +gcc -c -I. file.c +---- + +The second approach is to isolate the tracepoint provider code into a +separate object file by using a dedicated C source file to create probes: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" +---- + +`TRACEPOINT_DEFINE` must be defined by a translation unit of the +application. Since we're talking about static linking here, it could as +well be defined directly in the file above, before `#include "tp.h"`: + +[source,c] +---- +#define TRACEPOINT_CREATE_PROBES +#define TRACEPOINT_DEFINE + +#include "tp.h" +---- + +This is actually what <> does, and is +the recommended practice. + +Build the tracepoint provider: + +[role="term"] +---- +gcc -c -I. tp.c +---- + +Finally, the resulting object file may be archived to create a +more portable tracepoint provider static library: + +[role="term"] +---- +ar rc tp.a tp.o +---- + +Using a static library does have the advantage of centralising the +tracepoint providers objects so they can be shared between multiple +applications. This way, when the tracepoint provider is modified, the +source code changes don't have to be patched into each application's source +code tree. The applications need to be relinked after each change, but need +not to be otherwise recompiled (unless the tracepoint provider's API +changes). + +Regardless of which method you choose, you end up with an object file +(potentially archived) containing the trace providers assembled code. +To link this code with the rest of your application, you must also link +with `liblttng-ust` and `libdl`: + +[role="term"] +---- +gcc -o app tp.o other.o files.o of.o your.o app.o -llttng-ust -ldl +---- + +or + +[role="term"] +---- +gcc -o app tp.a other.o files.o of.o your.o app.o -llttng-ust -ldl +---- + +If you're using a BSD +system, replace `-ldl` with `-lc`: + +[role="term"] +---- +gcc -o app tp.a other.o files.o of.o your.o app.o -llttng-ust -lc +---- + +The application can be started as usual, for example: + +[role="term"] +---- +./app +---- + +The `lttng` command line tool can be used to +<>. + + +[[dynamic-linking]] +===== Dynamic linking the tracepoint providers to the application + +The second approach to package the tracepoint providers is to use +dynamic linking: the library and its member functions are explicitly +sought, loaded and unloaded at runtime using `libdl`. + +It has to be noted that, for a variety of reasons, the created shared +library is be dynamically _loaded_, as opposed to dynamically +_linked_. The tracepoint provider shared object is, however, linked +with `liblttng-ust`, so that `liblttng-ust` is guaranteed to be loaded +as soon as the tracepoint provider is. If the tracepoint provider is +not loaded, since the application itself is not linked with +`liblttng-ust`, the latter is not loaded at all and the tracepoint calls +become inert. + +The process to create the tracepoint provider shared object is pretty +much the same as the static library method, except that: + +* since the tracepoint provider is not part of the application + anymore, `TRACEPOINT_DEFINE` _must_ be defined, for each tracepoint + provider, in exactly one translation unit (C source file) of the + _application_; +* `TRACEPOINT_PROBE_DYNAMIC_LINKAGE` must be defined next to + `TRACEPOINT_DEFINE`. + +Regarding `TRACEPOINT_DEFINE` and `TRACEPOINT_PROBE_DYNAMIC_LINKAGE`, +the recommended practice is to use a separate C source file in your +application to define them, then include the tracepoint provider +header files afterwards. For example: + +[source,c] +---- +#define TRACEPOINT_DEFINE +#define TRACEPOINT_PROBE_DYNAMIC_LINKAGE + +/* include the header files of one or more tracepoint providers below */ +#include "tp1.h" +#include "tp2.h" +#include "tp3.h" +---- + +`TRACEPOINT_PROBE_DYNAMIC_LINKAGE` makes the macros included afterwards +(by including the tracepoint provider header, which itself includes +LTTng-UST headers) aware that the tracepoint provider is to be loaded +dynamically and not part of the application's executable. + +The tracepoint provider object file used to create the shared library +is built like it is using the static library method, only with the +`-fpic` option added: + +[role="term"] +---- +gcc -c -fpic -I. tp.c +---- + +It is then linked as a shared library like this: + +[role="term"] +---- +gcc -shared -Wl,--no-as-needed -o tp.so -llttng-ust tp.o +---- + +As previously stated, this tracepoint provider shared object isn't +linked with the user application: it's loaded manually. This is +why the application is built with no mention of this tracepoint +provider, but still needs `libdl`: + +[role="term"] +---- +gcc -o app other.o files.o of.o your.o app.o -ldl +---- + +Now, to make LTTng-UST tracing available to the application, the +`LD_PRELOAD` environment variable is used to preload the tracepoint +provider shared library _before_ the application actually starts: + +[role="term"] +---- +LD_PRELOAD=/path/to/tp.so ./app +---- + +[NOTE] +==== +It is not safe to use +`dlclose()` on a tracepoint provider shared object that +is being actively used for tracing, due to a lack of reference +counting from LTTng-UST to the shared object. + +For example, statically linking a tracepoint provider to a +shared object which is to be dynamically loaded by an application +(a plugin, for example) is not safe: the shared object, which +contains the tracepoint provider, could be dynamically closed +(`dlclose()`) at any time by the application. + +To instrument a shared object, either: + +* Statically link the tracepoint provider to the _application_, or +* Build the tracepoint provider as a shared object (following + the procedure shown in this section), and preload it when + tracing is needed using the `LD_PRELOAD` + environment variable. +==== + +Your application will still work without this preloading, albeit without +LTTng-UST tracing support: + +[role="term"] +---- +./app +---- + + +[[using-lttng-ust-with-daemons]] +===== Using LTTng-UST with daemons + +Some extra care is needed when using `liblttng-ust` with daemon +applications that call `fork()`, `clone()` or BSD's `rfork()` without +a following `exec()` family system call. The `liblttng-ust-fork` +library must be preloaded for the application. + +Example: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-fork.so ./app +---- + +Or, if you're using a tracepoint provider shared library: + +[role="term"] +---- +LD_PRELOAD="liblttng-ust-fork.so /path/to/tp.so" ./app +---- + + +[[lttng-ust-pkg-config]] +===== Using pkg-config + +On some distributions, LTTng-UST is shipped with a pkg-config metadata +file, so that you may use the `pkg-config` tool: + +[role="term"] +---- +pkg-config --libs lttng-ust +---- + +This prints `-llttng-ust -ldl` on Linux systems. + +You may also check the LTTng-UST version using `pkg-config`: + +[role="term"] +---- +pkg-config --modversion lttng-ust +---- + +For more information about pkg-config, see +http://linux.die.net/man/1/pkg-config[its manpage]. + + +[role="since-2.5"] +[[tracef]] +===== Using `tracef()` + +`tracef()` is a small LTTng-UST API to avoid defining your own +tracepoints and tracepoint providers. The signature of `tracef()` is +the same as `printf()`'s. + +The `tracef()` utility function was developed to make user space tracing +super simple, albeit with notable disadvantages compared to custom, +full-fledged tracepoint providers: + +* All generated events have the same provider/event names, respectively + `lttng_ust_tracef` and `event`. +* There's no static type checking. +* The only event field you actually get, named `msg`, is a string + potentially containing the values you passed to the function + using your own format. This also means that you cannot use filtering + using a custom expression at runtime because there are no isolated + fields. +* Since `tracef()` uses C standard library's `vasprintf()` function + in the background to format the strings at runtime, its + expected performance is lower than using custom tracepoint providers + with typed fields, which do not require a conversion to a string. + +Thus, `tracef()` is useful for quick prototyping and debugging, but +should not be considered for any permanent/serious application +instrumentation. + +To use `tracef()`, first include `` in the C source file +where you need to insert probes: + +[source,c] +---- +#include +---- + +Use `tracef()` like you would use `printf()` in your source code, for +example: + +[source,c] +---- + /* ... */ + + tracef("my message, my integer: %d", my_integer); + + /* ... */ +---- + +Link your application with `liblttng-ust`: + +[role="term"] +---- +gcc -o app app.c -llttng-ust +---- + +Execute the application as usual: + +[role="term"] +---- +./app +---- + +Voilà! Use the `lttng` command line tool to +<>. You can enable `tracef()` +events like this: + +[role="term"] +---- +lttng enable-event --userspace 'lttng_ust_tracef:*' +---- + + +[[lttng-ust-environment-variables-compiler-flags]] +===== LTTng-UST environment variables and special compilation flags + +A few special environment variables and compile flags may affect the +behavior of LTTng-UST. + +LTTng-UST's debugging can be activated by setting the environment +variable `LTTNG_UST_DEBUG` to `1` when launching the application. It +can also be enabled at compile time by defining `LTTNG_UST_DEBUG` when +compiling LTTng-UST (using the `-DLTTNG_UST_DEBUG` compiler option). + +The environment variable `LTTNG_UST_REGISTER_TIMEOUT` can be used to +specify how long the application should wait for the +<>'s _registration done_ command +before proceeding to execute the main program. The timeout value is +specified in milliseconds. 0 means _don't wait_. -1 means +_wait forever_. Setting this environment variable to 0 is recommended +for applications with time contraints on the process startup time. + +The default value of `LTTNG_UST_REGISTER_TIMEOUT` (when not defined) +is **3000{nbsp}ms**. + +The compilation definition `LTTNG_UST_DEBUG_VALGRIND` should be enabled +at build time (`-DLTTNG_UST_DEBUG_VALGRIND`) to allow `liblttng-ust` +to be used with http://valgrind.org/[Valgrind]. +The side effect of defining `LTTNG_UST_DEBUG_VALGRIND` is that per-CPU +buffering is disabled. + + +[[cxx-application]] +==== $$C++$$ application + +Because of $$C++$$'s cross-compatibility with the C language, $$C++$$ +applications can be readily instrumented with the LTTng-UST C API. + +Follow the <> user guide above. It +should be noted that, in this case, tracepoint providers should have +the typical `.cpp`, `.cxx` or `.cc` extension and be built with `g++` +instead of `gcc`. This is the easiest way of avoiding linking errors +due to symbol name mangling incompatibilities between both languages. + + +[[prebuilt-ust-helpers]] +==== Prebuilt user space tracing helpers + +The LTTng-UST package provides a few helpers that one may find +useful in some situations. They all work the same way: you must +preload the appropriate shared object before running the user +application (using the `LD_PRELOAD` environment variable). + +The shared objects are normally found in dir:{/usr/lib}. + +The current installed helpers are: + +path:{liblttng-ust-libc-wrapper.so} and path:{liblttng-ust-pthread-wrapper.so}:: + <>. + +path:{liblttng-ust-cyg-profile.so} and path:{liblttng-ust-cyg-profile-fast.so}:: + <>. + +path:{liblttng-ust-dl.so}:: + <>. + +The following subsections document what helpers instrument exactly +and how to use them. + + +[role="since-2.3"] +[[liblttng-ust-libc-pthread-wrapper]] +===== C standard library and POSIX threads tracing + +path:{liblttng-ust-libc-wrapper.so} and path:{liblttng-ust-pthread-wrapper.so} +can add instrumentation to respectively some C standard library and +POSIX threads functions. + +The following functions are traceable by path:{liblttng-ust-libc-wrapper.so}: + +[role="growable"] +.Functions instrumented by path:{liblttng-ust-libc-wrapper.so} +|==== +|TP provider name |TP name |Instrumented function + +.6+|`ust_libc` |`malloc` |`malloc()` + |`calloc` |`calloc()` + |`realloc` |`realloc()` + |`free` |`free()` + |`memalign` |`memalign()` + |`posix_memalign` |`posix_memalign()` +|==== + +The following functions are traceable by +path:{liblttng-ust-pthread-wrapper.so}: + +[role="growable"] +.Functions instrumented by path:{liblttng-ust-pthread-wrapper.so} +|==== +|TP provider name |TP name |Instrumented function + +.4+|`ust_pthread` |`pthread_mutex_lock_req` |`pthread_mutex_lock()` (request time) + |`pthread_mutex_lock_acq` |`pthread_mutex_lock()` (acquire time) + |`pthread_mutex_trylock` |`pthread_mutex_trylock()` + |`pthread_mutex_unlock` |`pthread_mutex_unlock()` +|==== + +All tracepoints have fields corresponding to the arguments of the +function they instrument. + +To use one or the other with any user application, independently of +how the latter is built, do: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-libc-wrapper.so my-app +---- + +or + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-pthread-wrapper.so my-app +---- + +To use both, do: + +[role="term"] +---- +LD_PRELOAD="liblttng-ust-libc-wrapper.so liblttng-ust-pthread-wrapper.so" my-app +---- + +When the shared object is preloaded, it effectively replaces the +functions listed in the above tables by wrappers which add tracepoints +and call the replaced functions. + +Of course, like any other tracepoint, the ones above need to be enabled +in order for LTTng-UST to generate events. This is done using the +`lttng` command line tool +(see <>). + + +[[liblttng-ust-cyg-profile]] +===== Function tracing + +Function tracing is the recording of which functions are entered and +left during the execution of an application. Like with any LTTng event, +the precise time at which this happens is also kept. + +GCC and clang have an option named +https://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Code-Gen-Options.html[`-finstrument-functions`] +which generates instrumentation calls for entry and exit to functions. +The LTTng-UST function tracing helpers, path:{liblttng-ust-cyg-profile.so} +and path:{liblttng-ust-cyg-profile-fast.so}, take advantage of this feature +to add instrumentation to the two generated functions (which contain +`cyg_profile` in their names, hence the shared object's name). + +In order to use LTTng-UST function tracing, the translation units to +instrument must be built using the `-finstrument-functions` compiler +flag. + +LTTng-UST function tracing comes in two flavors, each providing +different trade-offs: path:{liblttng-ust-cyg-profile-fast.so} and +path:{liblttng-ust-cyg-profile.so}. + +**path:{liblttng-ust-cyg-profile-fast.so}** is a lightweight variant that +should only be used where it can be _guaranteed_ that the complete event +stream is recorded without any missing events. Any kind of duplicate +information is left out. This version registers the following +tracepoints: + +[role="growable",options="header,autowidth"] +.Functions instrumented by path:{liblttng-ust-cyg-profile-fast.so} +|==== +|TP provider name |TP name |Instrumented function + +.2+|`lttng_ust_cyg_profile_fast` + +|`func_entry` +a|Function entry + +`addr`:: + Address of called function. + +|`func_exit` +|Function exit +|==== + +Assuming no event is lost, having only the function addresses on entry +is enough for creating a call graph (remember that a recorded event +always contains the ID of the CPU that generated it). A tool like +https://sourceware.org/binutils/docs/binutils/addr2line.html[`addr2line`] +may be used to convert function addresses back to source files names +and line numbers. + +The other helper, +**path:{liblttng-ust-cyg-profile.so}**, +is a more robust variant which also works for use cases where +events might get discarded or not recorded from application startup. +In these cases, the trace analyzer needs extra information to be +able to reconstruct the program flow. This version registers the +following tracepoints: + +[role="growable",options="header,autowidth"] +.Functions instrumented by path:{liblttng-ust-cyg-profile.so} +|==== +|TP provider name |TP name |Instrumented function + +.2+|`lttng_ust_cyg_profile` + +|`func_entry` +a|Function entry + +`addr`:: + Address of called function. + +`call_site`:: + Call site address. + +|`func_exit` +a|Function exit + +`addr`:: + Address of called function. + +`call_site`:: + Call site address. +|==== + +To use one or the other variant with any user application, assuming at +least one translation unit of the latter is compiled with the +`-finstrument-functions` option, do: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-cyg-profile-fast.so my-app +---- + +or + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-cyg-profile.so my-app +---- + +It might be necessary to limit the number of source files where +`-finstrument-functions` is used to prevent excessive amount of trace +data to be generated at runtime. + +TIP: When using GCC, at least, you can use + the `-finstrument-functions-exclude-function-list` + option to avoid instrumenting entries and exits of specific + symbol names. + +All events generated from LTTng-UST function tracing are provided on +log level `TRACE_DEBUG_FUNCTION`, which is useful to easily enable +function tracing events in your tracing session using the +`--loglevel-only` option of `lttng enable-event` +(see <>). + + +[role="since-2.4"] +[[liblttng-ust-dl]] +===== Dynamic linker tracing + +This LTTng-UST helper causes all calls to `dlopen()` and `dlclose()` +in the target application to be traced with LTTng. + +The helper's shared object, path:{liblttng-ust-dl.so}, registers the +following tracepoints when preloaded: + +[role="growable",options="header,autowidth"] +.Functions instrumented by path:{liblttng-ust-dl.so} +|==== +|TP provider name |TP name |Instrumented function + +.2+|`ust_baddr` + +|`push` +a|`dlopen()` call + +`baddr`:: + Memory base address (where the dynamic linker placed the shared + object). + +`sopath`:: + File system path to the loaded shared object. + +`size`:: + File size of the the loaded shared object. + +`mtime`:: + Last modification time (seconds since Epoch time) of the loaded shared + object. + +|`pop` +a|Function exit + +`baddr`:: + Memory base address (where the dynamic linker placed the shared + object). +|==== + +To use this LTTng-UST helper with any user application, independently of +how the latter is built, do: + +[role="term"] +---- +LD_PRELOAD=liblttng-ust-dl.so my-app +---- + +Of course, like any other tracepoint, the ones above need to be enabled +in order for LTTng-UST to generate events. This is done using the +`lttng` command line tool +(see <>). + + +[role="since-2.4"] +[[java-application]] +==== Java application + +LTTng-UST provides a _logging_ back-end for Java applications using either +http://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html[`java.util.logging`] +(JUL) or +http://logging.apache.org/log4j/1.2/[Apache log4j 1.2] +This back-end is called the _LTTng-UST Java agent_, and it is responsible +for the communications with an LTTng session daemon. + +From the user's point of view, once the LTTng-UST Java agent has been +initialized, JUL and log4j loggers may be created and used as usual. +The agent adds its own handler to the _root logger_, so that all +loggers may generate LTTng events with no effort. + +Common JUL/log4j features are supported using the `lttng` tool +(see <>): + +* listing all logger names +* enabling/disabling events per logger name +* JUL/log4j log levels + + +[role="since-2.1"] +[[jul]] +===== `java.util.logging` + +Here's an example of tracing a Java application which is using +**`java.util.logging`**: + +[source,java] +---- +import java.util.logging.Logger; +import org.lttng.ust.agent.LTTngAgent; + +public class Test +{ + private static final int answer = 42; + + public static void main(String[] argv) throws Exception + { + // create a logger + Logger logger = Logger.getLogger("jello"); + + // call this as soon as possible (before logging) + LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); + + // log at will! + logger.info("some info"); + logger.warning("some warning"); + Thread.sleep(500); + logger.finer("finer information; the answer is " + answer); + Thread.sleep(123); + logger.severe("error!"); + + // not mandatory, but cleaner + lttngAgent.dispose(); + } +} +---- + +The LTTng-UST Java agent is packaged in a JAR file named +`liblttng-ust-agent.jar` It is typically located in +dir:{/usr/lib/lttng/java}. To compile the snippet above +(saved as `Test.java`), do: + +[role="term"] +---- +javac -cp /usr/lib/lttng/java/liblttng-ust-agent.jar Test.java +---- + +You can run the resulting compiled class like this: + +[role="term"] +---- +java -cp /usr/lib/lttng/java/liblttng-ust-agent.jar:. Test +---- + +NOTE: http://openjdk.java.net/[OpenJDK] 7 is used for development and +continuous integration, thus this version is directly supported. +However, the LTTng-UST Java agent has also been tested with OpenJDK 6. + + +[role="since-2.6"] +[[log4j]] +===== Apache log4j 1.2 + +LTTng features an Apache log4j 1.2 agent, which means your existing +Java applications using log4j 1.2 for logging can record events to +LTTng traces with just a minor source code modification. + +NOTE: This version of LTTng does not support Log4j 2. + +Here's an example: + +[source,java] +---- +import org.apache.log4j.Logger; +import org.apache.log4j.BasicConfigurator; +import org.lttng.ust.agent.LTTngAgent; + +public class Test +{ + private static final int answer = 42; + + public static void main(String[] argv) throws Exception + { + // create and configure a logger + Logger logger = Logger.getLogger(Test.class); + BasicConfigurator.configure(); + + // call this as soon as possible (before logging) + LTTngAgent lttngAgent = LTTngAgent.getLTTngAgent(); + + // log at will! + logger.info("some info"); + logger.warn("some warning"); + Thread.sleep(500); + logger.debug("debug information; the answer is " + answer); + Thread.sleep(123); + logger.error("error!"); + logger.fatal("fatal error!"); + + // not mandatory, but cleaner + lttngAgent.dispose(); + } +} +---- + +To compile the snippet above, do: + +[role="term"] +---- +javac -cp /usr/lib/lttng/java/liblttng-ust-agent.jar:$LOG4JCP Test.java +---- + +where `$LOG4JCP` is the log4j 1.2 JAR file path. + +You can run the resulting compiled class like this: + +[role="term"] +---- +java -cp /usr/lib/lttng/java/liblttng-ust-agent.jar:$LOG4JCP:. Test +---- + + +[[instrumenting-linux-kernel]] +==== Linux kernel + +The Linux kernel can be instrumented for LTTng tracing, either its core +source code or a kernel module. It has to be noted that Linux is +readily traceable using LTTng since many parts of its source code are +already instrumented: this is the job of the upstream +http://git.lttng.org/?p=lttng-modules.git[LTTng-modules] +package. This section presents how to add LTTng instrumentation where it +does not currently exist and how to instrument custom kernel modules. + +All LTTng instrumentation in the Linux kernel is based on an existing +infrastructure which bears the name of its main macro, `TRACE_EVENT()`. +This macro is used to define tracepoints, +each tracepoint having a name, usually with the ++__subsys_____name__+ format, ++_subsys_+ being the subsystem name and ++_name_+ the specific event name. + +Tracepoints defined with `TRACE_EVENT()` may be inserted anywhere in +the Linux kernel source code, after what callbacks, called _probes_, +may be registered to execute some action when a tracepoint is +executed. This mechanism is directly used by ftrace and perf, +but cannot be used as is by LTTng: an adaptation layer is added to +satisfy LTTng's specific needs. + +With that in mind, this documentation does not cover the `TRACE_EVENT()` +format and how to use it, but it is mandatory to understand it and use +it to instrument Linux for LTTng. A series of +LWN articles explain +`TRACE_EVENT()` in details: +http://lwn.net/Articles/379903/[part 1], +http://lwn.net/Articles/381064/[part 2], and +http://lwn.net/Articles/383362/[part 3]. +Once you master `TRACE_EVENT()` enough for your use case, continue +reading this section so that you can add the LTTng adaptation layer of +instrumentation. + +This section first discusses the general method of instrumenting the +Linux kernel for LTTng. This method is then reused for the specific +case of instrumenting a kernel module. + + +[[instrumenting-linux-kernel-itself]] +===== Instrumenting the Linux kernel for LTTng + +The following subsections explain strictly how to add custom LTTng +instrumentation to the Linux kernel. They do not explain how the +macros actually work and the internal mechanics of the tracer. + +You should have a Linux kernel source code tree to work with. +Throughout this section, all file paths are relative to the root of +this tree unless otherwise stated. + +You need a copy of the LTTng-modules Git repository: + +[role="term"] +---- +git clone git://git.lttng.org/lttng-modules.git +---- + +The steps to add custom LTTng instrumentation to a Linux kernel +involves defining and using the mainline `TRACE_EVENT()` tracepoints +first, then writing and using the LTTng adaptation layer. + + +[[mainline-trace-event]] +===== Defining/using tracepoints with mainline `TRACE_EVENT()` infrastructure + +The first step is to define tracepoints using the mainline Linux +`TRACE_EVENT()` macro and insert tracepoints where you want them. +Your tracepoint definitions reside in a header file in +dir:{include/trace/events}. If you're adding tracepoints to an existing +subsystem, edit its appropriate header file. + +As an example, the following header file (let's call it +dir:{include/trace/events/hello.h}) defines one tracepoint using +`TRACE_EVENT()`: + +[source,c] +---- +/* subsystem name is "hello" */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM hello + +#if !defined(_TRACE_HELLO_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HELLO_H + +#include + +TRACE_EVENT( + /* "hello" is the subsystem name, "world" is the event name */ + hello_world, + + /* tracepoint function prototype */ + TP_PROTO(int foo, const char* bar), + + /* arguments for this tracepoint */ + TP_ARGS(foo, bar), + + /* LTTng doesn't need those */ + TP_STRUCT__entry(), + TP_fast_assign(), + TP_printk("", 0) +); + +#endif + +/* this part must be outside protection */ +#include +---- + +Notice that we don't use any of the last three arguments: they +are left empty here because LTTng doesn't need them. You would only fill +`TP_STRUCT__entry()`, `TP_fast_assign()` and `TP_printk()` if you were +to also use this tracepoint for ftrace/perf. + +Once this is done, you may place calls to `trace_hello_world()` +wherever you want in the Linux source code. As an example, let us place +such a tracepoint in the `usb_probe_device()` static function +(path:{drivers/usb/core/driver.c}): + +[source,c] +---- +/* called from driver core with dev locked */ +static int usb_probe_device(struct device *dev) +{ + struct usb_device_driver *udriver = to_usb_device_driver(dev->driver); + struct usb_device *udev = to_usb_device(dev); + int error = 0; + + trace_hello_world(udev->devnum, udev->product); + + /* ... */ +} +---- + +This tracepoint should fire every time a USB device is plugged in. + +At the top of path:{driver.c}, we need to include our actual tracepoint +definition and, in this case (one place per subsystem), define +`CREATE_TRACE_POINTS`, which creates our tracepoint: + +[source,c] +---- +/* ... */ + +#include "usb.h" + +#define CREATE_TRACE_POINTS +#include + +/* ... */ +---- + +Build your custom Linux kernel. In order to use LTTng, make sure the +following kernel configuration options are enabled: + +* `CONFIG_MODULES` (loadable module support) +* `CONFIG_KALLSYMS` (load all symbols for debugging/kksymoops) +* `CONFIG_HIGH_RES_TIMERS` (high resolution timer support) +* `CONFIG_TRACEPOINTS` (kernel tracepoint instrumentation) + +Boot the custom kernel. The directory +dir:{/sys/kernel/debug/tracing/events/hello} should exist if everything +went right, with a dir:{hello_world} subdirectory. + + +[[lttng-adaptation-layer]] +===== Adding the LTTng adaptation layer + +The steps to write the LTTng adaptation layer are, in your +LTTng-modules copy's source code tree: + +. In dir:{instrumentation/events/lttng-module}, + add a header +__subsys__.h+ for your custom + subsystem +__subsys__+ and write your + tracepoint definitions using LTTng-modules macros in it. + Those macros look like the mainline kernel equivalents, + but they present subtle, yet important differences. +. In dir:{probes}, create the C source file of the LTTng probe kernel + module for your subsystem. It should be named + +lttng-probe-__subsys__.c+. +. Edit path:{probes/Makefile} so that the LTTng-modules project + builds your custom LTTng probe kernel module. +. Build and install LTTng kernel modules. + +Following our `hello_world` event example, here's the content of +path:{instrumentation/events/lttng-module/hello.h}: + +[source,c] +---- +#undef TRACE_SYSTEM +#define TRACE_SYSTEM hello + +#if !defined(_TRACE_HELLO_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HELLO_H + +#include "../../../probes/lttng-tracepoint-event.h" +#include + +LTTNG_TRACEPOINT_EVENT( + /* format identical to mainline version for those */ + hello_world, + TP_PROTO(int foo, const char* bar), + TP_ARGS(foo, bar), + + /* possible differences */ + TP_STRUCT__entry( + __field(int, my_int) + __field(char, char0) + __field(char, char1) + __string(product, bar) + ), + + /* notice the use of tp_assign()/tp_strcpy() and no semicolons */ + TP_fast_assign( + tp_assign(my_int, foo) + tp_assign(char0, bar[0]) + tp_assign(char1, bar[1]) + tp_strcpy(product, bar) + ), + + /* This one is actually not used by LTTng either, but must be + * present for the moment. + */ + TP_printk("", 0) + +/* no semicolon after this either */ +) + +#endif + +/* other difference: do NOT include */ +#include "../../../probes/define_trace.h" +---- + +Some possible entries for `TP_STRUCT__entry()` and `TP_fast_assign()`, +in the case of LTTng-modules, are shown in the +<> section. + +The best way to learn how to use the above macros is to inspect +existing LTTng tracepoint definitions in +dir:{instrumentation/events/lttng-module} header files. Compare +them with the Linux kernel mainline versions in +dir:{include/trace/events}. + +The next step is writing the LTTng probe kernel module C source file. +This one is named +lttng-probe-__subsys__.c+ +in dir:{probes}. You may always use the following template: + +[source,c] +---- +#include +#include "../lttng-tracer.h" + +/* Build time verification of mismatch between mainline TRACE_EVENT() + * arguments and LTTng adaptation layer LTTNG_TRACEPOINT_EVENT() arguments. + */ +#include + +/* create LTTng tracepoint probes */ +#define LTTNG_PACKAGE_BUILD +#define CREATE_TRACE_POINTS +#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module + +#include "../instrumentation/events/lttng-module/hello.h" + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Your name "); +MODULE_DESCRIPTION("LTTng hello probes"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION); +---- + +Just replace `hello` with your subsystem name. In this example, +``, which is the original mainline tracepoint +definition header, is included for verification purposes: the +LTTng-modules build system is able to emit an error at build time when +the arguments of the mainline `TRACE_EVENT()` definitions do not match +the ones of the LTTng-modules adaptation layer +(`LTTNG_TRACEPOINT_EVENT()`). + +Edit path:{probes/Makefile} and add your new kernel module object +next to existing ones: + +[source,make] +---- +# ... + +obj-m += lttng-probe-module.o +obj-m += lttng-probe-power.o + +obj-m += lttng-probe-hello.o + +# ... +---- + +Time to build! Point to your custom Linux kernel source tree using +the `KERNELDIR` variable: + +[role="term"] +---- +make KERNELDIR=/path/to/custom/linux +---- + +Finally, install modules: + +[role="term"] +---- +sudo make modules_install +---- + + +[[instrumenting-linux-kernel-tracing]] +===== Tracing + +The <> section explains +how to use the `lttng` tool to create and control tracing sessions. +Although the `lttng` tool loads the appropriate _known_ LTTng kernel +modules when needed (by launching `root`'s session daemon), it won't +load your custom `lttng-probe-hello` module by default. You need to +manually start an LTTng session daemon as `root` and use the +`--extra-kmod-probes` option to append your custom probe module to the +default list: + +[role="term"] +---- +sudo pkill -u root lttng-sessiond +sudo lttng-sessiond --extra-kmod-probes=hello +---- + +The first command makes sure any existing instance is killed. If +you're not interested in using the default probes, or if you only +want to use a few of them, you could use `--kmod-probes` instead, +which specifies an absolute list: + +[role="term"] +---- +sudo lttng-sessiond --kmod-probes=hello,ext4,net,block,signal,sched +---- + +Confirm the custom probe module is loaded: + +[role="term"] +---- +lsmod | grep lttng_probe_hello +---- + +The `hello_world` event should appear in the list when doing + +[role="term"] +---- +lttng list --kernel | grep hello +---- + +You may now create an LTTng tracing session, enable the `hello_world` +kernel event (and others if you wish) and start tracing: + +[role="term"] +---- +sudo lttng create my-session +sudo lttng enable-event --kernel hello_world +sudo lttng start +---- + +Plug a few USB devices, then stop tracing and inspect the trace (if +http://diamon.org/babeltrace[Babeltrace] +is installed): + +[role="term"] +---- +sudo lttng stop +sudo lttng view +---- + +Here's a sample output: + +---- +[15:30:34.835895035] (+?.?????????) hostname hello_world: { cpu_id = 1 }, { my_int = 8, char0 = 68, char1 = 97, product = "DataTraveler 2.0" } +[15:30:42.262781421] (+7.426886386) hostname hello_world: { cpu_id = 1 }, { my_int = 9, char0 = 80, char1 = 97, product = "Patriot Memory" } +[15:30:48.175621778] (+5.912840357) hostname hello_world: { cpu_id = 1 }, { my_int = 10, char0 = 68, char1 = 97, product = "DataTraveler 2.0" } +---- + +Two USB flash drives were used for this test. + +You may change your LTTng custom probe, rebuild it and reload it at +any time when not tracing. Make sure you remove the old module +(either by killing the root LTTng session daemon which loaded the +module in the first place, or by using `modprobe --remove` directly) +before loading the updated one. + + +[[instrumenting-out-of-tree-linux-kernel]] +===== Advanced: Instrumenting an out-of-tree Linux kernel module for LTTng + +Instrumenting a custom Linux kernel module for LTTng follows the exact +same steps as +<>, +the only difference being that your mainline tracepoint definition +header doesn't reside in the mainline source tree, but in your +kernel module source tree. + +The only reference to this mainline header is in the LTTng custom +probe's source code (path:{probes/lttng-probe-hello.c} in our example), +for build time verification: + +[source,c] +---- +/* ... */ + +/* Build time verification of mismatch between mainline TRACE_EVENT() + * arguments and LTTng adaptation layer LTTNG_TRACEPOINT_EVENT() arguments. + */ +#include + +/* ... */ +---- + +The preferred, flexible way to include your module's mainline +tracepoint definition header is to put it in a specific directory +relative to your module's root (`tracepoints`, for example) and include it +relative to your module's root directory in the LTTng custom probe's +source: + +[source,c] +---- +#include +---- + +You may then build LTTng-modules by adding your module's root +directory as an include path to the extra C flags: + +[role="term"] +---- +make ccflags-y=-I/path/to/kernel/module KERNELDIR=/path/to/custom/linux +---- + +Using `ccflags-y` allows you to move your kernel module to another +directory and rebuild the LTTng-modules project with no change to +source files. + + +[role="since-2.5"] +[[proc-lttng-logger-abi]] +==== LTTng logger ABI + +The `lttng-tracer` Linux kernel module, installed by the LTTng-modules +package, creates a special LTTng logger ABI file path:{/proc/lttng-logger} +when loaded. Writing text data to this file generates an LTTng kernel +domain event named `lttng_logger`. + +Unlike other kernel domain events, `lttng_logger` may be enabled by +any user, not only root users or members of the tracing group. + +To use the LTTng logger ABI, simply write a string to +path:{/proc/lttng-logger}: + +[role="term"] +---- +echo -n 'Hello, World!' > /proc/lttng-logger +---- + +The `msg` field of the `lttng_logger` event contains the recorded +message. + +NOTE: Messages are split in chunks of 1024{nbsp}bytes. + +The LTTng logger ABI is a quick and easy way to trace some events from +user space through the kernel tracer. However, it is much more basic +than LTTng-UST: it's slower (involves system call round-trip to the +kernel and only supports logging strings). The LTTng logger ABI is +particularly useful for recording logs as LTTng traces from shell +scripts, potentially combining them with other Linux kernel/user space +events. + + +[[instrumenting-32-bit-app-on-64-bit-system]] +==== Advanced: Instrumenting a 32-bit application on a 64-bit system + +[[advanced-instrumenting-techniques]]In order to trace a 32-bit +application running on a 64-bit system, +LTTng must use a dedicated 32-bit +<>. This section discusses how to +build that daemon (which is _not_ part of the default 64-bit LTTng +build) and the LTTng 32-bit tracing libraries, and how to instrument +a 32-bit application in that context. + +Make sure you install all 32-bit versions of LTTng dependencies. +Their names can be found in the `README.md` files of each LTTng package +source. How to find and install them depends on your target's +Linux distribution. `gcc-multilib` is a common package name for the +multilib version of GCC, which you also need. + +The following packages will be built for 32-bit support on a 64-bit +system: http://urcu.so/[Userspace RCU], +LTTng-UST and LTTng-tools. + + +[[building-32-bit-userspace-rcu]] +===== Building 32-bit Userspace RCU + +Follow this: + +[role="term"] +---- +git clone git://git.urcu.so/urcu.git +cd urcu +./bootstrap +./configure --libdir=/usr/lib32 CFLAGS=-m32 +make +sudo make install +sudo ldconfig +---- + +The `-m32` C compiler flag creates 32-bit object files and `--libdir` +indicates where to install the resulting libraries. + + +[[building-32-bit-lttng-ust]] +===== Building 32-bit LTTng-UST + +Follow this: + +[role="term"] +---- +git clone http://git.lttng.org/lttng-ust.git +cd lttng-ust +./bootstrap +./configure --prefix=/usr \ + --libdir=/usr/lib32 \ + CFLAGS=-m32 CXXFLAGS=-m32 \ + LDFLAGS=-L/usr/lib32 +make +sudo make install +sudo ldconfig +---- + +`-L/usr/lib32` is required for the build to find the 32-bit versions +of Userspace RCU and other dependencies. + +[NOTE] +==== +Depending on your Linux distribution, +32-bit libraries could be installed at a different location than +dir:{/usr/lib32}. For example, Debian is known to install +some 32-bit libraries in dir:{/usr/lib/i386-linux-gnu}. + +In this case, make sure to set `LDFLAGS` to all the +relevant 32-bit library paths, for example, +`LDFLAGS="-L/usr/lib32 -L/usr/lib/i386-linux-gnu"`. +==== + +NOTE: You may add options to path:{./configure} if you need them, e.g., for +Java and SystemTap support. Look at `./configure --help` for more +information. + + +[[building-32-bit-lttng-tools]] +===== Building 32-bit LTTng-tools + +Since the host is a 64-bit system, most 32-bit binaries and libraries of +LTTng-tools are not needed; the host uses their 64-bit counterparts. +The required step here is building and installing a 32-bit consumer +daemon. + +Follow this: + +[role="term"] +---- +git clone http://git.lttng.org/lttng-tools.git +cd lttng-ust +./bootstrap +./configure --prefix=/usr \ + --libdir=/usr/lib32 CFLAGS=-m32 CXXFLAGS=-m32 \ + LDFLAGS=-L/usr/lib32 +make +cd src/bin/lttng-consumerd +sudo make install +sudo ldconfig +---- + +The above commands build all the LTTng-tools project as 32-bit +applications, but only installs the 32-bit consumer daemon. + + +[[building-64-bit-lttng-tools]] +===== Building 64-bit LTTng-tools + +Finally, you need to build a 64-bit version of LTTng-tools which is +aware of the 32-bit consumer daemon previously built and installed: + +[role="term"] +---- +make clean +./bootstrap +./configure --prefix=/usr \ + --with-consumerd32-libdir=/usr/lib32 \ + --with-consumerd32-bin=/usr/lib32/lttng/libexec/lttng-consumerd +make +sudo make install +sudo ldconfig +---- + +Henceforth, the 64-bit session daemon automatically finds the +32-bit consumer daemon if required. + + +[[building-instrumented-32-bit-c-application]] +===== Building an instrumented 32-bit C application + +Let us reuse the _Hello world_ example of +<> +(<> chapter). + +The instrumentation process is unaltered. + +First, a typical 64-bit build (assuming you're running a 64-bit system): + +[role="term"] +---- +gcc -o hello64 -I. hello.c hello-tp.c -ldl -llttng-ust +---- + +Now, a 32-bit build: + +[role="term"] +---- +gcc -o hello32 -I. -m32 hello.c hello-tp.c -L/usr/lib32 \ + -ldl -llttng-ust -Wl,-rpath,/usr/lib32 +---- + +The `-rpath` option, passed to the linker, makes the dynamic loader +check for libraries in dir:{/usr/lib32} before looking in its default paths, +where it should find the 32-bit version of `liblttng-ust`. + + +[[running-32-bit-and-64-bit-c-applications]] +===== Running 32-bit and 64-bit versions of an instrumented C application + +Now, both 32-bit and 64-bit versions of the _Hello world_ example above +can be traced in the same tracing session. Use the `lttng` tool as usual +to create a tracing session and start tracing: + +[role="term"] +---- +lttng create session-3264 +lttng enable-event -u -a +./hello32 +./hello64 +lttng stop +---- + +Use `lttng view` to verify both processes were +successfully traced. + + +[[controlling-tracing]] +=== Controlling tracing + +Once you're in possession of a software that is properly +<> for LTTng tracing, be it thanks to +the built-in LTTng probes for the Linux kernel, a custom user +application or a custom Linux kernel, all that is left is actually +tracing it. As a user, you control LTTng tracing using a single command +line interface: the `lttng` tool. This tool uses `liblttng-ctl` behind +the scene to connect to and communicate with session daemons. LTTng +session daemons may either be started manually (`lttng-sessiond`) or +automatically by the `lttng` command when needed. Trace data may +be forwarded to the network and used elsewhere using an LTTng relay +daemon (`lttng-relayd`). + +The manpages of `lttng`, `lttng-sessiond` and `lttng-relayd` are pretty +complete, thus this section is not an online copy of the latter (we +leave this contents for the +<> section). +This section is rather a tour of LTTng +features through practical examples and tips. + +If not already done, make sure you understand the core concepts +and how LTTng components connect together by reading the +<> chapter; this section +assumes you are familiar with them. + + +[[creating-destroying-tracing-sessions]] +==== Creating and destroying tracing sessions + +Whatever you want to do with `lttng`, it has to happen inside a +**tracing session**, created beforehand. A session, in general, is a +per-user container of state. A tracing session is no different; it +keeps a specific state of stuff like: + +* session name +* enabled/disabled channels with associated parameters +* enabled/disabled events with associated log levels and filters +* context information added to channels +* tracing activity (started or stopped) + +and more. + +A single user may have many active tracing sessions. LTTng session +daemons are the ultimate owners and managers of tracing sessions. For +user space tracing, each user has its own session daemon. Since Linux +kernel tracing requires root privileges, only `root`'s session daemon +may enable and trace kernel events. However, `lttng` has a `--group` +option (which is passed to `lttng-sessiond` when starting it) to +specify the name of a _tracing group_ which selected users may be part +of to be allowed to communicate with `root`'s session daemon. By +default, the tracing group name is `tracing`. + +To create a tracing session, do: + +[role="term"] +---- +lttng create my-session +---- + +This creates a new tracing session named `my-session` and make it +the current one. If you don't specify a name (running only +`lttng create`), your tracing session is named `auto` followed by the +current date and time. Traces +are written in +\~/lttng-traces/__session__-+ followed +by the tracing session's creation date/time by default, where ++__session__+ is the tracing session name. To save them +at a different location, use the `--output` option: + +[role="term"] +---- +lttng create --output /tmp/some-directory my-session +---- + +You may create as many tracing sessions as you wish: + +[role="term"] +---- +lttng create other-session +lttng create yet-another-session +---- + +You may view all existing tracing sessions using the `list` command: + +[role="term"] +---- +lttng list +---- + +The state of a _current tracing session_ is kept in path:{~/.lttngrc}. Each +invocation of `lttng` reads this file to set its current tracing +session name so that you don't have to specify a session name for each +command. You could edit this file manually, but the preferred way to +set the current tracing session is to use the `set-session` command: + +[role="term"] +---- +lttng set-session other-session +---- + +Most `lttng` commands accept a `--session` option to specify the name +of the target tracing session. + +Any existing tracing session may be destroyed using the `destroy` +command: + +[role="term"] +---- +lttng destroy my-session +---- + +Providing no argument to `lttng destroy` destroys the current +tracing session. Destroying a tracing session stops any tracing +running within the latter. Destroying a tracing session frees resources +acquired by the session daemon and tracer side, making sure to flush +all trace data. + +You can't do much with LTTng using only the `create`, `set-session` +and `destroy` commands of `lttng`, but it is essential to know them in +order to control LTTng tracing, which always happen within the scope of +a tracing session. + + +[[enabling-disabling-events]] +==== Enabling and disabling events + +Inside a tracing session, individual events may be enabled or disabled +so that tracing them may or may not generate trace data. + +We sometimes use the term _event_ metonymically throughout this text to +refer to a specific condition, or _rule_, that could lead, when +satisfied, to an actual occurring event (a point at a specific position +in source code/binary program, logical processor and time capturing +some payload) being recorded as trace data. This specific condition is +composed of: + +. A **domain** (kernel, user space, `java.util.logging`, or log4j) + (required). +. One or many **instrumentation points** in source code or binary + program (tracepoint name, address, symbol name, function name, + logger name, amongst other types of probes) to be executed (required). +. A **log level** (each instrumentation point declares its own log + level) or log level range to match (optional; only valid for user + space domain). +. A **custom user expression**, or **filter**, that must evaluate to + _true_ when a tracepoint is executed (optional; only valid for user + space domain). + +All conditions are specified using arguments passed to the +`enable-event` command of the `lttng` tool. + +Condition 1 is specified using either `--kernel`/`-k` (kernel), +`--userspace`/`-u` (user space), `--jul`/`-j` +(JUL), or `--log4j`/`-l` (log4j). +Exactly one of those four arguments must be specified. + +Condition 2 is specified using one of: + +`--tracepoint`:: + Tracepoint. + +`--probe`:: + Dynamic probe (address, symbol name or combination + of both in binary program; only valid for kernel domain). + +`--function`:: + function entry/exit (address, symbol name or + combination of both in binary program; only valid for kernel domain). + +`--syscall`:: + System call entry/exit (only valid for kernel domain). + +When none of the above is specified, `enable-event` defaults to +using `--tracepoint`. + +Condition 3 is specified using one of: + +`--loglevel`:: + Log level range from the specified level to the most severe + level. + +`--loglevel-only`:: + Specific log level. + +See `lttng enable-event --help` for the complete list of log level +names. + +Condition 4 is specified using the `--filter` option. This filter is +a C-like expression, potentially reading real-time values of event +fields, that has to evaluate to _true_ for the condition to be satisfied. +Event fields are read using plain identifiers while context fields +must be prefixed with `$ctx.`. See `lttng enable-event --help` for +all usage details. + +The aforementioned arguments are combined to create and enable events. +Each unique combination of arguments leads to a different +_enabled event_. The log level and filter arguments are optional, their +default values being respectively all log levels and a filter which +always returns _true_. + +Here are a few examples (you must +<> +first): + +[role="term"] +---- +lttng enable-event -u --tracepoint my_app:hello_world +lttng enable-event -u --tracepoint my_app:hello_you --loglevel TRACE_WARNING +lttng enable-event -u --tracepoint 'my_other_app:*' +lttng enable-event -u --tracepoint my_app:foo_bar \ + --filter 'some_field <= 23 && !other_field' +lttng enable-event -k --tracepoint sched_switch +lttng enable-event -k --tracepoint gpio_value +lttng enable-event -k --function usb_probe_device usb_probe_device +lttng enable-event -k --syscall --all +---- + +The wildcard symbol, `*`, matches _anything_ and may only be used at +the end of the string when specifying a _tracepoint_. Make sure to +use it between single quotes in your favorite shell to avoid +undesired shell expansion. + +System call events can be enabled individually, too: + +[role="term"] +---- +lttng enable-event -k --syscall open +lttng enable-event -k --syscall read +lttng enable-event -k --syscall fork,chdir,pipe +---- + +The complete list of available system call events can be +obtained using + +[role="term"] +---- +lttng list --kernel --syscall +---- + +You can see a list of events (enabled or disabled) using + +[role="term"] +---- +lttng list some-session +---- + +where `some-session` is the name of the desired tracing session. + +What you're actually doing when enabling events with specific conditions +is creating a **whitelist** of traceable events for a given channel. +Thus, the following case presents redundancy: + +[role="term"] +---- +lttng enable-event -u --tracepoint my_app:hello_you +lttng enable-event -u --tracepoint my_app:hello_you --loglevel TRACE_DEBUG +---- + +The second command, matching a log level range, is useless since the first +command enables all tracepoints matching the same name, +`my_app:hello_you`. + +Disabling an event is simpler: you only need to provide the event +name to the `disable-event` command: + +[role="term"] +---- +lttng disable-event --userspace my_app:hello_you +---- + +This name has to match a name previously given to `enable-event` (it +has to be listed in the output of `lttng list some-session`). +The `*` wildcard is supported, as long as you also used it in a +previous `enable-event` invocation. + +Disabling an event does not add it to some blacklist: it simply removes +it from its channel's whitelist. This is why you cannot disable an event +which wasn't previously enabled. + +A disabled event doesn't generate any trace data, even if all its +specified conditions are met. + +Events may be enabled and disabled at will, either when LTTng tracers +are active or not. Events may be enabled before a user space application +is even started. + + +[[basic-tracing-session-control]] +==== Basic tracing session control + +Once you have +<> +and <>, +you may activate the LTTng tracers for the current tracing session at +any time: + +[role="term"] +---- +lttng start +---- + +Subsequently, you may stop the tracers: + +[role="term"] +---- +lttng stop +---- + +LTTng is very flexible: user space applications may be launched before +or after the tracers are started. Events are only recorded if they +are properly enabled and if they occur while tracers are active. + +A tracing session name may be passed to both the `start` and `stop` +commands to start/stop tracing a session other than the current one. + + +[[enabling-disabling-channels]] +==== Enabling and disabling channels + +<> in the +<> chapter, enabled +events are contained in a specific channel, itself contained in a +specific tracing session. A channel is a group of events with +tunable parameters (event loss mode, sub-buffer size, number of +sub-buffers, trace file sizes and count, to name a few). A given channel +may only be responsible for enabled events belonging to one domain: +either kernel or user space. + +If you only used the `create`, `enable-event` and `start`/`stop` +commands of the `lttng` tool so far, one or two channels were +automatically created for you (one for the kernel domain and/or one +for the user space domain). The default channels are both named +`channel0`; channels from different domains may have the same name. + +The current channels of a given tracing session can be viewed with + +[role="term"] +---- +lttng list some-session +---- + +where `some-session` is the name of the desired tracing session. + +To create and enable a channel, use the `enable-channel` command: + +[role="term"] +---- +lttng enable-channel --kernel my-channel +---- + +This creates a kernel domain channel named `my-channel` with +default parameters in the current tracing session. + +[NOTE] +==== +Because of a current limitation, all +channels must be _created_ prior to beginning tracing in a +given tracing session, that is before the first time you do +`lttng start`. + +Since a channel is automatically created by +`enable-event` only for the specified domain, you cannot, +for example, enable a kernel domain event, start tracing and then +enable a user space domain event because no user space channel +exists yet and it's too late to create one. + +For this reason, make sure to configure your channels properly +before starting the tracers for the first time! +==== + +Here's another example: + +[role="term"] +---- +lttng enable-channel --userspace --session other-session --overwrite \ + --tracefile-size 1048576 1mib-channel +---- + +This creates a user space domain channel named `1mib-channel` in +the tracing session named `other-session` that loses new events by +overwriting previously recorded events (instead of the default mode of +discarding newer ones) and saves trace files with a maximum size of +1{nbsp}MiB each. + +Note that channels may also be created using the `--channel` option of +the `enable-event` command when the provided channel name doesn't exist +for the specified domain: + +[role="term"] +---- +lttng enable-event --kernel --channel some-channel sched_switch +---- + +If no kernel domain channel named `some-channel` existed before calling +the above command, it would be created with default parameters. + +You may enable the same event in two different channels: + +[role="term"] +---- +lttng enable-event --userspace --channel my-channel app:tp +lttng enable-event --userspace --channel other-channel app:tp +---- + +If both channels are enabled, the occurring `app:tp` event +generates two recorded events, one for each channel. + +Disabling a channel is done with the `disable-event` command: + +[role="term"] +---- +lttng disable-event --kernel some-channel +---- + +The state of a channel precedes the individual states of events within +it: events belonging to a disabled channel, even if they are +enabled, won't be recorded. + + + +[[fine-tuning-channels]] +===== Fine-tuning channels + +There are various parameters that may be fine-tuned with the +`enable-channel` command. The latter are well documented in +man:lttng(1) and in the <> section of the +<> chapter. For basic +tracing needs, their default values should be just fine, but here are a +few examples to break the ice. + +As the frequency of recorded events increases--either because the +event throughput is actually higher or because you enabled more events +than usual—__event loss__ might be experienced. Since LTTng never +waits, by design, for sub-buffer space availability (non-blocking +tracer), when a sub-buffer is full and no empty sub-buffers are left, +there are two possible outcomes: either the new events that do not fit +are rejected, or they start replacing the oldest recorded events. +The choice of which algorithm to use is a per-channel parameter, the +default being discarding the newest events until there is some space +left. If your situation always needs the latest events at the expense +of writing over the oldest ones, create a channel with the `--overwrite` +option: + +[role="term"] +---- +lttng enable-channel --kernel --overwrite my-channel +---- + +When an event is lost, it means no space was available in any +sub-buffer to accommodate it. Thus, if you want to cope with sporadic +high event throughput situations and avoid losing events, you need to +allocate more room for storing them in memory. This can be done by +either increasing the size of sub-buffers or by adding sub-buffers. +The following example creates a user space domain channel with +16{nbsp}sub-buffers of 512{nbsp}kiB each: + +[role="term"] +---- +lttng enable-channel --userspace --num-subbuf 16 --subbuf-size 512k big-channel +---- + +Both values need to be powers of two, otherwise they are rounded up +to the next one. + +Two other interesting available parameters of `enable-channel` are +`--tracefile-size` and `--tracefile-count`, which respectively limit +the size of each trace file and the their count for a given channel. +When the number of written trace files reaches its limit for a given +channel-CPU pair, the next trace file overwrites the very first +one. The following example creates a kernel domain channel with a +maximum of three trace files of 1{nbsp}MiB each: + +[role="term"] +---- +lttng enable-channel --kernel --tracefile-size 1M --tracefile-count 3 my-channel +---- + +An efficient way to make sure lots of events are generated is enabling +all kernel events in this channel and starting the tracer: + +[role="term"] +---- +lttng enable-event --kernel --all --channel my-channel +lttng start +---- + +After a few seconds, look at trace files in your tracing session +output directory. For two CPUs, it should look like: + +---- +my-channel_0_0 my-channel_1_0 +my-channel_0_1 my-channel_1_1 +my-channel_0_2 my-channel_1_2 +---- + +Amongst the files above, you might see one in each group with a size +lower than 1{nbsp}MiB: they are the files currently being written. + +Since all those small files are valid LTTng trace files, LTTng trace +viewers may read them. It is the viewer's responsibility to properly +merge the streams so as to present an ordered list to the user. +http://diamon.org/babeltrace[Babeltrace] +merges LTTng trace files correctly and is fast at doing it. + + +[[adding-context]] +==== Adding some context to channels + +If you read all the sections of +<> so far, you should be +able to create tracing sessions, create and enable channels and events +within them and start/stop the LTTng tracers. Event fields recorded in +trace files provide important information about occurring events, but +sometimes external context may help you solve a problem faster. This +section discusses how to add context information to events of a +specific channel using the `lttng` tool. + +There are various available context values which can accompany events +recorded by LTTng, for example: + +* **process information**: +** identifier (PID) +** name +** priority +** scheduling priority (niceness) +** thread identifier (TID) +* the **hostname** of the system on which the event occurred +* plenty of **performance counters** using perf, for example: +** CPU cycles, stalled cycles, idle cycles, and the other cycle types +** cache misses +** branch instructions, misses, loads +** CPU faults + +The full list is available in the output of `lttng add-context --help`. +Some of them are reserved for a specific domain (kernel or +user space) while others are available for both. + +To add context information to one or all channels of a given tracing +session, use the `add-context` command: + +[role="term"] +---- +lttng add-context --userspace --type vpid --type perf:thread:cpu-cycles +---- + +The above example adds the virtual process identifier and per-thread +CPU cycles count values to all recorded user space domain events of the +current tracing session. Use the `--channel` option to select a specific +channel: + +[role="term"] +---- +lttng add-context --kernel --channel my-channel --type tid +---- + +adds the thread identifier value to all recorded kernel domain events +in the channel `my-channel` of the current tracing session. + +Beware that context information cannot be removed from channels once +it's added for a given tracing session. + + +[role="since-2.5"] +[[saving-loading-tracing-session]] +==== Saving and loading tracing session configurations + +Configuring a tracing session may be long: creating and enabling +channels with specific parameters, enabling kernel and user space +domain events with specific log levels and filters, and adding context +to some channels are just a few of the many possible operations using +the `lttng` command line tool. If you're going to use LTTng to solve real +world problems, chances are you're going to have to record events using +the same tracing session setup over and over, modifying a few variables +each time in your instrumented program or environment. To avoid +constant tracing session reconfiguration, the `lttng` tool is able to +save and load tracing session configurations to/from XML files. + +To save a given tracing session configuration, do: + +[role="term"] +---- +lttng save my-session +---- + +where `my-session` is the name of the tracing session to save. Tracing +session configurations are saved to dir:{~/.lttng/sessions} by default; +use the `--output-path` option to change this destination directory. + +All configuration parameters are saved: + +* tracing session name +* trace data output path +* channels with their state and all their parameters +* context information added to channels +* events with their state, log level and filter +* tracing activity (started or stopped) + +To load a tracing session, simply do: + +[role="term"] +---- +lttng load my-session +---- + +or, if you used a custom path: + +[role="term"] +---- +lttng load --input-path /path/to/my-session.lttng +---- + +Your saved tracing session is restored as if you just configured +it manually. + + +[[sending-trace-data-over-the-network]] +==== Sending trace data over the network + +The possibility of sending trace data over the network comes as a +built-in feature of LTTng-tools. For this to be possible, an LTTng +_relay daemon_ must be executed and listening on the machine where +trace data is to be received, and the user must create a tracing +session using appropriate options to forward trace data to the remote +relay daemon. + +The relay daemon listens on two different TCP ports: one for control +information and the other for actual trace data. + +Starting the relay daemon on the remote machine is easy: + +[role="term"] +---- +lttng-relayd +---- + +This makes it listen to its default ports: 5342 for control and +5343 for trace data. The `--control-port` and `--data-port` options may +be used to specify different ports. + +Traces written by `lttng-relayd` are written to ++\~/lttng-traces/__hostname__/__session__+ by +default, where +__hostname__+ is the host name of the +traced (monitored) system and +__session__+ is the +tracing session name. Use the `--output` option to write trace data +outside dir:{~/lttng-traces}. + +On the sending side, a tracing session must be created using the +`lttng` tool with the `--set-url` option to connect to the distant +relay daemon: + +[role="term"] +---- +lttng create my-session --set-url net://distant-host +---- + +The URL format is described in the output of `lttng create --help`. +The above example uses the default ports; the `--ctrl-url` and +`--data-url` options may be used to set the control and data URLs +individually. + +Once this basic setup is completed and the connection is established, +you may use the `lttng` tool on the target machine as usual; everything +you do is transparently forwarded to the remote machine if needed. +For example, a parameter changing the maximum size of trace files +only has an effect on the distant relay daemon actually writing +the trace. + + +[role="since-2.4"] +[[lttng-live]] +==== Viewing events as they arrive + +We have seen how trace files may be produced by LTTng out of generated +application and Linux kernel events. We have seen that those trace files +may be either recorded locally by consumer daemons or remotely using +a relay daemon. And we have seen that the maximum size and count of +trace files is configurable for each channel. With all those features, +it's still not possible to read a trace file as it is being written +because it could be incomplete and appear corrupted to the viewer. +There is a way to view events as they arrive, however: using +_LTTng live_. + +LTTng live is implemented, in LTTng, solely on the relay daemon side. +As trace data is sent over the network to a relay daemon by a (possibly +remote) consumer daemon, a _tee_ is created: trace data is recorded to +trace files _as well as_ being transmitted to a connected live viewer: + +[role="img-90"] +.The relay daemon creates a _tee_, forwarding the trace data to both trace files and a live viewer. +image::lttng-live.png[] + +In order to use this feature, a tracing session must created in live +mode on the target system: + +[role="term"] +---- +lttng create --live +---- + +An optional parameter may be passed to `--live` to set the period +(in microseconds) between flushes to the network +(1{nbsp}second is the default). With: + +[role="term"] +---- +lttng create --live 100000 +---- + +the daemons flush their data every 100{nbsp}ms. + +If no network output is specified to the `create` command, a local +relay daemon is spawned. In this very common case, viewing a live +trace is easy: enable events and start tracing as usual, then use +`lttng view` to start the default live viewer: + +[role="term"] +---- +lttng view +---- + +The correct arguments are passed to the live viewer so that it +may connect to the local relay daemon and start reading live events. + +You may also wish to use a live viewer not running on the target +system. In this case, you should specify a network output when using +the `create` command (`--set-url` or `--ctrl-url`/`--data-url` options). +A distant LTTng relay daemon should also be started to receive control +and trace data. By default, `lttng-relayd` listens on 127.0.0.1:5344 +for an LTTng live connection. Otherwise, the desired URL may be +specified using its `--live-port` option. + +The +http://diamon.org/babeltrace[`babeltrace`] +viewer supports LTTng live as one of its input formats. `babeltrace` is +the default viewer when using `lttng view`. To use it manually, first +list active tracing sessions by doing the following (assuming the relay +daemon to connect to runs on the same host): + +[role="term"] +---- +babeltrace --input-format lttng-live net://localhost +---- + +Then, choose a tracing session and start viewing events as they arrive +using LTTng live: + +[role="term"] +---- +babeltrace --input-format lttng-live net://localhost/host/hostname/my-session +---- + + +[role="since-2.3"] +[[taking-a-snapshot]] +==== Taking a snapshot + +The normal behavior of LTTng is to record trace data as trace files. +This is ideal for keeping a long history of events that occurred on +the target system and applications, but may be too much data in some +situations. For example, you may wish to trace your application +continuously until some critical situation happens, in which case you +would only need the latest few recorded events to perform the desired +analysis, not multi-gigabyte trace files. + +LTTng has an interesting feature called _snapshots_. When creating +a tracing session in snapshot mode, no trace files are written; the +tracers' sub-buffers are constantly overwriting the oldest recorded +events with the newest. At any time, either when the tracers are started +or stopped, you may take a snapshot of those sub-buffers. + +There is no difference between the format of a normal trace file and the +format of a snapshot: viewers of LTTng traces also support LTTng +snapshots. By default, snapshots are written to disk, but they may also +be sent over the network. + +To create a tracing session in snapshot mode, do: + +[role="term"] +---- +lttng create --snapshot my-snapshot-session +---- + +Next, enable channels, events and add context to channels as usual. +Once a tracing session is created in snapshot mode, channels are +forced to use the +<> mode +(`--overwrite` option of the `enable-channel` command; also called +_flight recorder mode_) and have an `mmap()` channel type +(`--output mmap`). + +Start tracing. When you're ready to take a snapshot, do: + +[role="term"] +---- +lttng snapshot record --name my-snapshot +---- + +This records a snapshot named `my-snapshot` of all channels of +all domains of the current tracing session. By default, snapshots files +are recorded in the path returned by `lttng snapshot list-output`. You +may change this path or decide to send snapshots over the network +using either: + +. an output path/URL specified when creating the tracing session + (`lttng create`) +. an added snapshot output path/URL using + `lttng snapshot add-output` +. an output path/URL provided directly to the + `lttng snapshot record` command + +Method 3 overrides method 2 which overrides method 1. When specifying +a URL, a relay daemon must be listening on some machine (see +<>). + +If you need to make absolutely sure that the output file won't be +larger than a certain limit, you can set a maximum snapshot size when +taking it with the `--max-size` option: + +[role="term"] +---- +lttng snapshot record --name my-snapshot --max-size 2M +---- + +Older recorded events are discarded in order to respect this +maximum size. + + +[role="since-2.6"] +[[mi]] +==== Machine interface + +The `lttng` tool aims at providing a command output as human-readable as +possible. While this output is easy to parse by a human being, machines +have a hard time. + +This is why the `lttng` tool provides the general `--mi` option, which +must specify a machine interface output format. As of the latest +LTTng stable release, only the `xml` format is supported. A schema +definition (XSD) is made +https://github.com/lttng/lttng-tools/blob/master/src/common/mi_lttng.xsd[available] +to ease the integration with external tools as much as possible. + +The `--mi` option can be used in conjunction with all `lttng` commands. +Here are some examples: + +[role="term"] +---- +lttng --mi xml create some-session +lttng --mi xml list some-session +lttng --mi xml list --kernel +lttng --mi xml enable-event --kernel --syscall open +lttng --mi xml start +---- + + +[[reference]] +== Reference + +This chapter presents various references for LTTng packages such as links +to online manpages, tables needed by the rest of the text, descriptions +of library functions, and more. + + +[[online-lttng-manpages]] +=== Online LTTng manpages + +LTTng packages currently install the following link:/man[man pages], +available online using the links below: + +* **LTTng-tools** +** man:lttng(1) +** man:lttng-sessiond(8) +** man:lttng-relayd(8) +* **LTTng-UST** +** man:lttng-gen-tp(1) +** man:lttng-ust(3) +** man:lttng-ust-cyg-profile(3) +** man:lttng-ust-dl(3) + + +[[lttng-ust-ref]] +=== LTTng-UST + +This section presents references of the LTTng-UST package. + + +[[liblttng-ust]] +==== LTTng-UST library (+liblttng‑ust+) + +The LTTng-UST library, or `liblttng-ust`, is the main shared object +against which user applications are linked to make LTTng user space +tracing possible. + +The <> guide shows the complete +process to instrument, build and run a C/$$C++$$ application using +LTTng-UST, while this section contains a few important tables. + + +[[liblttng-ust-tp-fields]] +===== Tracepoint fields macros (for `TP_FIELDS()`) + +The available macros to define tracepoint fields, which should be listed +within `TP_FIELDS()` in `TRACEPOINT_EVENT()`, are: + +[role="growable func-desc",cols="asciidoc,asciidoc"] +.Available macros to define LTTng-UST tracepoint fields +|==== +|Macro |Description and parameters + +| ++ctf_integer(__t__, __n__, __e__)+ + ++ctf_integer_nowrite(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 10. + ++__t__+:: + Integer C type (`int`, `long`, `size_t`, ...). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_hex(__t__, __n__, __e__)+ +| +Standard integer, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_network(__t__, __n__, __e__)+ +| +Integer in network byte order (big endian), displayed in base 10. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +|+ctf_integer_network_hex(__t__, __n__, __e__)+ +| +Integer in network byte order, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_float(__t__, __n__, __e__)+ + ++ctf_float_nowrite(__t__, __n__, __e__)+ +| +Floating point number. + ++__t__+:: + Floating point number C type (`float` or `double`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_string(__n__, __e__)+ + ++ctf_string_nowrite(__n__, __e__)+ +| +Null-terminated string; undefined behavior if +__e__+ is `NULL`. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + +| ++ctf_array(__t__, __n__, __e__, __s__)+ + ++ctf_array_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array of integers + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_array_text(__t__, __n__, __e__, __s__)+ + ++ctf_array_text_nowrite(__t__, __n__, __e__, __s__)+ +| +Statically-sized array, printed as text. + +The string does not need to be null-terminated. + ++__t__+:: + Array element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__s__+:: + Number of elements. + +| ++ctf_sequence(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array of integers. + +The type of +__E__+ needs to be unsigned. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. + +| ++ctf_sequence_text(__t__, __n__, __e__, __T__, __E__)+ + ++ctf_sequence_text_nowrite(__t__, __n__, __e__, __T__, __E__)+ +| +Dynamically-sized array, displayed as text. + +The string does not need to be null-terminated. + +The type of +__E__+ needs to be unsigned. + +The behaviour is undefined if +__e__+ is `NULL`. + ++__t__+:: + Sequence element C type (always `char`). + ++__n__+:: + Field name. + ++__e__+:: + Argument expression. + ++__T__+:: + Length expression C type. + ++__E__+:: + Length expression. +|==== + +The `_nowrite` versions omit themselves from the session trace, but are +otherwise identical. This means the `_nowrite` fields won't be written +in the recorded trace. Their primary purpose is to make some +of the event context available to the +<> without having to +commit the data to sub-buffers. + + +[[liblttng-ust-tracepoint-loglevel]] +===== Tracepoint log levels (for `TRACEPOINT_LOGLEVEL()`) + +The following table shows the available log level values for the +`TRACEPOINT_LOGLEVEL()` macro: + +`TRACE_EMERG`:: + System is unusable. + +`TRACE_ALERT`:: + Action must be taken immediately. + +`TRACE_CRIT`:: + Critical conditions. + +`TRACE_ERR`:: + Error conditions. + +`TRACE_WARNING`:: + Warning conditions. + +`TRACE_NOTICE`:: + Normal, but significant, condition. + +`TRACE_INFO`:: + Informational message. + +`TRACE_DEBUG_SYSTEM`:: + Debug information with system-level scope (set of programs). + +`TRACE_DEBUG_PROGRAM`:: + Debug information with program-level scope (set of processes). + +`TRACE_DEBUG_PROCESS`:: + Debug information with process-level scope (set of modules). + +`TRACE_DEBUG_MODULE`:: + Debug information with module (executable/library) scope (set of units). + +`TRACE_DEBUG_UNIT`:: + Debug information with compilation unit scope (set of functions). + +`TRACE_DEBUG_FUNCTION`:: + Debug information with function-level scope. + +`TRACE_DEBUG_LINE`:: + Debug information with line-level scope (TRACEPOINT_EVENT default). + +`TRACE_DEBUG`:: + Debug-level message. + +Log levels `TRACE_EMERG` through `TRACE_INFO` and `TRACE_DEBUG` match +http://man7.org/linux/man-pages/man3/syslog.3.html[syslog] +level semantics. Log levels `TRACE_DEBUG_SYSTEM` through `TRACE_DEBUG` +offer more fine-grained selection of debug information. + + +[[lttng-modules-ref]] +=== LTTng-modules + +This section presents references of the LTTng-modules package. + + +[[lttng-modules-tp-struct-entry]] +==== Tracepoint fields macros (for `TP_STRUCT__entry()`) + +This table describes possible entries for the `TP_STRUCT__entry()` part +of `LTTNG_TRACEPOINT_EVENT()`: + +[role="growable func-desc",cols="asciidoc,asciidoc"] +.Available entries for `TP_STRUCT__entry()` (in `LTTNG_TRACEPOINT_EVENT()`) +|==== +|Macro |Description and parameters + +|+\__field(__t__, __n__)+ +| +Standard integer, displayed in base 10. + ++__t__+:: + Integer C type (`int`, `unsigned char`, `size_t`, ...). + ++__n__+:: + Field name. + +|+\__field_hex(__t__, __n__)+ +| +Standard integer, displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__field_oct(__t__, __n__)+ +| +Standard integer, displayed in base 8. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__field_network(__t__, __n__)+ +| +Integer in network byte order (big endian), displayed in base 10. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__field_network_hex(__t__, __n__)+ +| +Integer in network byte order (big endian), displayed in base 16. + ++__t__+:: + Integer C type. + ++__n__+:: + Field name. + +|+\__array(__t__, __n__, __s__)+ +| +Statically-sized array, elements displayed in base 10. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__s__+:: + Number of elements. + +|+\__array_hex(__t__, __n__, __s__)+ +| +Statically-sized array, elements displayed in base 16. + ++__t__+:: + array element C type. ++__n__+:: + field name. ++__s__+:: + number of elements. + +|+\__array_text(__t__, __n__, __s__)+ +| +Statically-sized array, displayed as text. + ++__t__+:: + Array element C type (always char). + ++__n__+:: + Field name. + ++__s__+:: + Number of elements. + +|+\__dynamic_array(__t__, __n__, __s__)+ +| +Dynamically-sized array, displayed in base 10. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__s__+:: + Length C expression. + +|+\__dynamic_array_hex(__t__, __n__, __s__)+ +| +Dynamically-sized array, displayed in base 16. + ++__t__+:: + Array element C type. + ++__n__+:: + Field name. + ++__s__+:: + Length C expression. + +|+\__dynamic_array_text(__t__, __n__, __s__)+ +| +Dynamically-sized array, displayed as text. + ++__t__+:: + Array element C type (always char). + ++__n__+:: + Field name. + ++__s__+:: + Length C expression. + +|+\__string(n, __s__)+ +| +Null-terminated string. + +The behaviour is undefined behavior if +__s__+ is `NULL`. + ++__n__+:: + Field name. + ++__s__+:: + String source (pointer). +|==== + +The above macros should cover the majority of cases. For advanced items, +see path:{probes/lttng-events.h}. + + +[[lttng-modules-tp-fast-assign]] +==== Tracepoint assignment macros (for `TP_fast_assign()`) + +This table describes possible entries for the `TP_fast_assign()` part +of `LTTNG_TRACEPOINT_EVENT()`: + +[role="growable func-desc",cols="asciidoc,asciidoc"] +.Available entries for `TP_fast_assign()` (in `LTTNG_TRACEPOINT_EVENT()`) +|==== +|Macro |Description and parameters + +|+tp_assign(__d__, __s__)+ +| +Assignment of C expression +__s__+ to tracepoint field +__d__+. + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + +|+tp_memcpy(__d__, __s__, __l__)+ +| +Memory copy of +__l__+ bytes from +__s__+ to tracepoint field ++__d__+ (use with array fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + ++__l__+:: + Number of bytes to copy. + +|+tp_memcpy_from_user(__d__, __s__, __l__)+ +| +Memory copy of +__l__+ bytes from user space +__s__+ to tracepoint +field +__d__+ (use with array fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + ++__l__+:: + Number of bytes to copy. + +|+tp_memcpy_dyn(__d__, __s__)+ +| +Memory copy of dynamically-sized array from +__s__+ to tracepoint field ++__d__+. + +The number of bytes is known from the field's length expression +(use with dynamically-sized array fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). + ++__l__+:: + Number of bytes to copy. + +|+tp_strcpy(__d__, __s__)+ +| +String copy of +__s__+ to tracepoint field +__d__+ (use with string +fields). + ++__d__+:: + Name of destination tracepoint field. + ++__s__+:: + Source C expression (may refer to tracepoint arguments). +|==== diff --git a/2.7/images/export/concepts.png b/2.7/images/export/concepts.png new file mode 100644 index 0000000000000000000000000000000000000000..58d2848783c8e84d834c54ffdee4ff565ad07091 GIT binary patch literal 63215 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 PfWOP8Ru?MHUyu18YT!1; literal 0 HcmV?d00001 diff --git a/2.7/images/export/event-rule.png b/2.7/images/export/event-rule.png new file mode 100644 index 0000000000000000000000000000000000000000..bad335e350219207f92cc539e4354cbfa8c0b0dd GIT binary patch literal 35444 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 literal 0 HcmV?d00001 diff --git a/2.7/images/export/live.png b/2.7/images/export/live.png new file mode 100644 index 0000000000000000000000000000000000000000..53c7d5fb0882c43f4f00c1e528991aeb1611e13a GIT binary patch literal 5223 zcmZ8lXIPWXwx#!~^dq8W9izM5+*al}>fwU-DlQEXK`hLP!2a|B}SS z#J@a#Ikq={{=X7GefsowLR?(je_RhV*Z@k9KCxCL|>M-2$&1Kc2gm{T;c4UpzTE8E@nNjkL71ck@Ab+LnU$n(@Hrw!}~3 z-OS8Pyv4ie>FIcaUo9yq37=>>_7cBi_4{EyQ9dC75uryy;^N{`068f&DS3H$C7|MC z8C4Y(6*Y5J?ZsZOuQbvj89z&cu5EZ zA~iJ?uQPolEd!4qX_*lvSy@@x+1a_dxp{c3<$T6tKChslpeU}ksHmv8xVW^mw5+TQ zxlvY8QBhf0i9aF~3Wcw$I<>8)rlz*Gw!Xf;si~>Cxw$28;Op0~t*xzXspz)0ww|)- z-rnB9(#65SLHv1+jEs!cuKH@nE8+Xe-rG>mh=75CftQyTe=g$UPoF*o0)f{5f{Tm0 zyF0$9NPGpUsd#0%xk&t$U)tLLg|UBQZf`EJxr{Z*D? zKu@)ucD1r$&}bjxXPV+?uYKQ8~Y>$svtea`F#8zZ-N2npI_r$a_*LGSXkRlhr34uk$&UOMJHJY$uw z+I)I^xpQb93?xK0{`tg>(tFzFZn|U$xov8;qZD;d+ z{%~i(;?|py6`mM4IwubhB_Dvy?7R(Y+o&jFMs5TUf3zptDHXf%G$uYDj=L_+ zbE!{lW)`?^2~a&_*Sm%2m}clMVC zN>Lh89D~2QWX9lB-TC4Ylkmod#NmQHp6XAXXvvM_Fl)k>C%r0icOZ8ACH5IKX#b6` z<4zqWrH$^ELdrNW2-{gBR7s}_>v;3_AqoHr3$u~13Jy}_3EmlBxPbJmLv9Yk6njF4 zNr!S9u{r(u-=m>9IZO_rF`{--mn)#*L_kr&EI{ zw)6DBd9FqBL zg#sZF$QKo}1xyr-;o{Q5lU7trJNz#q3V>Ey-HaU*tfI}zC^XrnQSJIQDKB4I*72yQ zV|inT)^z}tHvHhhU1L9cvSd2l4&x#c;Y>`mY}Bw;0vlbFc&*B7QmH6{MQay2+NWEQ z;RVU@(qSWZbONW@UsS-+h83e!g@%T_EZFnZ=BPA@pd9^BpM-m13{&^x2y_aX%AoSh z1p1(y0h(f2Dm5~0LyL+?dA02VO4KT;e@Yr zVx(ppz9)o#um*aS-TkcbTo*HG2(XxV{7Uf5%P{G;lK&Kn$(|k=lCajthpc#G52lQ= z3@Ld*e2p4=Jwx$z5Hln`oF&JGmotw8J!vbes0rR5_vy ziq4ddfaHo5K@QJvNf;AyBg*mw3f+}8`o*5%1`237}a>R}2 z?{%gyna4kKDsIv8F{Eauec+_-2^~|ScXe|hLlI2~hz@vy-Gkupgi!1U;t=0FVcAF? zF1LGJ85u)K9nrb$bEceO;jyODTnx1Lt)KDU&WI|#PZOT%1ysyMF%|Wz{84-jzxN00 z6Wx)cS@3kz$%a`B|HmT+0j`LSbTcgwx8sXMSGF+a62@dI_;vc-;!w9nE>J|W)x#t2 z2Mjbu{91%yUd|fQK^x}Lc{V^w!}@yQpaRZWU_hfOvvg8hE3v7OiCz z+~dF!3*XLkAs$bbMG~1sxKv)7`r3*0*El>x^~;`%++tnoWL0m5_qlB@sH^PPQ|!fp znsTPukQF~cJ4>UIV=pwxhNk&{+EAwUuDUDDp%Sm{b~+>j!<7KjD3X?;H$8P^EoW+7 z^BkC0T{9zd#7@vSEn+zv41RR; zg;eeROgv-|0b{P^S55Jv-gsQ|5Qn7esbu|lp;XAz_lb^LNtE_XOpM?AjtZ(eXkhkm zV@I;KmRSB-xx{p_f4nNv+Z(W!j%$XIx{^Gy2=$o@b|z`~GR4WyuL}5`{UR1Ow6tpU z`6l0FV}%=97Sd;IuCs){sA*}$!TjsrJEuPGosEG+6*D+bU+Eyo**XO^+e)Hbo6f_= z^<{xWEJh6x-nSKmbx3W=dhNY|>%Y3<{V-khRsnXvkMQI0lrP}&)eTmT7NGg_rF5?_ zSJi6|FbHw0dB$^KZi1kk3$2}478lD?y!!+quKPZbxh9+oFIwnP?ZhbTG;*E|Yr^ZC-2a^iB zLifLzH#}~H;!a>qi!eXjD!O8(6*m0p{7CS_ZQ%{nht3JUvb4D+s`~(2S(K_oc?;8c z8CYU#%Eh~OS_??AGkHwm&|orkI;N^s*PYwcRpD1X^P?xrGeFXItr?bcb~l&4w}(=I$k*t>iB1g*Y4$d8e#=M(?sO?l6w+HK zB})X{XTwbks4v>#N3HG!3@+yK=F)d2^>%WUMGsjYnNfo1K?}Dnf0Z0*9H={@*Jb$Z zI`YtK00mJPDLi~9uDvsH@Tk#%5)qb9r)%S5OS%VSqCj-~@o9iVY zlCA%6a-Hx1n~=bxnv)05$$NqX%)Tg|uJFj<2h~=7pgz+C>H>Ly z$;blZ>&6G~PNTUUTCD6wP0L2Por%ju<{wf(mmHM=WlnO(bMnZbmF^l%JFTthjoF9% z@F$j_Ve7Q~gAl#q7*ftHB|UnW37cc-sOdbMzK00GQ{FZkC|w6QGW@nw|Csw9C)R*R zNFqQrg>Fo*dcloFs79Bm(Ue1NT4wf$*Z7HS+$8#+=#vwTM@UVZ(pY*Zi@_urC?m%D z_nVQuw@08QJ@bs=xjE-s59EKM1{YWTt6Ik#Rk)OiQZ}i@Kl+2UFps$MCFqCjABnzr z1En|>Dim#0Vro8(r!?)y{;p7_D_^!XpxtYH=4*7cnTHMXwdZqzus*G7gO zkR`=Y=xyC1xSjWN^%0AU_xQ>`S=lA&-U=S5UAi!;p;eS@MWUmgp8|?Epkb|(;|!Ft zHX&CYoAs-{F`kY3rmko9YsB<`#70kEjpqTviBwYyt|w%r42c3U$kw7e7xH9CMopXi zh3jISJ-S@7tl+0$5hex<@BqB=yXrbXmH2!p?n&1|tJQg5Ox)hS3-9TZ`7`?E3!nMv z-W6YRcgLYcnR<&R1S%y^tXZsuOq;tU=7s_o#UN>}!+OcL$#H5Uu42Y&}!$OGu$ zU2CXDcQAfrS`9UUbq+8$b3tAC7Wv8}*F$B*Mkmd0dNj@61~#+2FUJVMe7>XV?|g}? zYu@6W+jKiEU;i|}~S|9co-6BJ&Z=)8Vlcq3a+bF#hrvpd0S-fpW071=$tw& z&RxYbA-2DJLch1y-_?S>@@_|coy*xo#S*b_1O{sEt^D54X?xH`7}~yi;P50J>Uc27 z%m7ZtRnb7K5(E#z_$xz4nf;?;@7Tef6W0MCRfAYvOt%t>w*2EGB>#IE5wVKF$un)S zfk{$1d4T@z?jAwZ*Fb~&QVHafzg5x}bCf7{<~t6{F(h{Nu@)&Q;}HX3F9`bv`KWAv)j!iyXVp64`uTl8}Yg7+iHi(xq5Y01^( zO(>eNBUFx)OJEZIB%j;9gUV2-Zqc*W;kCw3|?_4tfz*#vA&vM(uqH{<6*id z_uC%UwbrEa@22?Q-uVBYY+A=QYax8~1giug5#}6|AquZJonkT1_oiUf;ofnw`bcjxORKd}) D6JB$r literal 0 HcmV?d00001 diff --git a/2.7/images/export/lttng-logger.png b/2.7/images/export/lttng-logger.png new file mode 100644 index 0000000000000000000000000000000000000000..c995f801edce4d06f8bbeb65c4e6d3c1b512cb4a GIT binary patch literal 5638 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 literal 0 HcmV?d00001 diff --git a/2.7/images/export/many-sessions.png b/2.7/images/export/many-sessions.png new file mode 100644 index 0000000000000000000000000000000000000000..c8bd4cd739c2e8b3afb56e7db1a251b9be0c01cb GIT binary patch literal 5623 zcmZ8_cT`i$7cPPnk)rexx=3##B1O0eNRukPLy#s_FqB9HDN-b;Gz+~*FA+iz2%$$h zQbRF7=omr|U_@TL_xJvI?^|ch%=hg*v(D_j*UVWb$;?ELk)DU1f`Wq4Kwrm#g5na9 zJno^RBDeN?hdE?n#q6P_?#0DLUx_UF!F?4Zx0AJEqg4{?ZT#3KVKUuD0p=QROx1~f z`z#|bPOT&TepIR=QSt*JK6lF9O zV^+)JP0A8k%Eo3Zl6foV)~fQ6b#HjTeEHJwjFTAoBfj~45e{aV9{JQ+J z?IUkH8K`zt4jT$Sgd(H2tz)pIbE>r~pSO#Q?yl~^j-H;LUUbjj5cTz;$r$J*hvFM* zqQ8Wvf1zXWGyC9l@6gcD@bK`+_~6KV|7ZozC>h^J##Z{qHhac?_Iw|l|Ni~^1R0pI z2|RkLmS=irV5W|9W^r<6_h{y@f9Ckx?A$Cl&U3`U`Kgup{o{p3p2fw*rRAmNgxTWf?xVlbia2 zRhPdnr6???#Ygue#+JcK5R~Rl_jz*V#+`w2N^0qw-%=8~xEY8gh9YArVboLyEd5u& zvhoYZrpQHnfb&QE2*J}c{fEbTvBB)@$itJ?!=^)ZH7Y79-a7&IOKxs%6Mc+S=d8}Q z;ajHk%*h9*nem*z5`HDbYX;#WPyGu6w@H23cM0~*$4^nNi<3zlkhRSiDm|O$VU|p1!}8?`y}XU~4w&Lq)#Ie3VgUHU6?NPE>WK=my%SOnjmiV=^5RL`7|k^d zi3XhetLG9F=~BPw)6t#=+~veGinJsp{bG~Ne3|B6?R_M*W$VY${_?(AKkXo(RRAX7 z+XJZpg?lq-+@#hn?|vy?0u*3(|7+R(An&&pZ*a;baO+oU5rt5ln_OAA$gUp#=iF&h z(l+Z{mc&1-=FmPwVuTPtl~3fc_A`Fju3U z`36nteKXTC;|pgqZt?48491*FSc(yfwRIP2r6Quf|Qfr4pJ9w$7 z)vHjS=K=H~8``RiuBa~vH-L)`CS$_4yS8Lv&WjsbJ{pibCDQv`wQhB)VSMk=aXRqi z5>d|>*n+eVB{|6NFB|32SkzuB@qAs249`91UO%*gpVQ|y_S z)^aC>8n9ukt?V_W>z`!|Bdh@_EmgB!Bzy4z0H&=URhH3-pdlUUe;ai3XtDNCHncZt zN7Y||y}tc)E3}DKQTCvI9oqA>~H0TU&`1Kfox> zx_$(bYhIfsiX;t+7S}G2m#m6p-FYODtw7wj{6~q#N0RL|GUtSz81&^$$D;6AV{@kh z3{~%AM}7nqn8iw-cscn! zmdk>zh}BrxNS)0`b^0f!3fR(j_GzxI3?}MYZEKnEDy1?mJiKZ8+s3l&wFg?BwmnC$ z_J^0R;6+t@&7bLB4o+GJS}ab1kS)7U0O*x%EXP^Hk~IiK)morDJvYcxCN80whFxW`z^C{={VfBjjhyj zj$@*YnFK&~Y1~MEL{NgkOH4J+$tTLTc%U1mB2M#AuTX>5D|1;PO25qh!MIkn%yfMN z-;7Ep)R3hz&f|sZF>>26ijnVHcZp7ZYl4#<3s{h(hSa6_2 zlLE|^8O_ood^#MYhB0R zeoGfR-WnIepEw+QP&i1?T4w7Pa81%2edJ|Gm%U${H}iy4;ynMV^(B&piQSBnVo+aN zkgHrP^QCIO84O)Wh`S|jU!k*1sZBjnXyNF;D#SCR+bqz;c zzF$?7cCa9va=|}1BktXhmE!x@PHn9V!;au@HypL(IbuFB`l^hm#sogF+cpz%nPOHR zNTBNO#mV2^ZqS{Y;T|kY_K6z*taK0__X>%M@m=KqNe?PFQ;CzRy`kmLT!CSIccT)c zfHhVf2*EDC4y9# zdN`i>K!Y_~YAh$YDDt`$9{#|&m;dDe$Cdu4jt}El%#S(5b%kWFpi(ApQc8lj`rk9? zXbHS=jk!m;gN%GQNb&JVhi0P&Vx^bGL)51vIBZfE@Urwamt0U2+)-alfO#nIjyDeUIo(@eK{rL0f2#dFUYJa zX;1DMoqif$p__8d$i1B$@B1l`O2ws=1!Yu{DG@6dS9NJXmQySnYTzNE-7)A+hP&`OAjs?a_JQT3lD=hqu05nk4kOhg~@?ANKaXbkN=h5{VPAirebW6 zydUdZv!AnqvU%LHMK7i!cwJwFAG&7=JGMcJK`JQH?>z?HyT5y_gh8I7O1*>$gQUk; z8O)16O5oiy9^G(=94Qv0aB+AiL=+u95?L-jNIxtmV#+zW83OUbZMmFJ_#3foVS-g^M?^ii01^gJ_F=qR<)FOO=u3WB+AcLaRQAU^*1-y%$)XBj`_-_4Zt;v9uI>-rwKnd-lJdP|!9=~!y_ zHD`h9S2&d*=yv5&_-DcRWqnyTxz&Q(Qz3UjGxaCa-FDDi;08to^j}BJLys8d?R+85 zL$H8WB~aFZUp9OZbhwVGfhlHswN{@ueNaXRq~`jF;K@#&|2nz&pmx@VVe@^Em4h>4 z@9c)$qM&=3;X(x2>V((y*tJMJ$vdBv9P!L*K5SC~eZpL5NsazN>gEi~2bV>J;P1d( z%CfvJLT8Umzd{0se~jfIwjxPst5*0lOby~<>Tbo%PAx)Fyn+#bbb$BTaGHXs4a{3Q z0sXvH!n9_p@pq=H@!r}_hk3ykf%8@~@_#)ULR;*@bUREA?#zsHgVXaY*?k3gB_{(A z#igVaHw(1?ldVmo?aQPcCx?%5%?_X+p7FUkr|G3YW0qy0ktx1+u7@ddvUhztL_+Pb zpjPk4kA+CWqDFYpy)`^|c<1+@FdEI!f}B#>3M#x94MKUaQDe@@C}5|dMrIq&hwulA ziT!cCIscsRg=6)3;i_#bMkYY!AZp7@?1I2+Y=GP+1dFLgY`>dB|1s4TBA_Ez_7_hW zr)I_c+{rTqfMONc>bJlh;6^Q1@dC(C5g>`jmQFomeMa;LWBQX^oCFkAJ3 zcQ|m6M%~mOzC->b*}v9LLx~V|PmwHOS+@y-oAu!>M?A|HSaO|OfffI1H&DJ2li|F{XDjw8$3o?Nd3FfV^@-Q2s*GSW4T z7`u!N;ON|~WYyp{ds}-SScA9(I-u$@bb4NfWAZ;b0t>+d)X@KLhYi8>8&zfeeM^Zq zY5(mYJ)X@YH%=7v6j%28SaDXA7Y0z{1AXyJu1@~aV`B1~la=~_^d+yEE3L{?u(nX@Ft~g)a?WA!&yU`6CkL$_O-)(ZqopFQ+Cq^H zyUm|p@FMP^t9r?vV7*0e(-T4zEz~AO##My~CAerICK9OrXB7|aE1q;9P6gLv2@f@~ z*%&prGW)TtJwWXd9?SIqWxCbn!2$fO8X9{YADFj4t^Okg)4#j>Ikav3h6(f-{isD^ z)Ljf!lRv(1n0{AfT3~cF`(DcVmEb@oL$s7JZq+uwx+8+4wbw*F18S4pBja8J(`<`S zn9mK`|HU{8L}1<|j_=Pwa3gWc|K0kdJNM{@yAHuWi3P_uiP+Fy_0WiHyQkrE&9pUT z^%GLb`C-8gqZ`(rqOfg<>EWQ0FOTr#$|i5rA6SNx4I4%fpPd&i!sq5raEG<-fo(E7 zZixCud%sIhc-5Xsoo3X(Ma&!HAGPvEOq82ffCBqfdjs5j;26s3J4CA%1=ET8cz@i; z;hj#C(g&q;$X*4I)W1RjLQ)(SN;a>RZLxwxRm{|1x7( zT64&n-onEL6D*`}WaQJ6P_PM zAA=&nn61fj%T`1X{ztb-+23Tu19yc%l1h?O1Q`HW85SlJgm>!1K31G;I3)9Wm)+Xq z{j$No!^O?Y?`L5~#foSGJ;>KhSj|`jjn%?8cIkjVK7bd z2WOqgD#i}Te73w+3{VTfL&B%z(Ifn=%+AsyFvT7X9M!f6KBLZd@t7}n5-W#@DT zL$si|Ld22Qy*c95r+Df6rk{{=@~@5!Hhmgwc-QMSt|0x0zG%R-T%p&n^UjCvUpJ2` jXRGdo*uIFnp!%sUJjoE-0Ve<2qcG4l(W$-f`ttt(?jm(p literal 0 HcmV?d00001 diff --git a/2.7/images/export/per-process-buffering.png b/2.7/images/export/per-process-buffering.png new file mode 100644 index 0000000000000000000000000000000000000000..71ea2233c9e4b11666567e37bf3ce3738096ad35 GIT binary patch literal 76856 zcma&NbyQSQ+crKhbSo+ht#tR$B?^*~(l9i_NOuf_bTV&&l1hto zeWT#>KHvJi-&(&vIP09@?7H{f*LC0bzD}fux*{j z$C=l8DY)jfuI>?LJ(5S~6)E_2)lr*Z_qjw=@tuor^tiv@kG~QJMZIAwwrjuoCQXxG zq>CR(FVbK`ChD7fgugsIOEt4|MVyN7S~enwrlGK@-~_qhdIR3D@-S*Iqh6 z<|_ki*20cH?p}moL=QR0&>EIoB5i4>-MYDQnqmX%ZW;}0aQ^wlztYF~NV5o__≠ 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�_KcK7Ks*r7~x8a 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 literal 0 HcmV?d00001 diff --git a/2.7/images/export/plumbing-liblttng-ctl.png b/2.7/images/export/plumbing-liblttng-ctl.png new file mode 100644 index 0000000000000000000000000000000000000000..976b46c9eb29c297180211585770c42ff2087968 GIT binary patch literal 41491 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 literal 0 HcmV?d00001 diff --git a/2.7/images/export/plumbing-liblttng-ust.png b/2.7/images/export/plumbing-liblttng-ust.png new file mode 100644 index 0000000000000000000000000000000000000000..8305eef9b0b272aad7724d137ac9c1e3c68c91ea GIT binary patch literal 41625 zcma&OcRZW#_djlrqNR!oN*Aq_YVBEVX-k#Xir7?*pe07_Raz7sMs2EgLW~%(DT<06 z6|1GB#HbM~#`liCUa$A(_uudFh)46teJA&Io$FlZJkNPPuSV)Uyvue1bb^YCitYZr zJCCWTXkfq}l!*cO_tdPTjo3wPG--0Ua5w_H9 zIbl_fo4;Olo)CHiW6zJ^ebE>+h|=fp)9Z_T9z6c!!qzo;!X zLYj_P*pIfYni5T?4bQZD-=E%}mphfN=;^dFmt=X^gLMmGzr}R^rEsyag-@=0(BXcN zsfER%_tVPtOk>LcQhvO3U|=J}(h|HfQ5*L6R&lqFFCLgxp-?EJ))a9ktr|}v_bKM{ zFWGMuFq}?`?0aI(i4dsu-(An#usZ(6;zg71zfN-@8bXMi$F~JaKI#Q-TDy6C+3AWK z2o*tjONXFbW;$=hW(Xr|mNmGczheRlbE27IbjJBcqtesaIz*gsXYVjUZVwGTbhC$* z?Ng7BnO$i_H<;}&U`21)zUxTpFj1JQa=otlh_*xMRx_w5L_;FkHPW@%Di~%jA?rWTEN{aO1*~|j0Ejut)YS?R@%d?!+FyQB2C!MFku>&tuM6e8S zKQJTUMY#vK2)vp>z>sWMFC2fk_UVcL1uM2}-Y|5j|D0HRzAC9OL(zBhisd!%?SH=M z0y_OB;7^#~QsHc8+~}uLZEfxL(Z((G3_O#}kBWHl=(;KgDx!Z0fnt^n z-RU3=O~~*od3j#_k?-=>@_24|FO|sX?^-y)tCR?NtQwH_*1i}bo_Q;)TXfQAaBou0 z1m~g3_S*RdViHrP*SLx8OP|lBL&OB6j5mk?vi$=F9jyLZ+0 z1`yHG66AJppxgHMYj)9)()Epvjk?5!VftcUce{M4q?3@_&3K2-WN{Y}U4F5l6=%}) zsI)*%GvFls-1PSi{OwG~^8| z%yo&$iGE&*Ryts{raQUOJlJ@!eiMJr%)S?df!)_2xwIKC{Tn0;1M3s~Frx4O=MCC%!7)O}qIz|4tOjRgdnJUYSY2e} zG$~pG%-=-kiAc(_l%CHPoED=reTU)Tp^*SiuV!@FL*%}ZBp_>zVMZ_W&2n;7b zoCl(8du-dYxFp~l+>?P#Qm_JpLyvEZ%CRQtasl6HU`&u=b*4B6^&1B5 z(zW;Wul0mjyu3zh?1bF-^m4*qnj{jz+C@4A;R7Su0i%3ueCnOBE}tnu*U+77bb_$P zGQwSxCiBq8Ot*>H3_a*fM%seFg)HOO?1~|DDS>d@r(8K47qaBsGY(8qcfPF=X|4l- z>~ayTXa>>XoKQ7F7_oHj*_1J;@EG2R{;>ii8s1m$E^VKnodDekMi2D-`OK4Jp6+{f z>^-~X`@rl4jHN|Y0ZEhx$yq2P8IB&F5$e(KUu)+IDdeJsz_xC22UJ(NY7|2%^>X3Z z3rut3uz|_nM|XZ%Nl0YIj-BDZh#>J*6v9UO87aYlWQc`wQ+K_6V*F%8tDnht;Cj9< z|JFsxThD7^e={U#8y-9|F9W+hG&7^3Ml4%qe0E`ZN%-~U{)7Tc@}$OExXis;CQmOr zObHV#uy*0Hcgox_|PXVag4~Ua;0d$HlbWYNSlY#Abjh!Ptjlq`hf9D%tplK zh4ttGBetgCK^}y;ft%`p(4713l41-h@48#-3&ch5Nh6jzhuMkqfJdCSQC58ni?