[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH] doc: Update tracepoint section under debugging



Updates the debugging documentation: tracepoints

Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
 doc/guides/developers-debugging.rst | 185 ++++++++++++++--------------
 1 file changed, 95 insertions(+), 90 deletions(-)

diff --git a/doc/guides/developers-debugging.rst 
b/doc/guides/developers-debugging.rst
index 49207397..b80a39b0 100644
--- a/doc/guides/developers-debugging.rst
+++ b/doc/guides/developers-debugging.rst
@@ -100,105 +100,129 @@ You should be also able to use the debugging file
 image.
 
 ============================
-Trace points
+Tracepoints
 ============================
 
 ----------------------------
 Dependencies
 ----------------------------
-The file ``support/scripts/uk_trace/trace.py`` depends on the click
-and tabulate Python modules; you can install them by running: ::
+We provide some tools to read and export trace data that were collected with
+Unikraft's tracepoint system. The tools depend on Python3, as well as the
+`click` and `tabulate` modules. You can install them by running
+(Debian/Ubuntu):
 
-  sudo apt-get install python3-click python3-tabulate
+.. code-block:: sh
 
-Or, you can install trace.py into a local virtual environment: ::
+  sudo apt-get install python3 python3-click python3-tabulate
 
-  python3 -m venv env
-  . env/bin/activate
-  cd support/scripts/uk_trace
-  pip install --upgrade pip setuptools wheel
-  pip install --editable .
-  deactivate
-  cd -
+----------------
+Enabling Tracing
+----------------
+Tracepoints are provided by `lib/ukdebug`. To enable Unikraft to collect
+trace data, enable the option ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` in your
+configuration (via ``make menuconfig`` under `Library Configuration` ->
+`ukdebug` -> `Enable tracepoints`).
 
-All the dependencies will be installed in the 'env' folder, not
-your machine. You do not have to enter your virtual environment, you
-can call the installed script directly: ::
+The configuration option ``CONFIG_LIBUKDEBUG_ALL_TRACEPOINTS`` activates
+**all** existing tracepoints. Because tracepoints may noticeably
+affect performance, you can alternatively enable tracepoints only for
+compilation units that you are interested in.
 
-  env/bin/uk-trace --help
+This can be done with the ``Makefile.uk`` of each library:
 
-Because of the ``--editable`` flag, any modifications made to
-``support/scripts/uk_trace/trace.py`` will be reflected in the
-installed file.
+.. code-block:: make
 
-----------------------------
-Reading Tracepoints
-----------------------------
+   # Enable tracepoints for a whole library
+   LIBNAME_CFLAGS-y += -DUK_DEBUG_TRACE
+   LIBNAME_CXXFLAGS-y += -DUK_DEBUG_TRACE
 
-Tracepoints are provided by ``libukdebug``. To make Unikraft collect
-tracing data, enable the option ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` in your
-config (via ``make menuconfig``).
+   # Alternatively, enable tracepoints of source files you are interested in
+   LIBNAME_FILENAME1_FLAGS-y += -DUK_DEBUG_TRACE
+   LIBNAME_FILENAME2_FLAGS-y += -DUK_DEBUG_TRACE
 
-Because tracepoints can noticeably affect performance, selective
-enabling is implemented. The ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` option
-just enables the functionality, but all the tracepoints are compiled
-into nothing by default (i.e., they have no effect). If you would like
-a library to collect tracing data, add the following to its Makefile.uk: ::
+This can also be done by defining ``UK_DEBUG_TRACE`` in the head of your source
+file(s). Please make sure that ``UK_DEBUG_TRACE`` is defined **before**
+``<uk/trace.h>`` is included:
 
-.. code-block:: make
+.. code-block:: c
 
-   LIBAPPNAME_CFLAGS += -DUK_DEBUG_TRACE
+   #ifndef UK_DEBUG_TRACE
+   #define UK_DEBUG_TRACE
+   #endif
 
-If you need just the information about tracepoints in one file, define
-``UK_DEBUG_TRACE`` **before** ``#include <uk/trace.h>``.
+   #include <uk/trace.h>
 
-If you wish to enable **ALL** existing tracepoints, enable
-``CONFIG_LIBUKDEBUG_ALL_TRACEPOINTS`` in menuconfig.
+As soon as tracing is enabled, Unikraft will store samples of each enabled
+tracepoint into an internal trace buffer. Currently this is not a circular
+buffer. This means that as soon as it is full, Unikraft will stop collecting
+further samples.
 
-When tracing is enabled, Unikraft will write samples into an internal
-trace buffer. Currently this is not a circular buffer, so as soon as
-it overflows, Unikraft will stop collecting data.
+------------------
+Reading Trace Data
+------------------
+Unikraft is storing trace data to an internal buffer that resides in the
+guest's main memory. You can use `gdb` to read and export it.
+For this purpose, you will need to load ``uk-gdb.py`` helper into your
+`gdb` session. It adds additional commands that allow you to list and store
+the trace data. We recommend to automatically load the script to `gdb`.
+For this purpose, add the following line to your
+``~/.gdbinit``: ::
 
-To read the collected data you have 2 options:
+  source /path/to/your/build/uk-gdb.py
 
-1. Use gdb
+In order to collect the data, open `gdb` with the debug image and connect to
+your Unikraft instance as described in Section :ref:`Using GDB`:
 
-2. Use trace.py
+.. code-block:: sh
 
-For the first option, you need the 'uk-gdb.py' helper loaded into the
-gdb session. To make this happen all you need to do is add the
-following line into ~/.gdbinit: ::
+  gdb helloworld/build/helloworld_kvm-x86_64.dbg
 
-  add-auto-load-safe-path /path/to/your/build/directory
+.. note:: The ``.dbg`` image is required because it contains offline data 
needed
+          for parsing the trace buffer.
 
-With this, gdb will load the helper automatically each time you start gdb
-with a \*.dbg image. For example ::
+As soon as you let run your guest, samples should be stored in Unikraft's trace
+buffer. You can print them by issuing the `gdb` command ``uk trace``: ::
 
-  gdb helloworld/build/helloworld_kvm-x86_64.dbg
+  (gdb) uk trace
 
-Now you can print the tracing log by issuing the command ``uk
-trace``. Alternatively, you can save all trace data into a binary file
-with ``uk trace save <filename>``. This tracefile can be processed
-later offline using the trace.py script: ::
+Alternatively, you can save all trace data to disk with
+``uk trace save <filename>``: ::
 
-  support/scripts/uk_trace/trace.py list <filename>
+  (gdb) uk save traces.dat
 
-Which brings us to the second option: trace.py can run gdb and fetch
-the tracefile for you. Just run: ::
+.. note:: It may make sense to connect with `gdb` after the guest execution has
+         been finished (and the trace buffer got filled). For this purpose,
+         make sure that your hypervisor is not destroying the instance after
+         guest shut down (on `qemu`, add ``--no-shutdown`` and ``--no-reboot``
+         parameters).
 
-  support/scripts/uk_trace/trace.py fetch  <your_unikraft_image>.dbg
+.. note:: If you are seeing the error message
+         ``Error getting the trace buffer. Is tracing enabled?``, you
+         probably did not enable tracing or Unikraft's trace buffer is
+         empty. This can happen when no tracepoint was ever called.
 
-.. note:: The \*.dbg image is required, as it have offline data needed
-          for parsing the trace buffer.
 
-----------------------------
-Adding your tracepoints
-----------------------------
-Bellow is a snippet for using tracepoints:
+Any saved trace file can be later processed with the ``trace.py`` script.
+In our example:
+
+.. code-block:: sh
+
+  support/scripts/uk_trace/trace.py list traces.dat
+
+--------------------
+Creating Tracepoints
+--------------------
+Instrumenting your code with tracepoints is done by two steps. First, you 
define
+and register a tracepoint handler with the ``UK_TRACEPOINT()`` macro.
+Second, you place calls to the generated handler at those places in your code
+where your want to trace an event:
 
 .. code-block:: c
 
+  #include <uk/trace.h>
+
   UK_TRACEPOINT(trace_vfs_open, "\"%s\" 0x%x 0%0o", const char*, int, mode_t);
+
   int open(const char *pathname, int flags, ...)
   {
        trace_vfs_open(pathname, flags, mode);
@@ -208,30 +232,11 @@ Bellow is a snippet for using tracepoints:
        return 0;
   }
 
-The macro ``UK_TRACEPOINT(trace_name, fmt, type1, type2, ... typeN)``
-generates a static function `trace_name()`, accepting N parameters of
-types **type1**, **type2** and so on. Up to 7 parameters are supported. The
-**fmt** is a printf-style format which will be used to form a message
-corresponding to the trace sample.
-
-The **fmt** is static and stored offline. Only parameter values are
-saved on the trace buffer. It is the job of the offline parser to
-match them together and print out resulting messages.
-
-Now you can call the generated function from the point of
-interest. You are expected to call one tracepoint from exactly one
-place in your code.
-
-----------------------------
-Troubleshooting
-----------------------------
-If you are getting the message::
-
-  Error getting the trace buffer. Is tracing enabled?
-
-This might be because:
-
-1. You indeed need to enable tracing.
-
-2. Not a single tracepoint has been called, and dead-code elimination
-   removed (rightfully) the tracing functionality.
+``UK_TRACEPOINT(trace_name, fmt, type1, type2, ... typeN)`` generates
+the handler ``trace_name()`` (static function). It will accept up
+to 7 parameters of type ``type1``, ``type2``, etc. The given format string
+``fmt`` is a `printf`-style format which will be used to create meaningful
+messages based on the collected trace parameters. This format string is
+only kept in the debug image and is used by the tools to read and parse the
+trace data. Unikraft's trace buffer stores for each sample a timestamp,
+the name of the tracepoint, and the given parameters.
-- 
2.20.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.