The latest trace documentation images patch is version 5. Thanks
On Thu, Jun 14, 2018 at 7:47 PM, Vidushi Vashishth <reachv...@gmail.com> wrote: > - Updates #3454 > - This commit adds Tracing Framework Chapter in the RTEMS User Manual > - It comprises of subchapters on RTEMS Trace Linker, Capture Engine, Trace > generation techniques explaining trace generation using Trace Buffering > and > Printk generators and sample demonstrations. > --- > user/index.rst | 2 + > user/tracing/captureengine.rst | 169 ++++++++++++++ > user/tracing/examples.rst | 199 +++++++++++++++++ > user/tracing/index.rst | 29 +++ > user/tracing/introduction.rst | 103 +++++++++ > user/tracing/tracelinker.rst | 494 ++++++++++++++++++++++++++++++ > +++++++++++ > 6 files changed, 996 insertions(+) > create mode 100644 user/tracing/captureengine.rst > create mode 100644 user/tracing/examples.rst > create mode 100644 user/tracing/index.rst > create mode 100644 user/tracing/introduction.rst > create mode 100644 user/tracing/tracelinker.rst > > diff --git a/user/index.rst b/user/index.rst > index 8cbcd1b..a764fe8 100644 > --- a/user/index.rst > +++ b/user/index.rst > @@ -52,6 +52,8 @@ to the Community Project hosted at http://www.rtems.org/ > . > > tools/index > > + tracing/index > + > support/index > > glossary/index > diff --git a/user/tracing/captureengine.rst b/user/tracing/captureengine. > rst > new file mode 100644 > index 0000000..8eaed3b > --- /dev/null > +++ b/user/tracing/captureengine.rst > @@ -0,0 +1,169 @@ > +.. comment SPDX-License-Identifier: CC-BY-SA-4.0 > + > +.. comment: Copyright (c) 2018 Vidushi Vashishth < > vidushivashisht...@gmail.com> > +.. comment: All rights reserved. > + > +.. _capturengine: > + > +Capture Engine > +************** > + > +Capture Engine is a trace tool built inside the RTEMS operating system. > Capture > +Engine is designed to cause the lowest load on the system when operating. > Hence > +it does not effect RTEMS when operating or when disabled. It binds to > RTEMS at > +runtime and does not require RTEMS or your application to be rebuilt in > order > +to use it. > + > +The Capture Engine's sample testcase for the `sparc/erc32` is available in > +build directory created when building RTEMS in the path > +file: `sparc-rtems5/c/erc32/testsuites/samples`. In order to access the > capture > +testcase perform the following set of operations inside the RTEMS build > +directory. > + > +.. code-block:: shell > + > + $ cd /sparc-rtems5/c/erc32/testsuites/samples > + $ sparc-rtems5-run ./capture.exe > + > + > + *** BEGIN OF TEST CAPTURE ENGINE *** > + *** TEST VERSION: 5.0.0.de9b7d712bf5da6593386fd4fbca0d5f8b8431d8 > + *** TEST STATE: USER_INPUT > + *** TEST BUILD: RTEMS_NETWORKING RTEMS_POSIX_API > + *** TEST TOOLS: 7.3.0 20180125 (RTEMS 5, RSB > a3a6c34c150a357e57769a26a460c475e188438f, Newlib 3.0.0) > + Press any key to start capture engine (20s remaining) > + Press any key to start capture engine (19s remaining) > + Press any key to start capture engine (18s remaining) > + > + Monitor ready, press enter to login. > + > + 1-rtems $ > + > +Capture Engine comes with a set of commands to perform various actions. > + > +Capture Engine Commands > +----------------------- > + > +1) ``copen <buffer-size>``: Used to initialize the Capture Engine with the > + trace buffer size in bytes. By default the Capture Engine is not > initialized > + and not running. > + > +2) ``cwceil <priority-value>``: Capture Engine filter used to put an upper > + limit on the event priority to be captured. > + > +3) ``cwfloor <priority-value>``: Capture Engine filter used to put a lower > + limit on the event priority to be captured. > + > +4) ``cwglob <on/off>``: Enable or disable the global watch. > + > +5) ``cenable``: Enables the Capture Engine. Capture Engine is by default > + disabled after being opened. > + > +6) ``cdisable``: Disables the Capture Engine. > + > +7) ``ctlist``: Lists the watch and trigger configurations. > + > +8) ``ctrace``: Dumps the recorded traces. By default this command > displays 24 > + trace records. Repeated use of this command will display all the > recorded > + traces. > + > +9) ``cwadd <task-name>``: Add watch on a particular task. > + > +10) ``cwtctl <task-name> <on/off>``: Enable or disable watch on a > particular > + task. > + > +11) ``ctset``: Used to set a trigger. The general form of the command is: > + > +``ctset [-?] type [to name/id] [from] [from name/id]`` > + > +`type` in the above command refers to the type of trigger needed. The > types of > +triggers that currently exist are: > + > +- switch : a context switch from one task to another task > +- create : the executing task creates a task > +- start : the executing task starts a task > +- restart : the executing task restarts a task > +- delete : the executing task deletes a task > +- begin : a task is beginning > +- exitted : a task is exitting > + > +Example > +------- > + > +The following is a sample run of the capture testsuite. The `test1` > command on > +the Capture Engine Command Line Interface (CLI) makes the `RMON` task > invoke a > +call to the `capture_test_1()` command. This function (in the `test1.c` > source > +code) creates and starts three tasks : `CT1a`, `CT1b` and `CT1c`. These > tasks > +are passed the object id of a semaphore as a task argument. This run > through > +traces the context switches between these tasks. ``cwceil`` and > ``cwfloor`` are > +set to a narrow range of task priorities to avoid creating noise from a > large > +number of context switches between tasks we are not interested in. > + > +.. code:: shell > + > + *** BEGIN OF TEST CAPTURE ENGINE *** > + *** TEST VERSION: 5.0.0.de9b7d712bf5da6593386fd4fbca0d5f8b8431d8 > + *** TEST STATE: USER_INPUT > + *** TEST BUILD: RTEMS_NETWORKING RTEMS_POSIX_API > + *** TEST TOOLS: 7.3.0 20180125 (RTEMS 5, RSB > a3a6c34c150a357e57769a26a460c475e188438f, Newlib 3.0.0) > + Press any key to start capture engine (20s remaining) > + Press any key to start capture engine (19s remaining) > + Press any key to start capture engine (18s remaining) > + Press any key to start capture engine (17s remaining) > + > + Monitor ready, press enter to login. > + > + 1-rtems $ copen 50000 > + capture engine opened. > + 1-rtems $ cwceil 100 > + watch ceiling is 100. > + 1-rtems $ cwfloor 102 > + watch floor is 102. > + 1-rtems $ cwglob on > + global watch enabled. > + 1-rtems $ ctset RMON > + trigger set. > + 1-rtems $ cenable > + capture engine enabled. > + 1-rtems $ test1 > + 1-rtems $ cdisable > + capture engine disabled. > + 1-rtems $ ctrace > + 0 0:18:17.462314124 0a010003 CT1a 102 102 102 4096 > TASK_RECORD > + 0 0:18:17.462398963 0 0a010003 CT1a 102 102 CREATED > + 0 0:18:17.462647987 249024 0a010003 CT1a 102 102 STARTED > + 0 0:18:17.462904334 256347 0a010003 CT1a 102 102 > SWITCHED_IN > + 0 0:18:17.463069129 164795 0a010003 CT1a 102 102 BEGIN > + 0 0:18:17.463335853 266724 0a010003 CT1a 102 102 > SWITCHED_OUT > + 0 0:18:18.461348547 0a010004 CT1b 101 101 101 4096 > TASK_RECORD > + 0 0:18:18.461433997 998098144 0a010004 CT1b 101 101 CREATED > + 0 0:18:18.461683631 249634 0a010004 CT1b 101 101 STARTED > + 0 0:18:18.461934485 250854 0a010004 CT1b 101 101 > SWITCHED_IN > + 0 0:18:18.462099891 165406 0a010004 CT1b 101 101 BEGIN > + 0 0:18:19.460935339 998835448 0a010004 CT1b 101 101 > SWITCHED_OUT > + 0 0:18:19.461431555 0a010005 CT1c 100 100 100 4096 > TASK_RECORD > + 0 0:18:19.461516394 581055 0a010005 CT1c 100 100 CREATED > + 0 0:18:19.461765418 249024 0a010005 CT1c 100 100 STARTED > + 0 0:18:19.462019324 253906 0a010005 CT1c 100 100 > SWITCHED_IN > + 0 0:18:19.462184119 164795 0a010005 CT1c 100 100 BEGIN > + 0 0:18:19.462475257 291138 0a010005 CT1c 100 100 > SWITCHED_OUT > + 0 0:18:19.462551551 76294 0a010004 CT1b 101 101 > SWITCHED_IN > + 0 0:18:19.960935645 498384094 0a010004 CT1b 101 101 > SWITCHED_OUT > + 0 0:18:19.961012549 76904 0a010003 CT1a 102 100 > SWITCHED_IN > + 0 0:18:19.961341528 328979 0a010003 CT1a 102 102 > SWITCHED_OUT > + 1-rtems $ ctrace > + 0 0:18:19.961418433 0 0a010005 CT1c 100 100 > SWITCHED_IN > + 0 0:18:19.961672339 253906 0a010005 CT1c 100 100 > SWITCHED_OUT > + 0 0:18:19.961749854 77515 0a010004 CT1b 101 101 > SWITCHED_IN > + 0 0:18:20.460967077 499217223 0a010004 CT1b 101 101 > SWITCHED_OUT > + 0 0:18:20.461219763 252686 0a010005 CT1c 100 100 > SWITCHED_IN > + 0 0:18:20.461424231 204468 0a010005 CT1c 100 100 > TERMINATED > + 0 0:18:20.461747107 322876 0a010005 CT1c 100 100 > SWITCHED_OUT > + 0 0:18:20.461824011 76904 0a010004 CT1b 101 101 > SWITCHED_IN > + 0 0:18:20.462015052 191041 0a010004 CT1b 101 101 > TERMINATED > + 0 0:18:20.462336707 321655 0a010004 CT1b 101 101 > SWITCHED_OUT > + 0 0:18:20.462414222 77515 0a010003 CT1a 102 102 > SWITCHED_IN > + 0 0:18:20.462608924 194702 0a010003 CT1a 102 102 > TERMINATED > + 0 0:18:20.462933021 324097 0a010003 CT1a 102 102 > SWITCHED_OUT > + 1-rtems $ ctrace > + 1-rtems $ > diff --git a/user/tracing/examples.rst b/user/tracing/examples.rst > new file mode 100644 > index 0000000..a694bff > --- /dev/null > +++ b/user/tracing/examples.rst > @@ -0,0 +1,199 @@ > +.. comment SPDX-License-Identifier: CC-BY-SA-4.0 > + > +.. comment: Copyright (c) 2018 Vidushi Vashishth < > vidushivashisht...@gmail.com> > +.. comment: All rights reserved. > + > +.. _examples: > + > +Tracing Examples > +**************** > + > +The following example executes RTEMS trace using trace buffering for the > +`fileio` sample testcase. > + > +Features > +-------- > + > +Tracing using trace buffering consists of the following sets of features: > + > +- Individual entry and exit records. > +- Task details such as CPU, current priority, real priority, task state > and > + interrupt state. > +- Nano-second timestamp. > +- Interrupt safe buffer management. > +- Function argument capture. > +- Return value capture. > +- Shell command support to report to the console, save a buffer, assess > status > + of tracing, or view buffers between specified index ranges. > + > +Prerequisites > +------------- > + > +1. Setup RTEMS for the `sparc/erc32` architecture-bsp pair to run the > + following example. > +2. Download the fileio `configuration file <https://devel.rtems.org/ > attachment > + /wiki/Developer/Tracing/Trace_Buffering/fileio-trace.ini>`_ and store > it on > + the top of the installed BSP's directory. > +3. Change the value of the keys: `rtems-path` and `prefix` according to > your > + rtems installation. The `rtems-path` is the path to the bsp > installation > + and `prefix` is the path to the tools used to build rtems. Also set the > + value of the `rtems-bsp` key to `sparc/erc32`. > + > +Demonstration > +------------- > + > +Inside the RTEMS build directory (the directory where the fileio > configuration > +has been stored) run the following commands to generate traces: > + > +BSP is configured with the following command - > + > +.. code:: shell > + > + ../rtems/configure --target=sparc-rtems5 --prefix=/development/rtems/5 \ > + --enable-networking --enable-tests --enable-rtemsbsp=erc32 --enable-cxx > + > +The next two commands are used to link the fileio executable.The `-B` > option > +signifies the use of the complete path to the required directory or file. > Write > +the full path instead of the path file: `sparc-rtems5/erc32/lib/` in the > +following commands according to your installation. Also confirm the path > of the > +fileio’s executable and object files in the last line of the command > according > +to your installation. > + > +.. code:: shell > + > + sparc-rtems5-gcc -Bsparc-rtems5/erc32/lib/ \ > + -specs bsp_specs -qrtems -mcpu=cypress -O2 -g -ffunction-sections \ > + -fdata-sections -Wall -Wmissing-prototypes -Wimplicit-function-declaration > \ > + -Wstrict-prototypes -Wnested-externs -Wl,--gc-sections -mcpu=cypress \ > + -o sparc-rtems5/c/erc32/testsuites/samples/fileio.exe > sparc-rtems5/c/erc32/\ > + testsuites/samples/fileio/fileio-init.o > + > +This is the trace linker command to generate and compile the wrapper c > file for > +the application. The link command follows the escape sequence "--". "-C" > option > +denotes the name of the user configuration file and "-W" specifies the > name of > +the wrapper c file. > + > +.. code:: shell > + > + rtems-tld -C fileio-trace.ini -W fileio-wrapper -- > -Bsparc-rtems5/erc32/lib/ \ > + -specs bsp_specs -qrtems -mcpu=cypress -O2 -g -ffunction-sections \ > + -fdata-sections -Wall -Wmissing-prototypes -Wimplicit-function-declaration > \ > + -Wstrict-prototypes -Wnested-externs -Wl,--gc-sections -mcpu=cypress \ > + -o sparc-rtems5/c/erc32/testsuites/samples/fileio.exe > sparc-rtems5/c/erc32/\ > + testsuites/samples/fileio/fileio-init.o > + > +The following command is used to run the application. Hit enter key > quickly and > +type "s" and "root" and "pwd" to run the rtems shell. Use the `rtrace > status`, > +`rtrace trace` and `rtrace save` commands to know the status of the > tracing, > +display the contents of the trace buffer and save the buffer to disk in > the form > +of binary files. Use `rtrace -l` to list the availalble options for > commands > +with `rtrace`. > + > +.. code:: shell > + > + sparc-rtems5-run sparc-rtems5/c/erc32/testsuites/samples/fileio.exe > + > +The output from the above commands will be as follows: > + > +.. code:: shell > + > + *** BEGIN OF TEST FILE I/O *** > + *** TEST VERSION: 5.0.0.de9b7d712bf5da6593386fd4fbca0d5f8b8431d8 > + *** TEST STATE: USER_INPUT > + *** TEST BUILD: RTEMS_NETWORKING RTEMS_POSIX_API > + *** TEST TOOLS: 7.3.0 20180125 (RTEMS 5, RSB > a3a6c34c150a357e57769a26a460c475e188438f, Newlib 3.0.0) > + Press any key to start file I/O sample (20s remaining) > + Press any key to start file I/O sample (19s remaining) > + Press any key to start file I/O sample (18s remaining) > + Press any key to start file I/O sample (17s remaining) > + Press any key to start file I/O sample (16s remaining) > + Press any key to start file I/O sample (15s remaining) > + Press any key to start file I/O sample (14s remaining) > + ========================= > + RTEMS FILE I/O Test Menu > + ========================= > + p -> part_table_initialize > + f -> mount all disks in fs_table > + l -> list file > + r -> read file > + w -> write file > + s -> start shell > + Enter your selection ==>s > + Creating /etc/passwd and group with four useable accounts: > + root/pwd > + test/pwd > + rtems/NO PASSWORD > + chroot/NO PASSWORD > + Only the root user has access to all available commands. > + ========================= > + starting shell > + ========================= > + > + Welcome to rtems-5.0.0 (SPARC/w/FPU/erc32) > + COPYRIGHT (c) 1989-2008. > + On-Line Applications Research Corporation (OAR). > + > + Login into RTEMS > + /dev/foobar login: root > + Password: > + > + RTEMS Shell on /dev/foobar. Use 'help' to list commands. > + SHLL [/] # rtrace status > + RTEMS Trace Bufferring: status > + Running: yes > + Triggered: yes > + Level: 0% > + Traces: 25 > + SHLL [/] # rtrace stop > + RTEMS Trace Bufferring: stop > + SHLL [/] # rtrace trace > + RTEMS Trace Bufferring: trace > + Trace buffer: 0x20921d8 > + Words traced: 1487 > + Traces: 25 > + 0:00:40.983197010 2081910 0a010002 [ 2/ 2] > malloc((size_t) > 00000130) > + 0:00:40.983333119 136109 0a010002 [ 2/ 2] < malloc => (void*) > 0x219bb88 > + 0:00:40.983471669 138550 0a010002 [ 2/ 2] > malloc((size_t) > 00000006) > + 0:00:40.983606557 134888 0a010002 [ 2/ 2] < malloc => (void*) > 0x219bcc0 > + 0:00:40.983684682 78125 0a010002 [ 2/ 2] > malloc((size_t) > 00000007) > + 0:00:40.983819569 134887 0a010002 [ 2/ 2] < malloc => (void*) > 0x219bcd0 > + 0:00:40.983909901 90332 0a010002 [ 2/ 2] > malloc((size_t) > 000003fc) > + 0:00:40.984046620 136719 0a010002 [ 2/ 2] < malloc => (void*) > 0x219bce0 > + 0:00:40.986624137 2577517 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.986767569 143432 0a010003 [200/200] < malloc => (void*) > 0x219bce0 > + 0:00:40.987531119 763550 0a010003 [200/200] > calloc((size_t) > 00000001, (size_t) 0000005d) > + 0:00:40.987603751 72632 0a010003 [200/200] > malloc((size_t) > 0000005d) > + 0:00:40.987744743 140992 0a010003 [200/200] < malloc => (void*) > 0x219bce0 > + 0:00:40.987824699 79956 0a010003 [200/200] < calloc => (void*) > 0x219bce0 > + 0:00:40.988302604 477905 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.988446647 144043 0a010003 [200/200] < malloc => (void*) > 0x219bd48 > + 0:00:40.988667595 220948 0a010003 [200/200] > calloc((size_t) > 00000001, (size_t) 00000080) > + 0:00:40.988740837 73242 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.988884880 144043 0a010003 [200/200] < malloc => (void*) > 0x219bdd0 > + 0:00:40.988964836 79956 0a010003 [200/200] < calloc => (void*) > 0x219bdd0 > + 0:00:40.989042961 78125 0a010003 [200/200] > calloc((size_t) > 00000001, (size_t) 00000080) > + 0:00:40.989110100 67139 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.989254143 144043 0a010003 [200/200] < malloc => (void*) > 0x219be58 > + 0:00:40.989334099 79956 0a010003 [200/200] < calloc => (void*) > 0x219be58 > + 0:00:40.990118401 784302 0a010003 [200/200] > calloc((size_t) > 00000001, (size_t) 00000061) > + 0:00:40.990176995 58594 0a010003 [200/200] > malloc((size_t) > 00000061) > + 0:00:40.990309441 132446 0a010003 [200/200] < malloc => (void*) > 0x219bd48 > + 0:00:40.990384515 75074 0a010003 [200/200] < calloc => (void*) > 0x219bd48 > + 0:00:40.990870355 485840 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.991011346 140991 0a010003 [200/200] < malloc => (void*) > 0x219bee0 > + 0:00:40.991227411 216065 0a010003 [200/200] > calloc((size_t) > 00000001, (size_t) 00000080) > + 0:00:40.991296380 68969 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.991438593 142213 0a010003 [200/200] < malloc => (void*) > 0x219bf68 > + 0:00:40.991514276 75683 0a010003 [200/200] < calloc => (void*) > 0x219bf68 > + 0:00:40.991589349 75073 0a010003 [200/200] > calloc((size_t) > 00000001, (size_t) 00000080) > + 0:00:40.991653437 64088 0a010003 [200/200] > malloc((size_t) > 00000080) > + 0:00:40.991794428 140991 0a010003 [200/200] < malloc => (void*) > 0x219bff0 > + 0:00:40.991871332 76904 0a010003 [200/200] < calloc => (void*) > 0x219bff0 > + 0:00:40.992283320 411988 0a010003 [200/200] > malloc((size_t) > 00000008) > + SHLL [/] # rtrace save fileio-trace.bin > + RTEMS Trace Bufferring: trace > + Trace File: fileio-trace.bin > + Trace buffer: 0x20921d8 > + Words traced: 1487 > + Traces: 25 > + SHLL [/] # > diff --git a/user/tracing/index.rst b/user/tracing/index.rst > new file mode 100644 > index 0000000..0d714bc > --- /dev/null > +++ b/user/tracing/index.rst > @@ -0,0 +1,29 @@ > +.. comment SPDX-License-Identifier: CC-BY-SA-4.0 > + > +.. comment: Copyright (c) 2016 Chris Johns <chr...@rtems.org> > +.. comment: All rights reserved. > + > +.. _tracing-framework: > + > +RTEMS Tracing Framework > +*********************** > +.. index:: Tracing Framework > + > +RTEMS Tracing Framework is an on-target software based system which helps > track > +the ongoings inside the operation of applications, 3rd party packages, > and the > +kernel in real time. > + > +Software based tracing is a complex process which requires components on > both > +the target and the host to work together. However its portability across > all > +architectures and board support packages makes it a useful asset. A key > +requirement in RTEMS trace process is to take existing code in compiled > format > +(ELF) and instrument it in order to log various events and records in > real time. > +However instrumenting of the code for tracing should happen without > rebuilding > +the code from the source and without annotating the source with trace > code. > + > +.. toctree:: > + > + introduction > + examples > + captureengine > + tracelinker > diff --git a/user/tracing/introduction.rst b/user/tracing/introduction.rst > new file mode 100644 > index 0000000..27de441 > --- /dev/null > +++ b/user/tracing/introduction.rst > @@ -0,0 +1,103 @@ > +.. comment SPDX-License-Identifier: CC-BY-SA-4.0 > + > +.. comment: Copyright (c) 2016 Chris Johns <chr...@rtems.org> > +.. comment: All rights reserved. > + > +.. _introduction: > + > +Introduction to Tracing > +*********************** > + > +Tracing is an important function which has several applications including > +identification of complex threading, detection of deadlocks, tracing > +functions along with their argument values, and return values through > +progression of several function calls and audit the performance of an > +application according to required specifications. > + > +RTEMS tracing framework is under development and welcomes contribution by > users. > + > +RTEMS has the following trace components: > + > +- RTEMS :ref:`tracelinker` > +- RTEMS :ref:`capturengine` > +- Common Trace Format Integration > + > +RTEMS trace framework can currently function using the following methods. > Both > +of the methods make use of the :ref:`tracelinker` : > + > +.. _tracebuffering: > + > +RTEMS Trace Using Trace Buffering > +================================= > + > +This scheme of tracing goes through the flow of events described in a > +subsequent flowchart: > + > +Step 1: The user creates an application and user configuration file. The > +configuration file specifies the use of the trace buffer generator and > other > +standard initializations. The user then configures their BSP and invokes > the > +trace linker using a command to link the application executable. The trace > +linker uses the application files in compiled format (ELF) and the > libraries > +used to build the application for performing this link. > + > +Step 2: The RTEMS Trace Linker reads the user’s configuration file and > that > +results in it reading the standard Trace Buffering Configuration files > +installed with the RTEMS Trace Linker. The trace linker uses the target > +compiler and linker to create the trace enabled application executable. It > +wraps the functions defined in the user’s configuration with code that > captures > +trace records into the statically allocated buffer. The trace wrapper > code is > +compiled with the target compiler and the resulting ELF object file is > added to > +the standard link command line used to link the application and the > application > +is re-linked using the wrapping option of the GNU linker. > + > +Step 3: The trace linker creates an executable which is capable of > running on > +the target hardware or simulator. > + > +Step 4: RTEMS shell provides the “rtrace” command to display and save > trace > +buffers. > + > +.. comment: taken from https://devel.rtems.org/wiki/Developer/Tracing > +.. figure:: ../../images/user/rtems-trace-buffering.png > + :align: center > + :width: 75% > + > +.. _printk: > + > +RTEMS Trace Using Printk > +======================== > + > +This scheme of tracing goes through the flow of events described in a > subsequent > +flowchart: > + > +Step 1: The user creates an RTEMS application in the normal manner as > well as a > +Trace Linker configuration file. The configuration file specifies using > the > +Printk trace mode and the functions to trace. The user invokes the Trace > Linker > +with the configuration and the normal link command line used to the link > the > +application executable. The application ELF object files and libraries, > +including the RTEMS libraries are standard and do not need to be built > +specially. > + > +Step 2: The RTEMS Trace Linker reads the user's configuration file and > that > +results in it reading the standard Printk Trace Configuration files > installed > +with the RTEMS Trace Linker. The trace linker uses the target compiler and > +linker to create the trace enabled application executable. It wraps the > +functions defined in the user's configuration with code that prints the > entry > +with arguments and exit and return value if any. The trace wrapper code is > +compiled with the target compiler and the resulting ELF object file is > added to > +the standard link command line used to link the application and the > application > +is relinked using the wrapping option of the GNU linker. > + > +Step 3: The trace linker creates and RTEMS ELF executable that can be run > on the > +target hardware or simulator. > + > +Step 4: The application is run in the hardware directly or using a > debugger. The > +printk() output appears on the target console and the user can save that > to a > +file. > + > +.. comment: taken from https://devel.rtems.org/wiki/Developer/Tracing > +.. figure:: ../../images/user/rtems-trace-printk.png > + :align: center > + :width: 75% > + > +The :ref:`examples` section describes generation of traces using Trace > Buffering > +technique for the `fileio` testsuite available with RTEMS installation. > diff --git a/user/tracing/tracelinker.rst b/user/tracing/tracelinker.rst > new file mode 100644 > index 0000000..ab42de6 > --- /dev/null > +++ b/user/tracing/tracelinker.rst > @@ -0,0 +1,494 @@ > +.. comment SPDX-License-Identifier: CC-BY-SA-4.0 > + > +.. comment: Copyright (c) 2016 Chris Johns <chr...@rtems.org> > +.. comment: All rights reserved. > + > +.. _tracelinker: > + > +Trace Linker > +************ > + > +RTEMS trace linker is a post link tool central to the RTEMS trace > framework. It > +is installed as a part of the RTEMS Tool Project. The RTEMS Trace Linker > is a > +post link tool that performs a re-link of your application to produce a > trace > +executable. A trace executable has been instrumented by the RTEMS Trace > Linker > +with additional code that implements software tracing. A key requirement > of the > +trace process in RTEMS is to take existing code in a compiled format > (ELF) and > +instrument it without rebuilding that code from source and without > annotating > +that source with trace code. > + > +Command Line > +============ > + > +A typical command to invoke the trace linker consists of two parts > separated by > +``--``. The first part controls the trace linker and provides the various > +options it needs and the second part is a standard linker command line > you would > +use to link an RTEMS application. The current command line for trace > linker > +consists of: > + > +.. code-block:: shell > + > + $ rtems-tld -h > + rtems-trace-ld [options] objects > + Options and arguments: > + -h : help (also --help) > + -V : print linker version number and exit (also --version) > + -v : verbose (trace import parts), can supply multiple times > + to increase verbosity (also --verbose) > + -w : generate warnings (also --warn) > + -k : keep temporary files (also --keep) > + -c compiler : target compiler is not standard (also --compiler) > + -l linker : target linker is not standard (also --linker) > + -E prefix : the RTEMS tool prefix (also --exec-prefix) > + -f cflags : C compiler flags (also --cflags) > + -r path : RTEMS path (also --rtems) > + -B bsp : RTEMS arch/bsp (also --rtems-bsp) > + -W wrapper : wrapper file name without ext (also --wrapper) > + -C ini : user configuration INI file (also --config) > + -P path : user configuration INI file search path (also --path) > + > +The trace linker generates code that needs to be compiled and linked to > the > +application executable so it needs to know the target compiler and > `CFLAGS`. > +There are a couple of ways to do this. The simplest is to provide the > path to > +RTEMS using the `-r` option and the architecture and BSP name in the > standard > +RTEMS format of arch/bsp. The trace linker will extract the compiler and > flags > +used to build RTEMS and will use them. If you require specific options > you can > +use the `-f`, `-c`, `-l`, and `-E` options to provide them. If the > functions you > +are tracing use types from your code then add the include path to the > `CFLAGS`. > + > +The trace linker requires you to provide a user configuration file using > the > +`-C` or ``--config`` option. This is an INI format file detailed in the > +Configuration section. You can also provide an INI file search path using > the > +`-P` option. > + > +If you are working with new configuration files and you want to view the > files > +the trace linker generates, add the `-k` option to keep the temporary > files, and > +`-W` to specify an explicit wrapper C file name. If you set the > +``dump-on-error`` option in the configuration options section you will > get a > +dump of the configuration on an error. > + > +Configuration (INI) files > +========================= > + > +The Trace Linker is controlled using configuration files. Configuration > files > +are categorized into 3 types: > + > +- User Configuration: These are specific to the user application to be > traced. > + This file initializes the values of the trace generator, triggers, > enables, > + and traces. > + > +- Tracer Configuration: These are like a library of common or base trace > + functions that can be referenced by an application. These files tend to > hold > + the details needed to wrap a specific set of functions. Examples > provided with > + the RTEMS Linker are the RTEMS API and Libc. > + > +- Generator Configuration: This is used to encapsulate a specific method > of > + tracing. RTEMS currently provides generators for trace buffering, > printk, and > + printf. > + > +The configuration files are in the *INI file format* which is composed of > +`sections`. Each section has a section name and set of *keys* which > consist of > +*names* and *values*. A typical key is of the form ``name=value``. Keys > can be > +used to include other INI files using the include key name. This is shown > in the > +following example where the values indicate rtems and rtld-base > configuration > +files: > + > +.. code-block:: shell > + > + include = rtems.ini, rtld-base.ini > + > +The trace linker also uses values in keys to specify other sections. In > this > +example the functions name lists `test-trace-funcs` and that section > contains a > +headers key that further references a section called `test-headers`: > + > +.. code-block:: shell > + > + functions = test-trace-funcs, rtems-api > + > + [test-trace-funcs] > + ; Parsed via the 'function-set', not parse as a 'trace'. > + headers = test-headers > + > + [test-headers] > + header = '#include "test-trace-1.h"' > + > +The format of a configuration file is explained next. Snippets of the > file: > +`test-trace.ini` have been used for explicit understanding. This file can > +be found in the rtems-tools directory of the rtems installation. > + > +Tracer Section > +-------------- > + > +The topmost level section is the ``tracer`` section. It can contains the > +following keys: > + > +- ``name``: The name of trace being linked. > + > +- ``options``: A list of option sections. > + > +- ``defines``: A list of sections containing defines or define record. > + > +- ``define``: A list of define string that are single or double quoted. > + > +- ``enables``: The list of sections containing enabled functions to trace. > + > +- ``triggers``: The list of sections containing enabled functions to > trigger > + trace on. > + > +- ``traces``: The list of sections containing function lists to trace. > + > +- ``functions``: The list of sections containing function details. > + > +- ``include``: The list of files to include. > + > +The tracer section of the file:`test-trace.ini` is shown below with > explanatory > +comments. > + > +.. code-block:: shell > + > + ; > + ; RTEMS Trace Linker Test Configuration. > + ; > + ; We must provide a top level trace section. > + ; > + [tracer] > + ; > + ; Name of the trace. > + ; > + name = RTEMS Trace Linker Test > + ; > + ; The BSP. > + ; > + bsp = sparc/sis > + ; > + ; Functions to trace. > + ; > + traces = test-trace, test-trace-funcs, rtems-api-task > + ; > + ; Specify the options. > + ; > + options = test-options > + ; > + ; Define the function sets. These are the function's that can be > + ; added to the trace lists. > + ; > + functions = test-trace-funcs, rtems-api > + ; > + ; Include RTEMS Trace support. > + ; > + include = rtems.ini, rtld-base.ini > + > +Options section > +--------------- > + > +The options section in the fileio-trace.ini is called the > `fileio-options`. A > +general options section can contain following sets of keys: > + > +- ``dump-on-error``: Dump the parsed configuration data on error. The > value can > + be true or false. > + > +- ``verbose``: Set the verbose level. The value can be true or a number > value. > + > +- ``prefix``: The prefix for the tools and an install RTEMS if rtems-path > is not > + set. > + > +- ``cc``: The compiler used to compile the generated wrapper code. > Overrides the > + BSP configuration value if a BSP is specified. > + > +- ``ld``: The linker used to link the application. The default is the cc > value > + as read from the BSP configuration if specified. If your application > contains > + C++ code use this setting to the change the linker to g++. > + > +- ``cflags``: Set the CFLAGS used to compiler the wrapper. These flags are > + pre-pended to the BSP read flags if a BSP is specified. This option is > used > + to provide extra include paths to header files in your application that > + contain types referenced by functions being traced. > + > +- ``rtems-path``: The path to an install RTEMS if not installed under the > + prefix. > + > +- ``rtems-bsp``: The BSP we are building the trace executable for. The is > an > + arch and bsp pair. For example sparc/erc32. > + > +The options section of the file: `test-trace.ini` uses two of the > aforementioned > +keys as shown below: > + > +.. code-block:: shell > + > + ; > + ; Options can be defined here or on the command line. > + ; > + [test-options] > + prefix = /development/rtems/5 > + verbose = true > + > +Trace Section > +------------- > + > +A trace section defines how trace wrapper functions are built. To build a > trace > +function that wraps an existing function in an ELF object file or library > +archive we need to have the function's signature. A signature is the > function's > +declaration with any types used. The signature has specific types and we > need > +access to those types which means the wrapper code needs to include > header files > +that define those types. There may also be specific defines needed to > access > +those types. A trace section can contain the following keys: > + > +- ``generator``: The generator defines the type of tracing being used. > + > +- ``headers``: List of sections that contain header file's keys. > + > +- ``header``: A header key. Typically the include code. > + > +- ``defines``: List of sections that contain defines. > + > +- ``define``: A define key. Typically the define code. > + > +- ``signatures``: List of function signature sections. > + > +- ``trace``: Functions that are instrumented with trace code. > + > +The trace section of the file: `test-trace.ini` is shown below. A trace > section > +can reference other trace sections of a specific type. This allows a trace > +sections to build on other trace sections. > + > +.. code:: shell > + > + ; User application trace example. > + ; > + [test-trace] > + generator = printf-generator > + ; Just here for testing. > + trace = test_trace_3 > + > + [test-trace-funcs] > + ; Parsed via the 'function-set', not parse as a 'trace'. > + headers = test-headers > + header = '#include "test-trace-2.h"' > + defines = test-defines > + define = "#define TEST_TRACE_2 2" > + signatures = test-signatures > + ; Parsed via the 'trace', not parsed as a function-set > + trace = test_trace_1, test_trace_2 > + > + [test-headers] > + header = '#include "test-trace-1.h"' > + > + [test-defines] > + define = "#define TEST_TRACE_1 1" > + > + [test-signatures] > + test_trace_1 = void, int > + test_trace_2 = test_type_2, test_type_1 > + test_trace_3 = float, float* > + > +Function Section > +---------------- > + > +Function sections define functions that can be traced. Defining a > function so it > +can be traced does not mean it is traced. The function must be added to a > trace > +list to be traced. Function sections provide any required defines, header > files, > +and the function signatures. > + > +A function signature is the function's declaration. It is the name of the > +function, the return value, and the arguments. Tracing using function > wrappers > +requires that we have accurate function signatures and ideally we would > like to > +determine the function signature from the data held in ELF files. ELF > files can > +contain DWARF data, the ELF debugging data format. In time the trace > project > +would like to support libdwarf so the DWARF data can be accessed and used > to > +determine a function's signature. This work is planned but not scheduled > to be > +done and so in the meantime we explicitly define the function signatures > in the > +configuration files. > + > +A function section can consist of the following keys: > + > +- ``headers``: A list of sections containing headers or header records. > +- ``header``: A list of include string that are single or double quoted. > +- ``defines``: A list of sections containing defines or define record. > +- ``defines``: A list of define string that are single or double quoted. > +- ``signatures``: A list of section names of function signatures. > +- ``includes``: A list of files to include. > + > +Function signatures are specified with the function name being the key's > name > +and the key's value being the return value and a list of function > arguments. You > +need to provide void if the function uses void. Variable argument list are > +currently not supported. There is no way to determine statically a > variable > +argument list. The function section in the file: `test-trace.ini` has been > +labeled as `test-trace-funcs`. This can be seen in the file snippet of the > +previous section. > + > +Generators > +---------- > + > +The trace linker's major role is to wrap functions in the existing > executable > +with trace code. The directions on how to wrap application functions is > provided > +by the generator configuration. The wrapping function uses a GNU linker > option > +called --wrap=symbol. The GNU Ld manual states: > + > +"Use a wrapper function for symbol. Any undefined reference to symbol > will be > +resolved to __wrap_symbol. Any undefined reference to __real_symbol will > be > +resolved to symbol." > + > +Generator sections specify how to generate trace wrapping code. The trace > +linker and generator section must match to work. The trace linker expects > a some > +things to be present when wrapping functions. The section's name > specifies the > +generator and can be listed in a generator key in a tracer or trace > section. If > +the generator is not interested in a specific phase it does not need to > define > +it. Nothing will be generated in regard to this phase. For example code to > +profile specific functions may only provide the entry-trace and > exit-trace code > +where a nano-second time stamp is taken. > + > +The generate code will create an entry and exit call and the generator > code > +block can be used to allocate buffer space for each with the lock held. > The > +entry call and argument copy is performed with the lock released. The > buffer > +space having been allocated will cause the trace events to be in order. > The same > +goes for the exit call. Space is allocated in separate buffer allocate > calls so > +the blocking calls will have the exit event appear in the correct > location in > +the buffer. > + > +The following keys can be a part of the generator configuration: > + > +- ``headers``: A list of sections containing headers or header records. > +- ``header``: A list of include string that are single or double quoted. > +- ``defines``: A list of sections containing defines or define record. > +- ``define``: A list of define string that are single or double quoted. > +- ``entry-trace``: The wrapper call made on a function's entry. Returns > bool > + where true is the function is being traced. This call is made without > the lock > + being held if a lock is defined. > +- ``arg-trace``: The wrapper call made for each argument to the trace > function > + if the function is being traced. This call is made without the lock > being held > + if a lock is defined. > +- ``exit-trace``: The wrapper call made after a function's exit. Returns > bool > + where true is the function is being traced. This call is made without > the lock > + being held if a lock is defined. > +- ``ret-trace``: The wrapper call made to log the return value if the > function > + is being traced. This call is made without the lock being held if a > lock is > + defined. > +- ``lock-local``: The wrapper code to declare a local lock variable. > +- ``lock-acquire``: The wrapper code to acquire the lock. > +- ``lock-release``: The wrapper code to release the lock. > +- ``buffer-local``: The wrapper code to declare a buffer index local > variable. > +- ``buffer-alloc``: The wrapper call made with a lock held if defined to > + allocate buffer space to hold the trace data. A suitable 32bit buffer > index is > + returned. If there is no space an invalid index is returned. The > generator > + must handle any overhead space needed. The generator needs to make sure > the > + space is available before making the alloc all. > +- ``code-blocks``: A list of code block section names. > +- ``code``: A code block in <<CODE --- CODE (without the single quote). > +- ``includes``: A list of files to include. > + > +The following macros can be used in wrapper calls: > + > +- ``@FUNC_NAME@``: The trace function name as a quote C string. > +- ``@FUNC_INDEX@``: The trace function index as a held in the sorted > list of > + trace functions by the trace linker. It can be used to index the names, > + enables, and triggers data. > +- ``@FUNC_LABEL@``: The trace function name as a C label that can be > referenced. > + You can take the address of the label. > +- ``@FUNC_DATA_SIZE@``: The size of the data in bytes. > +- ``@FUNC_DATA_ENTRY_SIZE@``: The size of the entry data in bytes. > +- ``@FUNC_DATA_RET_SIZE@``: The size of the return data in bytes. > +- ``@ARG_NUM@``: The argument number to the trace function. > +- ``@ARG_TYPE@``: The type of the argument as a C string. > +- ``@ARG_SIZE@``: The size of the type of the argument in bytes. > +- ``@ARG_LABEL@``: The argument as a C label that can be referenced. > +- ``@RET_TYPE@``: The type of the return value as a C string. > +- ``@RET_SIZE@``: The size of the type of the return value in bytes. > +- ``@RET_LABEL@``: The return value as a C label that can be referenced. > + > +The `buffer-alloc`, `entry-trace`, and `exit-trace` can be transformed > using the > +following macros: > + > +- ``@FUNC_NAME@`` > +- ``@FUNC_INDEX@`` > +- ``@FUNC_LABEL@`` > +- ``@FUNC_DATA_SZIE@`` > +- ``@FUNC_DATA_ENTRY_SZIE@`` > +- ``@FUNC_DATA_EXIT_SZIE@`` > + > +The `arg-trace` can be transformed using the following macros: > + > +- ``@ARG_NUM@`` > +- ``@ARG_TYPE@`` > +- ``@ARG_SIZE@`` > +- ``@ARG_LABEL@`` > + > +The `ret-trace` can be transformed using the following macros: > + > +- ``@RET_TYPE@`` > +- ``@RET_SIZE@`` > +- ``@RET_LABEL@`` > + > +The file: `test-trace.ini` specifies ``printf-generator`` as its > generator. This > +section can be found in the file: `rtld-print.ini` in the rtems-tools > directory > +and is shown below: > + > +.. code:: shell > + > + ; > + ; A printf generator prints to stdout the trace functions. > + ; > + [printf-generator] > + headers = printf-generator-headers > + entry-trace = "rtld_pg_printf_entry(@FUNC_NAME@, (void*) &@FUNC_LABEL@ > );" > + arg-trace = "rtld_pg_printf_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, > (void*) &@ARG_LABEL@);" > + exit-trace = "rtld_pg_printf_exit(@FUNC_NAME@, (void*) &@FUNC_LABEL@);" > + ret-trace = "rtld_pg_printf_ret(@RET_TYPE@, @RET_SIZE@, (void*) > &@RET_LABEL@);" > + code = <<<CODE > + static inline void rtld_pg_printf_entry(const char* func_name, > + void* func_addr) > + { > + printf (">>> %s (0x%08x)\n", func_name, func_addr); > + } > + static inline void rtld_pg_printf_arg(int arg_num, > + const char* arg_type, > + int arg_size, > + void* arg) > + { > + const unsigned char* p = arg; > + int i; > + printf (" %2d] %s(%d) = ", arg_num, arg_type, arg_size); > + for (i = 0; i < arg_size; ++i, ++p) printf ("%02x", (unsigned int) > *p); > + printf ("\n"); > + } > + static inline void rtld_pg_printf_exit(const char* func_name, > + void* func_addr) > + { > + printf ("<<< %s (0x%08x)\n", func_name, func_addr); > + } > + static inline void rtld_pg_printf_ret(const char* ret_type, > + int ret_size, > + void* ret) > + { > + const unsigned char* p = ret; > + int i; > + printf (" rt] %s(%d) = ", ret_type, ret_size); > + for (i = 0; i < ret_size; ++i, ++p) printf ("%02x", (unsigned int) > *p); > + printf ("\n"); > + } > + CODE > + > + [printf-generator-headers] > + header = "#include <stdio.h>" > + > +The trace linker generates C code with a wrapper for each function to be > +instrumented. The trace code generated is driven by the configuration INI > files. > + > +Development > +=========== > + > +The Trace Linker is part of the RTEMS tools git repository available at : > +https://git.rtems.org/rtems-tools > +The RTEMS tools project utilizes the waf build system. Use the following > +commands in the topmost build directory to build the tools project: > + > +First we configure using: > + > +.. code-block:: shell > + > + $./waf configure --prefix=$HOME/development/rtems/5 > + > +Then we build and install using: > + > +.. code-block:: shell > + > + $./waf build install > -- > 2.7.4 > >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel