Variable Formatting
===================

.. contents::
   :local:

LLDB has a data formatters subsystem that allows users to define custom display
options for their variables.

Usually, when you type frame variable or run some expression LLDB will
automatically choose the way to display your results on a per-type basis, as in
the following example:

::

   (lldb) frame variable
   (uint8_t) x = 'a'
   (intptr_t) y = 124752287

However, in certain cases, you may want to associate a different style to the display for certain datatypes. To do so, you need to give hints to the debugger
as to how variables should be displayed. The LLDB type command allows you to do
just that.

Using it you can change your visualization to look like this:

::

   (lldb) frame variable
   (uint8_t) x = chr='a' dec=65 hex=0x41
   (intptr_t) y = 0x76f919f

There are several features related to data visualization: formats, summaries,
filters, synthetic children.

To reflect this, the type command has five subcommands:

::

   type format
   type summary
   type filter
   type synthetic
   type category

These commands are meant to bind printing options to types. When variables are
printed, LLDB will first check if custom printing options have been associated
to a variable's type and, if so, use them instead of picking the default
choices.

Each of the commands (except ``type category``) has four subcommands available:

- ``add``: associates a new printing option to one or more types
- ``delete``: deletes an existing association
- ``list``: provides a listing of all associations
- ``clear``: deletes all associations

Type Format
-----------

Type formats enable you to quickly override the default format for displaying
primitive types (the usual basic C/C++/ObjC types: int, float, char, ...).

If for some reason you want all int variables in your program to print out as
hex, you can add a format to the int type.

This is done by typing

::

   (lldb) type format add --format hex int

at the LLDB command line.

The ``--format`` (which you can shorten to -f) option accepts a :doc:`format
name<formatting>`. Then, you provide one or more types to which you want the
new format applied.

A frequent scenario is that your program has a typedef for a numeric type that
you know represents something that must be printed in a certain way. Again, you
can add a format just to that typedef by using type format add with the name
alias.

But things can quickly get hierarchical. Let's say you have a situation like
the following:

::

   typedef int A;
   typedef A B;
   typedef B C;
   typedef C D;

and you want to show all A's as hex, all C's as byte arrays and leave the
defaults untouched for other types (albeit its contrived look, the example is
far from unrealistic in large software systems).

If you simply type

::

   (lldb) type format add -f hex A
   (lldb) type format add -f uint8_t[] C

values of type B will be shown as hex and values of type D as byte arrays, as in:

::

   (lldb) frame variable -T
   (A) a = 0x00000001
   (B) b = 0x00000002
   (C) c = {0x03 0x00 0x00 0x00}
   (D) d = {0x04 0x00 0x00 0x00}

This is because by default LLDB cascades formats through typedef chains. In
order to avoid that you can use the option -C no to prevent cascading, thus
making the two commands required to achieve your goal:

::

   (lldb) type format add -C no -f hex A
   (lldb) type format add -C no -f uint8_t[] C


which provides the desired output:

::

   (lldb) frame variable -T
   (A) a = 0x00000001
   (B) b = 2
   (C) c = {0x03 0x00 0x00 0x00}
   (D) d = 4

Note, that qualifiers such as const and volatile will be stripped when matching types for example:

::

   (lldb) frame var x y z
   (int) x = 1
   (const int) y = 2
   (volatile int) z = 4
   (lldb) type format add -f hex int
   (lldb) frame var x y z
   (int) x = 0x00000001
   (const int) y = 0x00000002
   (volatile int) z = 0x00000004

Two additional options that you will want to look at are --skip-pointers (-p)
and --skip-references (-r). These two options prevent LLDB from applying a
format for type T to values of type T* and T& respectively.

::

   (lldb) type format add -f float32[] int
   (lldb) frame variable pointer *pointer -T
   (int *) pointer = {1.46991e-39 1.4013e-45}
   (int) *pointer = {1.53302e-42}
   (lldb) type format add -f float32[] int -p
   (lldb) frame variable pointer *pointer -T
   (int *) pointer = 0x0000000100100180
   (int) *pointer = {1.53302e-42}

While they can be applied to pointers and references, formats will make no
attempt to dereference the pointer and extract the value before applying the
format, which means you are effectively formatting the address stored in the
pointer rather than the pointee value. For this reason, you may want to use the
-p option when defining formats.

If you need to delete a custom format simply type type format delete followed
by the name of the type to which the format applies.Even if you defined the
same format for multiple types on the same command, type format delete will
only remove the format for the type name passed as argument.

To delete ALL formats, use ``type format clear``. To see all the formats
defined, use type format list.

If all you need to do, however, is display one variable in a custom format,
while leaving the others of the same type untouched, you can simply type:

::

   (lldb) frame variable counter -f hex

This has the effect of displaying the value of counter as an hexadecimal
number, and will keep showing it this way until you either pick a different
format or till you let your program run again.

Finally, this is a list of formatting options available out of which you can
pick:

+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| **Format name**                               | **Abbreviation** | **Description**                                                          |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``default``                                   |                  | the default LLDB algorithm is used to pick a format                      |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``boolean``                                   | B                | show this as a true/false boolean, using the customary rule that 0 is    |
|                                               |                  | false and everything else is true                                        |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``binary``                                    | b                | show this as a sequence of bits                                          |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``bytes``                                     | y                | show the bytes one after the other                                       |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``bytes with ASCII``                          | Y                | show the bytes, but try to display them as ASCII characters as well      |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``character``                                 | c                | show the bytes as ASCII characters                                       |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``printable character``                       | C                | show the bytes as printable ASCII characters                             |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``complex float``                             | F                | interpret this value as the real and imaginary part of a complex         |
|                                               |                  | floating-point number                                                    |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``c-string``                                  | s                | show this as a 0-terminated C string                                     |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``decimal``                                   | d                | show this as a signed integer number (this does not perform a cast, it   |
|                                               |                  | simply shows the bytes as  an integer with sign)                         |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``enumeration``                               | E                | show this as an enumeration, printing the                                |
|                                               |                  | value's name if available or the integer value otherwise                 |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``hex``                                       | x                | show this as in hexadecimal notation (this does                          |
|                                               |                  | not perform a cast, it simply shows the bytes as hex)                    |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``float``                                     | f                | show this as a floating-point number (this does not perform a cast, it   |
|                                               |                  | simply interprets the bytes as an IEEE754 floating-point value)          |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``octal``                                     | o                | show this in octal notation                                              |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``OSType``                                    | O                | show this as a MacOS OSType                                              |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``unicode16``                                 | U                | show this as UTF-16 characters                                           |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``unicode32``                                 |                  | show this as UTF-32 characters                                           |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``unsigned decimal``                          | u                | show this as an unsigned integer number (this does not perform a cast,   |
|                                               |                  | it simply shows the bytes as unsigned integer)                           |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``pointer``                                   | p                | show this as a native pointer (unless this is really a pointer, the      |
|                                               |                  | resulting address will probably be invalid)                              |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``char[]``                                    |                  | show this as an array of characters                                      |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``int8_t[], uint8_t[]``                       |                  | show this as an array of the corresponding integer type                  |
| ``int16_t[], uint16_t[]``                     |                  |                                                                          |
| ``int32_t[], uint32_t[]``                     |                  |                                                                          |
| ``int64_t[], uint64_t[]``                     |                  |                                                                          |
| ``uint128_t[]``                               |                  |                                                                          |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``float32[], float64[]``                      |                  | show this as an array of the corresponding                               |
|                                               |                  |                       floating-point type                                |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``complex integer``                           | I                | interpret this value as the real and imaginary part of a complex integer |
|                                               |                  | number                                                                   |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``character array``                           | a                | show this as a character array                                           |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``address``                                   | A                | show this as an address target (symbol/file/line + offset), possibly     |
|                                               |                  | also the string this address is pointing to                              |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``hex float``                                 |                  | show this as hexadecimal floating point                                  |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``instruction``                               | i                | show this as an disassembled opcode                                      |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+
| ``void``                                      | v                | don't show anything                                                      |
+-----------------------------------------------+------------------+--------------------------------------------------------------------------+

Type Summary
------------

Type formats work by showing a different kind of display for the value of a
variable. However, they only work for basic types. When you want to display a
class or struct in a custom format, you cannot do that using formats.

A different feature, type summaries, works by extracting information from
classes, structures, ... (aggregate types) and arranging it in a user-defined
format, as in the following example:

before adding a summary...

::

   (lldb) frame variable -T one
   (i_am_cool) one = {
      (int) x = 3
      (float) y = 3.14159
      (char) z = 'E'
   }

after adding a summary...

::

   (lldb) frame variable one
   (i_am_cool) one = int = 3, float = 3.14159, char = 69

There are two ways to use type summaries: the first one is to bind a summary
string to the type; the second is to write a Python script that returns the
string to be used as summary. Both options are enabled by the type summary add
command.

The command to obtain the output shown in the example is:

::

(lldb) type summary add --summary-string "int = ${var.x}, float = ${var.y}, char = ${var.z%u}" i_am_cool

Initially, we will focus on summary strings, and then describe the Python
binding mechanism.

Summary Strings
---------------

Summary strings are written using a simple control language, exemplified by the
snippet above. A summary string contains a sequence of tokens that are
processed by LLDB to generate the summary.

Summary strings can contain plain text, control characters and special
variables that have access to information about the current object and the
overall program state.

Plain text is any sequence of characters that doesn't contain a ``{``, ``}``, ``$``,
or ``\`` character, which are the syntax control characters.

The special variables are found in between a "${" prefix, and end with a "}"
suffix. Variables can be a simple name or they can refer to complex objects
that have subitems themselves. In other words, a variable looks like
``${object}`` or ``${object.child.otherchild}``. A variable can also be
prefixed or suffixed with other symbols meant to change the way its value is
handled. An example is ``${*var.int_pointer[0-3]}``.

Basically, the syntax is the same one described Frame and Thread Formatting
plus additional symbols specific for summary strings. The main of them is
${var, which is used refer to the variable that a summary is being created for.

The simplest thing you can do is grab a member variable of a class or structure
by typing its expression path. In the previous example, the expression path for
the field float y is simply .y. Thus, to ask the summary string to display y
you would type ${var.y}.

If you have code like the following:

::

   struct A {
      int x;
      int y;
   };
   struct B {
      A x;
      A y;
      int *z;
   };

the expression path for the y member of the x member of an object of type B
would be .x.y and you would type ``${var.x.y}`` to display it in a summary
string for type B.

By default, a summary defined for type T, also works for types T* and T& (you
can disable this behavior if desired). For this reason, expression paths do not
differentiate between . and ->, and the above expression path .x.y would be
just as good if you were displaying a B*, or even if the actual definition of B
were:

::

   struct B {
      A *x;
      A y;
      int *z;
   };

This is unlike the behavior of frame variable which, on the contrary, will
enforce the distinction. As hinted above, the rationale for this choice is that
waiving this distinction enables you to write a summary string once for type T
and use it for both T and T* instances. As a summary string is mostly about
extracting nested members' information, a pointer to an object is just as good
as the object itself for the purpose.

If you need to access the value of the integer pointed to by B::z, you cannot
simply say ${var.z} because that symbol refers to the pointer z. In order to
dereference it and get the pointed value, you should say ``${*var.z}``. The
``${*var`` tells LLDB to get the object that the expression paths leads to, and
then dereference it. In this example is it equivalent to ``*(bObject.z)`` in
C/C++ syntax. Because ``.`` and ``->`` operators can both be used, there is no
need to have dereferences in the middle of an expression path (e.g. you do not
need to type ``${*(var.x).x}``) to read A::x as contained in ``*(B::x)``. To
achieve that effect you can simply write ``${var.x->x}``, or even
``${var.x.x}``. The ``*`` operator only binds to the result of the whole
expression path, rather than piecewise, and there is no way to use parentheses
to change that behavior.

Of course, a summary string can contain more than one ${var specifier, and can
use ``${var`` and ``${*var`` specifiers together.

Formatting Summary Elements
---------------------------

An expression path can include formatting codes. Much like the type formats
discussed previously, you can also customize the way variables are displayed in
summary strings, regardless of the format they have applied to their types. To
do that, you can use %format inside an expression path, as in ${var.x->x%u},
which would display the value of x as an unsigned integer.

You can also use some other special format markers, not available for formats
themselves, but which carry a special meaning when used in this context:

+------------+--------------------------------------------------------------------------+
| **Symbol** | **Description**                                                          |
+------------+--------------------------------------------------------------------------+
| ``Symbol`` | ``Description``                                                          |
+------------+--------------------------------------------------------------------------+
| ``%S``     | Use this object's summary (the default for aggregate types)              |
+------------+--------------------------------------------------------------------------+
| ``%V``     | Use this object's value (the default for non-aggregate types)            |
+------------+--------------------------------------------------------------------------+
| ``%@``     | Use a language-runtime specific description (for C++ this does nothing,  |
|            |                     for Objective-C it calls the NSPrintForDebugger API) |
+------------+--------------------------------------------------------------------------+
| ``%L``     | Use this object's location (memory address, register name, ...)          |
+------------+--------------------------------------------------------------------------+
| ``%#``     | Use the count of the children of this object                             |
+------------+--------------------------------------------------------------------------+
| ``%T``     | Use this object's datatype name                                          |
+------------+--------------------------------------------------------------------------+
| ``%N``     | Print the variable's basename                                            |
+------------+--------------------------------------------------------------------------+
| ``%>``     | Print the expression path for this item                                  |
+------------+--------------------------------------------------------------------------+

Starting with SVN r228207, you can also specify
``${script.var:pythonFuncName}``. Previously, back to r220821, this was
specified with a different syntax: ``${var.script:pythonFuncName}``.

It is expected that the function name you use specifies a function whose
signature is the same as a Python summary function. The return string from the
function will be placed verbatim in the output.

You cannot use element access, or formatting symbols, in combination with this
syntax. For example the following:

::

   ${script.var.element[0]:myFunctionName%@}

is not valid and will cause the summary to fail to evaluate.


Element Inlining
----------------

Option --inline-children (-c) to type summary add tells LLDB not to look for a summary string, but instead to just print a listing of all the object's children on one line.

As an example, given a type pair:

::

   (lldb) frame variable --show-types a_pair
   (pair) a_pair = {
      (int) first = 1;
      (int) second = 2;
   }

If one types the following commands:

::

   (lldb) type summary add --inline-children pair

the output becomes:

::

   (lldb) frame variable a_pair
   (pair) a_pair = (first=1, second=2)


Of course, one can obtain the same effect by typing

::

   (lldb) type summary add pair --summary-string "(first=${var.first}, second=${var.second})"

While the final result is the same, using --inline-children can often save
time. If one does not need to see the names of the variables, but just their
values, the option --omit-names (-O, uppercase letter o), can be combined with
--inline-children to obtain:

::

   (lldb) frame variable a_pair
   (pair) a_pair = (1, 2)

which is of course the same as typing

::

   (lldb) type summary add pair --summary-string "(${var.first}, ${var.second})"

Bitfields And Array Syntax
--------------------------

Sometimes, a basic type's value actually represents several different values
packed together in a bitfield.

With the classical view, there is no way to look at them. Hexadecimal display
can help, but if the bits actually span nibble boundaries, the help is limited.

Binary view would show it all without ambiguity, but is often too detailed and
hard to read for real-life scenarios.

To cope with the issue, LLDB supports native bitfield formatting in summary
strings. If your expression paths leads to a so-called scalar type (the usual
int, float, char, double, short, long, long long, double, long double and
unsigned variants), you can ask LLDB to only grab some bits out of the value
and display them in any format you like. If you only need one bit you can use
the [n], just like indexing an array. To extract multiple bits, you can use a
slice-like syntax: [n-m], e.g.

::

   (lldb) frame variable float_point
   (float) float_point = -3.14159

::

   (lldb) type summary add --summary-string "Sign: ${var[31]%B} Exponent: ${var[30-23]%x} Mantissa: ${var[0-22]%u}" float
   (lldb) frame variable float_point
   (float) float_point = -3.14159 Sign: true Exponent: 0x00000080 Mantissa: 4788184

In this example, LLDB shows the internal representation of a float variable by
extracting bitfields out of a float object.

When typing a range, the extremes n and m are always included, and the order of
the indices is irrelevant.

LLDB also allows to use a similar syntax to display array members inside a summary string. For instance, you may want to display all arrays of a given type using a more compact notation than the default, and then just delve into individual array members that prove interesting to your debugging task. You can tell LLDB to format arrays in special ways, possibly independent of the way the array members' datatype is formatted.
e.g.

::

   (lldb) frame variable sarray
   (Simple [3]) sarray = {
      [0] = {
         x = 1
         y = 2
         z = '\x03'
      }
      [1] = {
         x = 4
         y = 5
         z = '\x06'
      }
      [2] = {
         x = 7
         y = 8
         z = '\t'
      }
   }

   (lldb) type summary add --summary-string "${var[].x}" "Simple [3]"

   (lldb) frame variable sarray
   (Simple [3]) sarray = [1,4,7]

The [] symbol amounts to: if var is an array and I know its size, apply this summary string to every element of the array. Here, we are asking LLDB to display .x for every element of the array, and in fact this is what happens. If you find some of those integers anomalous, you can then inspect that one item in greater detail, without the array format getting in the way:

::

   (lldb) frame variable sarray[1]
   (Simple) sarray[1] = {
      x = 4
      y = 5
      z = '\x06'
   }

You can also ask LLDB to only print a subset of the array range by using the
same syntax used to extract bit for bitfields:

::

   (lldb) type summary add --summary-string "${var[1-2].x}" "Simple [3]"

   (lldb) frame variable sarray
   (Simple [3]) sarray = [4,7]

If you are dealing with a pointer that you know is an array, you can use this
syntax to display the elements contained in the pointed array instead of just
the pointer value. However, because pointers have no notion of their size, the
empty brackets [] operator does not work, and you must explicitly provide
higher and lower bounds.

In general, LLDB needs the square brackets ``operator []`` in order to handle
arrays and pointers correctly, and for pointers it also needs a range. However,
a few special cases are defined to make your life easier:

you can print a 0-terminated string (C-string) using the %s format, omitting
square brackets, as in:

::

   (lldb) type summary add --summary-string "${var%s}" "char *"

This syntax works for char* as well as for char[] because LLDB can rely on the
final \0 terminator to know when the string has ended.

LLDB has default summary strings for char* and char[] that use this special
case. On debugger startup, the following are defined automatically:

::

   (lldb) type summary add --summary-string "${var%s}" "char *"
   (lldb) type summary add --summary-string "${var%s}" -x "char \[[0-9]+]"

any of the array formats (int8_t[], float32{}, ...), and the y, Y and a formats
work to print an array of a non-aggregate type, even if square brackets are
omitted.

::

   (lldb) type summary add --summary-string "${var%int32_t[]}" "int [10]"

This feature, however, is not enabled for pointers because there is no way for
LLDB to detect the end of the pointed data.

This also does not work for other formats (e.g. boolean), and you must specify
the square brackets operator to get the expected output.

Python Scripting
----------------

Most of the times, summary strings prove good enough for the job of summarizing
the contents of a variable. However, as soon as you need to do more than
picking some values and rearranging them for display, summary strings stop
being an effective tool. This is because summary strings lack the power to
actually perform any kind of computation on the value of variables.

To solve this issue, you can bind some Python scripting code as a summary for
your datatype, and that script has the ability to both extract children
variables as the summary strings do and to perform active computation on the
extracted values. As a small example, let's say we have a Rectangle class:

::


   class Rectangle
   {
   private:
      int height;
      int width;
   public:
      Rectangle() : height(3), width(5) {}
      Rectangle(int H) : height(H), width(H*2-1) {}
      Rectangle(int H, int W) : height(H), width(W) {}
      int GetHeight() { return height; }
      int GetWidth() { return width; }
   };

Summary strings are effective to reduce the screen real estate used by the
default viewing mode, but are not effective if we want to display the area and
perimeter of Rectangle objects

To obtain this, we can simply attach a small Python script to the Rectangle
class, as shown in this example:

::

   (lldb) type summary add -P Rectangle
   Enter your Python command(s). Type 'DONE' to end.
   def function (valobj,internal_dict,options):
      height_val = valobj.GetChildMemberWithName('height')
      width_val = valobj.GetChildMemberWithName('width')
      height = height_val.GetValueAsUnsigned(0)
      width = width_val.GetValueAsUnsigned(0)
      area = height*width
      perimeter = 2*(height + width)
      return 'Area: ' + str(area) + ', Perimeter: ' + str(perimeter)
      DONE
   (lldb) frame variable
   (Rectangle) r1 = Area: 20, Perimeter: 18
   (Rectangle) r2 = Area: 72, Perimeter: 36
   (Rectangle) r3 = Area: 16, Perimeter: 16

In order to write effective summary scripts, you need to know the LLDB public
API, which is the way Python code can access the LLDB object model. For further
details on the API you should look at the LLDB API reference documentation.


As a brief introduction, your script is encapsulated into a function that is
passed two parameters: ``valobj`` and ``internal_dict``.

``internal_dict`` is an internal support parameter used by LLDB and you should
not touch it.

``valobj`` is the object encapsulating the actual variable being displayed, and
its type is `SBValue`. Out of the many possible operations on an `SBValue`, the
basic one is retrieve the children objects it contains (essentially, the fields
of the object wrapped by it), by calling ``GetChildMemberWithName()``, passing
it the child's name as a string.

If the variable has a value, you can ask for it, and return it as a string
using ``GetValue()``, or as a signed/unsigned number using
``GetValueAsSigned()``, ``GetValueAsUnsigned()``. It is also possible to
retrieve an `SBData` object by calling ``GetData()`` and then read the object's
contents out of the `SBData`.

If you need to delve into several levels of hierarchy, as you can do with
summary strings, you can use the method ``GetValueForExpressionPath()``,
passing it an expression path just like those you could use for summary strings
(one of the differences is that dereferencing a pointer does not occur by
prefixing the path with a ``*```, but by calling the ``Dereference()`` method
on the returned `SBValue`). If you need to access array slices, you cannot do
that (yet) via this method call, and you must use ``GetChildAtIndex()``
querying it for the array items one by one. Also, handling custom formats is
something you have to deal with on your own.

``options`` Python summary formatters can optionally define this
third argument, which is an object of type ``lldb.SBTypeSummaryOptions``,
allowing for a few customizations of the result. The decision to
adopt or not this third argument - and the meaning of options 
thereof - is up to the individual formatter's writer.

Other than interactively typing a Python script there are two other ways for
you to input a Python script as a summary:

- using the --python-script option to type summary add and typing the script
  code as an option argument; as in:

::

   (lldb) type summary add --python-script "height = valobj.GetChildMemberWithName('height').GetValueAsUnsigned(0);width = valobj.GetChildMemberWithName('width').GetValueAsUnsigned(0); return 'Area: %d' % (height*width)" Rectangle


- using the --python-function (-F) option to type summary add and giving the
  name of a Python function with the correct prototype. Most probably, you will
  define (or have already defined) the function in the interactive interpreter,
  or somehow loaded it from a file, using the command script import command.
  LLDB will emit a warning if it is unable to find the function you passed, but
  will still register the binding.

Regular Expression Typenames
----------------------------

As you noticed, in order to associate the custom summary string to the array
types, one must give the array size as part of the typename. This can long
become tiresome when using arrays of different sizes, Simple [3], Simple [9],
Simple [12], ...

If you use the -x option, type names are treated as regular expressions instead
of type names. This would let you rephrase the above example for arrays of type
Simple [3] as:

::
   (lldb) type summary add --summary-string "${var[].x}" -x "Simple \[[0-9]+\]"
   (lldb) frame variable
   (Simple [3]) sarray = [1,4,7]
   (Simple [2]) sother = [3,6]

The above scenario works for Simple [3] as well as for any other array of
Simple objects.

While this feature is mostly useful for arrays, you could also use regular
expressions to catch other type sets grouped by name. However, as regular
expression matching is slower than normal name matching, LLDB will first try to
match by name in any way it can, and only when this fails, will it resort to
regular expression matching.

One of the ways LLDB uses this feature internally, is to match the names of STL
container classes, regardless of the template arguments provided. The details
for this are found at FormatManager.cpp

The regular expression language used by LLDB is the POSIX extended language, as
defined by the Single UNIX Specification, of which macOS is a compliant
implementation.

Names Summaries
---------------

For a given type, there may be different meaningful summary representations.
However, currently, only one summary can be associated to a type at each
moment. If you need to temporarily override the association for a variable,
without changing the summary string for to its type, you can use named
summaries.

Named summaries work by attaching a name to a summary when creating it. Then,
when there is a need to attach the summary to a variable, the frame variable
command, supports a --summary option that tells LLDB to use the named summary
given instead of the default one.

::

   (lldb) type summary add --summary-string "x=${var.integer}" --name NamedSummary
   (lldb) frame variable one
   (i_am_cool) one = int = 3, float = 3.14159, char = 69
   (lldb) frame variable one --summary NamedSummary
   (i_am_cool) one = x=3

When defining a named summary, binding it to one or more types becomes
optional. Even if you bind the named summary to a type, and later change the
summary string for that type, the named summary will not be changed by that.
You can delete named summaries by using the type summary delete command, as if
the summary name was the datatype that the summary is applied to

A summary attached to a variable using the --summary option, has the same
semantics that a custom format attached using the -f option has: it stays
attached till you attach a new one, or till you let your program run again.

Synthetic Children
------------------

Summaries work well when one is able to navigate through an expression path. In
order for LLDB to do so, appropriate debugging information must be available.

Some types are opaque, i.e. no knowledge of their internals is provided. When
that's the case, expression paths do not work correctly.

In other cases, the internals are available to use in expression paths, but
they do not provide a user-friendly representation of the object's value.

For instance, consider an STL vector, as implemented by the GNU C++ Library:

::

   (lldb) frame variable numbers -T
   (std::vector<int>) numbers = {
      (std::_Vector_base<int, std::allocator<int> >) std::_Vector_base<int, std::allocator<int> > = {
         (std::_Vector_base<int, std::allocator&tl;int> >::_Vector_impl) _M_impl = {
               (int *) _M_start = 0x00000001001008a0
               (int *) _M_finish = 0x00000001001008a8
               (int *) _M_end_of_storage = 0x00000001001008a8
         }
      }
   }

Here, you can see how the type is implemented, and you can write a summary for
that implementation but that is not going to help you infer what items are
actually stored in the vector.

What you would like to see is probably something like:

::

   (lldb) frame variable numbers -T
   (std::vector<int>) numbers = {
      (int) [0] = 1
      (int) [1] = 12
      (int) [2] = 123
      (int) [3] = 1234
   }

Synthetic children are a way to get that result.

The feature is based upon the idea of providing a new set of children for a
variable that replaces the ones available by default through the debug
information. In the example, we can use synthetic children to provide the
vector items as children for the std::vector object.

In order to create synthetic children, you need to provide a Python class that
adheres to a given interface (the word is italicized because Python has no
explicit notion of interface, by that word we mean a given set of methods must
be implemented by the Python class):

.. code-block:: python

   class SyntheticChildrenProvider:
      def __init__(self, valobj, internal_dict):
         this call should initialize the Python object using valobj as the variable to provide synthetic children for
      def num_children(self):
         this call should return the number of children that you want your object to have
      def get_child_index(self,name):
         this call should return the index of the synthetic child whose name is given as argument
      def get_child_at_index(self,index):
         this call should return a new LLDB SBValue object representing the child at the index given as argument
      def update(self):
         this call should be used to update the internal state of this Python object whenever the state of the variables in LLDB changes.[1]
      def has_children(self):
         this call should return True if this object might have children, and False if this object can be guaranteed not to have children.[2]
      def get_value(self):
         this call can return an SBValue to be presented as the value of the synthetic value under consideration.[3]

[1] This method is optional. Also, it may optionally choose to return a value
(starting with SVN rev153061/LLDB-134). If it returns a value, and that value
is True, LLDB will be allowed to cache the children and the children count it
previously obtained, and will not return to the provider class to ask. If
nothing, None, or anything other than True is returned, LLDB will discard the
cached information and ask. Regardless, whenever necessary LLDB will call
update.

[2] This method is optional (starting with SVN rev166495/LLDB-175). While
implementing it in terms of num_children is acceptable, implementors are
encouraged to look for optimized coding alternatives whenever reasonable.

[3] This method is optional (starting with SVN revision 219330). The `SBValue`
you return here will most likely be a numeric type (int, float, ...) as its
value bytes will be used as-if they were the value of the root `SBValue` proper.
As a shortcut for this, you can inherit from lldb.SBSyntheticValueProvider, and
just define get_value as other methods are defaulted in the superclass as
returning default no-children responses.

If a synthetic child provider supplies a special child named
``$$dereference$$`` then it will be used when evaluating ``operator *`` and
``operator ->`` in the frame variable command and related SB API
functions. It is possible to declare this synthetic child without
including it in the range of children displayed by LLDB. For example,
this subset of a synthetic children provider class would allow the
synthetic value to be dereferenced without actually showing any
synthtic children in the UI:

.. code-block:: python

      class SyntheticChildrenProvider:
          [...]
          def num_children(self):
              return 0
          def get_child_index(self, name):
              if name == '$$dereference$$':
                  return 0
              return -1
          def get_child_at_index(self, index):
              if index == 0:
                  return <valobj resulting from dereference>
              return None


For examples of how synthetic children are created, you are encouraged to look
at examples/synthetic in the LLDB trunk. Please, be aware that the code in
those files (except bitfield/) is legacy code and is not maintained. You may
especially want to begin looking at this example to get a feel for this
feature, as it is a very easy and well commented example.

The design pattern consistently used in synthetic providers shipping with LLDB
is to use the __init__ to store the `SBValue` instance as a part of self. The
update function is then used to perform the actual initialization. Once a
synthetic children provider is written, one must load it into LLDB before it
can be used. Currently, one can use the LLDB script command to type Python code
interactively, or use the command script import fileName command to load Python
code from a Python module (ordinary rules apply to importing modules this way).
A third option is to type the code for the provider class interactively while
adding it.

For example, let's pretend we have a class Foo for which a synthetic children
provider class Foo_Provider is available, in a Python module contained in file
~/Foo_Tools.py. The following interaction sets Foo_Provider as a synthetic
children provider in LLDB:

::

   (lldb) command script import ~/Foo_Tools.py
   (lldb) type synthetic add Foo --python-class Foo_Tools.Foo_Provider
   (lldb) frame variable a_foo
   (Foo) a_foo = {
      x = 1
      y = "Hello world"
   }

LLDB has synthetic children providers for a core subset of STL classes, both in
the version provided by libstdcpp and by libcxx, as well as for several
Foundation classes.

Synthetic children extend summary strings by enabling a new special variable:
``${svar``.

This symbol tells LLDB to refer expression paths to the synthetic children
instead of the real ones. For instance,

::

   (lldb) type summary add --expand -x "std::vector<" --summary-string "${svar%#} items"
   (lldb) frame variable numbers
   (std::vector<int>) numbers = 4 items {
      (int) [0] = 1
      (int) [1] = 12
      (int) [2] = 123
      (int) [3] = 1234
   }

In some cases, if LLDB is unable to use the real object to get a child
specified in an expression path, it will automatically refer to the synthetic
children. While in summaries it is best to always use ${svar to make your
intentions clearer, interactive debugging can benefit from this behavior, as
in:

::

   (lldb) frame variable numbers[0] numbers[1]
   (int) numbers[0] = 1
   (int) numbers[1] = 12

Unlike many other visualization features, however, the access to synthetic
children only works when using frame variable, and is not supported in
expression:

::

   (lldb) expression numbers[0]
   Error [IRForTarget]: Call to a function '_ZNSt33vector<int, std::allocator<int> >ixEm' that is not present in the target
   error: Couldn't convert the expression to DWARF

The reason for this is that classes might have an overloaded ``operator []``,
or other special provisions and the expression command chooses to ignore
synthetic children in the interest of equivalency with code you asked to have
compiled from source.

Filters
-------

Filters are a solution to the display of complex classes. At times, classes
have many member variables but not all of these are actually necessary for the
user to see.

A filter will solve this issue by only letting the user see those member
variables they care about. Of course, the equivalent of a filter can be
implemented easily using synthetic children, but a filter lets you get the job
done without having to write Python code.

For instance, if your class Foobar has member variables named A thru Z, but you
only need to see the ones named B, H and Q, you can define a filter:

::

   (lldb) type filter add Foobar --child B --child H --child Q
   (lldb) frame variable a_foobar
   (Foobar) a_foobar = {
      (int) B = 1
      (char) H = 'H'
      (std::string) Q = "Hello world"
   }

Objective-C Dynamic Type Discovery
----------------------------------

When doing Objective-C development, you may notice that some of your variables
come out as of type id (for instance, items extracted from NSArray). By
default, LLDB will not show you the real type of the object. it can actually
dynamically discover the type of an Objective-C variable, much like the runtime
itself does when invoking a selector. In order to be shown the result of that
discovery that, however, a special option to frame variable or expression is
required: ``--dynamic-type``.


``--dynamic-type`` can have one of three values:

- ``no-dynamic-values``: the default, prevents dynamic type discovery
- ``no-run-target``: enables dynamic type discovery as long as running code on
  the target is not required
- ``run-target``: enables code execution on the target in order to perform
  dynamic type discovery

If you specify a value of either no-run-target or run-target, LLDB will detect
the dynamic type of your variables and show the appropriate formatters for
them. As an example:

::

   (lldb) expr @"Hello"
   (NSString *) $0 = 0x00000001048000b0 @"Hello"
   (lldb) expr -d no-run @"Hello"
   (__NSCFString *) $1 = 0x00000001048000b0 @"Hello"

Because LLDB uses a detection algorithm that does not need to invoke any
functions on the target process, no-run-target is enough for this to work.

As a side note, the summary for NSString shown in the example is built right
into LLDB. It was initially implemented through Python (the code is still
available for reference at CFString.py). However, this is out of sync with the
current implementation of the NSString formatter (which is a C++ function
compiled into the LLDB core).

Categories
----------

Categories are a way to group related formatters. For instance, LLDB itself
groups the formatters for the libstdc++ types in a category named
gnu-libstdc++. Basically, categories act like containers in which to store
formatters for a same library or OS release.

By default, several categories are created in LLDB:

- default: this is the category where every formatter ends up, unless another category is specified
- objc: formatters for basic and common Objective-C types that do not specifically depend on macOS
- gnu-libstdc++: formatters for std::string, std::vector, std::list and std::map as implemented by libstdcpp
- libcxx: formatters for std::string, std::vector, std::list and std::map as implemented by libcxx
- system: truly basic types for which a formatter is required
- AppKit: Cocoa classes
- CoreFoundation: CF classes
- CoreGraphics: CG classes
- CoreServices: CS classes
- VectorTypes: compact display for several vector types

If you want to use a custom category for your formatters, all the type ... add
provide a --category (-w) option, that names the category to add the formatter
to. To delete the formatter, you then have to specify the correct category.

Categories can be in one of two states: enabled and disabled. A category is
initially disabled, and can be enabled using the type category enable command.
To disable an enabled category, the command to use is type category disable.

The order in which categories are enabled or disabled is significant, in that
LLDB uses that order when looking for formatters. Therefore, when you enable a
category, it becomes the second one to be searched (after default, which always
stays on top of the list). The default categories are enabled in such a way
that the search order is:

- default
- objc
- CoreFoundation
- AppKit
- CoreServices
- CoreGraphics
- gnu-libstdc++
- libcxx
- VectorTypes
- system

As said, gnu-libstdc++ and libcxx contain formatters for C++ STL data types.
system contains formatters for char* and char[], which reflect the behavior of
older versions of LLDB which had built-in formatters for these types. Because
now these are formatters, you can even replace them with your own if so you
wish.

There is no special command to create a category. When you place a formatter in
a category, if that category does not exist, it is automatically created. For
instance,

::

   (lldb) type summary add Foobar --summary-string "a foobar" --category newcategory

automatically creates a (disabled) category named newcategory.

Another way to create a new (empty) category, is to enable it, as in:

::

   (lldb) type category enable newcategory

However, in this case LLDB warns you that enabling an empty category has no
effect. If you add formatters to the category after enabling it, they will be
honored. But an empty category per se does not change the way any type is
displayed. The reason the debugger warns you is that enabling an empty category
might be a typo, and you effectively wanted to enable a similarly-named but
not-empty category.

Finding Formatters 101
----------------------

Searching for a formatter (including formats, starting in SVN rev r192217)
given a variable goes through a rather intricate set of rules. Namely, what
happens is that LLDB starts looking in each enabled category, according to the
order in which they were enabled (latest enabled first). In each category, LLDB
does the following:

- If there is a formatter for the type of the variable, use it
- If this object is a pointer, and there is a formatter for the pointee type
  that does not skip pointers, use it
- If this object is a reference, and there is a formatter for the referred type
  that does not skip references, use it
- If this object is an Objective-C class and dynamic types are enabled, look
  for a formatter for the dynamic type of the object. If dynamic types are
  disabled, or the search failed, look for a formatter for the declared type of
  the object
- If this object's type is a typedef, go through typedef hierarchy (LLDB might
  not be able to do this if the compiler has not emitted enough information. If
  the required information to traverse typedef hierarchies is missing, type
  cascading will not work. The clang compiler, part of the LLVM project, emits
  the correct debugging information for LLDB to cascade). If at any level of
  the hierarchy there is a valid formatter that can cascade, use it.
- If everything has failed, repeat the above search, looking for regular
  expressions instead of exact matches

If any of those attempts returned a valid formatter to be used, that one is
used, and the search is terminated (without going to look in other categories).
If nothing was found in the current category, the next enabled category is
scanned according to the same algorithm. If there are no more enabled
categories, the search has failed.

**Warning**: previous versions of LLDB defined cascading to mean not only going
through typedef chains, but also through inheritance chains. This feature has
been removed since it significantly degrades performance. You need to set up
your formatters for every type in inheritance chains to which you want the
formatter to apply.
