reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245
  246
  247
  248
  249
  250
  251
  252
  253
  254
  255
  256
  257
  258
  259
  260
  261
  262
  263
  264
  265
  266
  267
  268
  269
  270
  271
  272
  273
  274
  275
  276
  277
  278
  279
  280
  281
  282
  283
  284
  285
  286
  287
  288
  289
  290
  291
  292
  293
  294
  295
  296
  297
Frame and Thread Format
=======================

.. contents::
   :local:

LLDB has a facility to allow users to define the format of the information that
generates the descriptions for threads and stack frames. Typically when your
program stops at a breakpoint you will get two lines that describes why your
thread stopped and where:

::

   * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
       frame #0: test`main at test.c:5

Stack backtraces frames also have a similar information line:

::

   (lldb) thread backtrace
   * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
       frame #0: 0x0000000100000e85 a.out`main + 4 at test.c:19
       frame #1: 0x0000000100000e40 a.out`start + 52

The two format strings that govern the printing in these output forms can
currently be set using the settings set command:

::

   (lldb) settings set thread-stop-format STRING
   (lldb) settings set frame-format STRING

The first of these is an abbreviated thread output, that just contains data
about the thread, and not the stop frame. It will always get used in situations
where the frame output follows immediately, so that information would be
redundant. The second is the frame printing.

There is another thread format used for commands like thread list where the
thread information isn't followed by frame info. In that case, it is convenient
to have frame zero information in the thread output. That format is set by:

::

   (lldb) settings set thread-format STRING


Format Strings
--------------

So what is the format of the format strings? Format strings can contain plain
text, control characters and variables that have access to the current program
state.

Normal characters are any text that doesn't contain a ``{``, ``}``, ``$``, or
``\`` character.

Variable names are found in between a ``${`` prefix, and end with a ``}``
suffix. In other words, a variable looks like ``${frame.pc}``.

Variables
---------

A complete list of currently supported format string variables is listed below:

+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Variable Name**                                 | **Description**                                                                                                                                                                                                                                                                             |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``file.basename``                                 | The current compile unit file basename for the current frame.                                                                                                                                                                                                                               |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``file.fullpath``                                 | The current compile unit file fullpath for the current frame.                                                                                                                                                                                                                               |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``language``                                      | The current compile unit language for the current frame.                                                                                                                                                                                                                                    |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.index``                                   | The frame index (0, 1, 2, 3...)                                                                                                                                                                                                                                                             |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.no-debug``                                | Evaluates to true if the frame has no debug info.                                                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.pc``                                      | The generic frame register for the program counter.                                                                                                                                                                                                                                         |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.sp``                                      | The generic frame register for the stack pointer.                                                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.fp``                                      | The generic frame register for the frame pointer.                                                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.flags``                                   | The generic frame register for the flags register.                                                                                                                                                                                                                                          |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``frame.reg.NAME``                                | Access to any platform specific register by name (replace ``NAME`` with the name of the desired register).                                                                                                                                                                                  |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.name``                                 | The name of the current function or symbol.                                                                                                                                                                                                                                                 |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.name-with-args``                       | The name of the current function with arguments and values or the symbol name.                                                                                                                                                                                                              |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.name-without-args``                    | The name of the current function without arguments and values (used to include a function name in-line in the ``disassembly-format``)                                                                                                                                                       |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.pc-offset``                            | The program counter offset within the current function or symbol                                                                                                                                                                                                                            |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.addr-offset``                          | The offset in bytes of the current function, formatted as " + dddd"                                                                                                                                                                                                                         |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.concrete-only-addr-offset-no-padding`` | Similar to ``function.addr-offset`` except that there are no spaces in the output (e.g. "+dddd") and the offset is computed from the nearest concrete function -- inlined functions are not included                                                                                        |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.changed``                              | Will evaluate to true when the line being formatted is a different symbol context from the previous line (may be used in ``disassembly-format`` to print the new function name on a line by itself at the start of a new function).  Inlined functions are not considered for this variable |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``function.initial-function``                     | Will evaluate to true if this is the start of the first function, as opposed to a change of functions (may be used in ``disassembly-format`` to print the function name for the first function being disassembled)                                                                          |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``line.file.basename``                            | The line table entry basename to the file for the current line entry in the current frame.                                                                                                                                                                                                  |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``line.file.fullpath``                            | The line table entry fullpath to the file for the current line entry in the current frame.                                                                                                                                                                                                  |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``line.number``                                   | The line table entry line number for the current line entry in the current frame.                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``line.start-addr``                               | The line table entry start address for the current line entry in the current frame.                                                                                                                                                                                                         |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``line.end-addr``                                 | The line table entry end address for the current line entry in the current frame.                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``module.file.basename``                          | The basename of the current module (shared library or executable)                                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``module.file.fullpath``                          | The basename of the current module (shared library or executable)                                                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``process.file.basename``                         | The basename of the file for the process                                                                                                                                                                                                                                                    |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``process.file.fullpath``                         | The fullname of the file for the process                                                                                                                                                                                                                                                    |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``process.id``                                    | The process ID native to the system on which the inferior runs.                                                                                                                                                                                                                             |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``process.name``                                  | The name of the process at runtime                                                                                                                                                                                                                                                          |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.id``                                     | The thread identifier for the current thread                                                                                                                                                                                                                                                |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.index``                                  | The unique one based thread index ID which is guaranteed to be unique as threads come and go.                                                                                                                                                                                               |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.name``                                   | The name of the thread if the target OS supports naming threads                                                                                                                                                                                                                             |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.queue``                                  | The queue name of the thread if the target OS supports dispatch queues                                                                                                                                                                                                                      |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.stop-reason``                            | A textual reason each thread stopped                                                                                                                                                                                                                                                        |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.return-value``                           | The return value of the latest step operation (currently only for step-out.)                                                                                                                                                                                                                |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``thread.completed-expression``                   | The expression result for a thread that just finished an interrupted expression evaluation.                                                                                                                                                                                                 |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``target.arch``                                   | The architecture of the current target                                                                                                                                                                                                                                                      |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``script.target:python_func``                     | Use a Python function to generate a piece of textual output                                                                                                                                                                                                                                 |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``script.process:python_func``                    | Use a Python function to generate a piece of textual output                                                                                                                                                                                                                                 |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``script.thread:python_func``                     | Use a Python function to generate a piece of textual output                                                                                                                                                                                                                                 |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``script.frame:python_func``                      | Use a Python function to generate a piece of textual output                                                                                                                                                                                                                                 |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``current-pc-arrow``                              | Prints either ``->`` or `` `` if the current pc value is matched (used in ``disassembly-format``)                                                                                                                                                                                           |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ``addr-file-or-load``                             | Formats an address either as a load address, or if process has not yet been launched, as a load address (used in ``disassembly-format``)                                                                                                                                                    |
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Control Characters
------------------

Control characters include ``{``, ``}``, and ``\``.

The ``{`` and ``}`` are used for scoping blocks, and the ``\`` character allows
you to desensitize control characters and also emit non-printable characters.

Desensitizing Characters in the Format String
---------------------------------------------

The backslash control character allows your to enter the typical ``\a``,
``\b``, ``\f``, ``\n``, ``\r``, ``\t``, ``\v``, ``\\``, characters and along
with the standard octal representation ``\0123`` and hex ``\xAB`` characters.
This allows you to enter escape characters into your format strings and will
allow colorized output for terminals that support color.

Scoping
-------

Many times the information that you might have in your prompt might not be
available and you won``t want it to print out if it isn``t valid. To take care
of this you can enclose everything that must resolve into a scope. A scope is
starts with ``{`` and ends with ``}``. For example in order to only display the
current frame line table entry basename and line number when the information is
available for the current frame:

::

   "{ at {$line.file.basename}:${line.number}}"


Broken down this is:

- The start the scope: ``{`` ,
- format whose content will only be displayed if all information is available: ``at {$line.file.basename}:${line.number}``
- end the scope: ``}``

Making the Frame Format
-----------------------

The information that we see when stopped in a frame:

::

   frame #0: 0x0000000100000e85 a.out`main + 4 at test.c:19

can be displayed with the following format:

::

   "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}`${function.name}{${function.pc-offset}}}{ at ${line.file.basename}:${line.number}}\n"

This breaks down to:

- Always print the frame index and frame PC: ``frame #${frame.index}: ${frame.pc}``,
- only print the module followed by a tick if there is a valid module for the current frame: ``{ ${module.file.basename}`}``,
- print the function name with optional offset: ``{${function.name}{${function.pc-offset}}}``,
- print the line info if it is available: ``{ at ${line.file.basename}:${line.number}}``,
- then finish off with a newline: ``\n``.

Making Your own Formats
-----------------------

When modifying your own format strings, it is useful to start with the default
values for the frame and thread format strings. These can be accessed with the
``settings show`` command:

::

   (lldb) settings show thread-format
   thread-format (format-string) = "thread #${thread.index}: tid = ${thread.id%tid}{, ${frame.pc}}{ ${module.file.basename}{`${function.name-with-args}{${frame.no-debug}${function.pc-offset}}}}{ at ${line.file.basename}:${line.number}}{, name = '${thread.name}'}{, queue = '${thread.queue}'}{, activity = '${thread.info.activity.name}'}{, ${thread.info.trace_messages} messages}{, stop reason = ${thread.stop-reason}}{\nReturn value: ${thread.return-value}}{\nCompleted expression: ${thread.completed-expression}}\n"
   (lldb) settings show frame-format
   frame-format (format-string) = "frame #${frame.index}:{ ${frame.no-debug}${frame.pc}}{ ${module.file.basename}{`${function.name-with-args}{${frame.no-debug}${function.pc-offset}}}}{ at ${line.file.basename}:${line.number}}{${function.is-optimized} [opt]}\n"

When making thread formats, you will need surround any of the information that
comes from a stack frame with scopes ({ frame-content }) as the thread format
doesn't always want to show frame information. When displaying the backtrace
for a thread, we don't need to duplicate the information for frame zero in the
thread information:

::

  (lldb) thread backtrace
  thread #1: tid = 0x2e03, stop reason = breakpoint 1.1 2.1
    frame #0: 0x0000000100000e85 a.out`main + 4 at test.c:19
    frame #1: 0x0000000100000e40 a.out`start + 52

The frame related variables are:

- ``${file.*}``
- ``${frame.*}``
- ``${function.*}``
- ``${line.*}``
- ``${module.*}``


Looking at the default format for the thread, and underlining the frame
information:

::

   thread #${thread.index}: tid = ${thread.id}{, ${frame.pc}}{ ${module.file.basename}`${function.name}{${function.pc-offset}}}{, stop reason = ${thread.stop-reason}}{, name = ${thread.name}}{, queue = ${thread.queue}}\n


We can see that all frame information is contained in scopes so that when the
thread information is displayed in a context where we only want to show thread
information, we can do so.

For both thread and frame formats, you can use ${script.target:python_func},
${script.process:python_func} and ${script.thread:python_func} (and of course
${script.frame:python_func} for frame formats) In all cases, the signature of
python_func is expected to be:

::

   def python_func(object,unused):
     ...
     return string

Where object is an instance of the SB class associated to the keyword you are
using.

e.g. Assuming your function looks like:

::

   def thread_printer_func (thread,unused):
     return "Thread %s has %d frames\n" % (thread.name, thread.num_frames)

And you set it up with:

::

   (lldb) settings set thread-format "${script.thread:thread_printer_func}"

you would see output like:

::

   * Thread main has 21 frames