Home | History | Annotate | Download | only in www
      1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      2 <html xmlns="http://www.w3.org/1999/xhtml">
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      5 <link href="style.css" rel="stylesheet" type="text/css" />
      6 <title>LLDB Stack and Frame Formats</title>
      7 </head>
      8 
      9 <body>
     10     <div class="www_title">
     11       The <strong>LLDB</strong> Debugger
     12     </div>
     13     
     14 <div id="container">
     15 	<div id="content">
     16        <!--#include virtual="sidebar.incl"-->
     17 
     18 		<div id="middle">
     19 			<div class="post">
     20 				<h1 class ="postheader">Stack Frame and Thread Format</h1>
     21 				<div class="postcontent">
     22 				   <p>LLDB has a facility to allow users to define the 
     23 				       format of the information that generates the descriptions
     24 				       for threads and stack frames. Typically when your program stops
     25 				       at a breakpoint you will get a line that describes why
     26 				       your thread stopped:</p>
     27 
     28     			   <p><b><code>* thread #1: tid = 0x2e03, 0x0000000100000e85 a.out`main + 4, stop reason = breakpoint 1.1</code></b></p>
     29 
     30         		   <p>Stack backtraces frames also have a similar information line:</p>
     31 
     32                    <p><code><b>(lldb)</b> thread backtrace
     33                    <br><b>thread #1: tid = 0x2e03, stop reason = breakpoint 1.1
     34                    <br>&nbsp;&nbsp;frame #0: 0x0000000100000e85 a.out`main + 4 at test.c:19
     35                    <br>&nbsp;&nbsp;frame #1: 0x0000000100000e40 a.out`start + 52
     36                    </code></b></p>
     37 
     38 				   <p>The two format strings can currently be set using the <b>settings set</b> command:</p>
     39 				   <p><code><b>(lldb)</b> settings set frame-format STRING
     40 				   <br><b>(lldb)</b> settings set thread-format STRING
     41 				   </p></code>
     42 
     43                    </div>
     44        			<div class="postfooter"></div>
     45    			</div>
     46 
     47    			<div class="post">
     48    				<h1 class ="postheader">Format Strings</h1>
     49    				<div class="postcontent">
     50 
     51                    <p>So what is the format of the format strings? Format strings can
     52                    contain plain text, control characters and variables that have access
     53                    to the current program state.</p>
     54                    
     55                    <p>Normal characters are any text that doesn't contain a <code><b>'{'</b></code>, <code><b>'}'</b></code>, <code><b>'$'</b></code>,
     56                        or <code><b>'\'</b></code> character.</p>
     57                 
     58                    <p>Variable names are found in between a <code><b>"${"</b></code> prefix, and
     59                    end with a <code><b>"}"</b></code> suffix. In other words, a variable looks like
     60                    <code>"<b>${frame.pc}</b>"</code>.</p> 
     61                    
     62                 </div>
     63           		<div class="postfooter"></div>
     64       			</div>
     65 
     66       			<div class="post">
     67       				<h1 class ="postheader">Variables</h1>
     68       				<div class="postcontent">
     69 
     70                    <p>A complete list of currently supported format string variables is listed below:</p>
     71 
     72                    <table border="1">
     73                     <tr valign=top><td><b>Variable Name</b></td><td><b>Description</b></td></tr>
     74                     <tr valign=top><td><b>file.basename</b></td><td>The current compile unit file basename for the current frame.</td></tr>
     75                     <tr valign=top><td><b>file.fullpath</b></td><td>The current compile unit file fullpath for the current frame.</td></tr>
     76                     <tr valign=top><td><b>frame.index</b></td><td>The frame index (0, 1, 2, 3...)</td></tr>
     77                     <tr valign=top><td><b>frame.pc</b></td><td>The generic frame register for the program counter.</td></tr>
     78                     <tr valign=top><td><b>frame.sp</b></td><td>The generic frame register for the stack pointer.</td></tr>
     79                     <tr valign=top><td><b>frame.fp</b></td><td>The generic frame register for the frame pointer.</td></tr>
     80                     <tr valign=top><td><b>frame.flags</b></td><td>The generic frame register for the flags register.</td></tr>
     81                     <tr valign=top><td><b>frame.reg.NAME</b></td><td>Access to any platform specific register by name (replace <b>NAME</b> with the name of the desired register).</td></tr>
     82                     <tr valign=top><td><b>function.name</b></td><td>The name of the current function or symbol.</td></tr>
     83                     <tr valign=top><td><b>function.name-with-args</b></td><td>The name of the current function with arguments and values or the symbol name.</td></tr>
     84                     <tr valign=top><td><b>function.pc-offset</b></td><td>The program counter offset within the current function or symbol</td></tr>
     85                     <tr valign=top><td><b>line.file.basename</b></td><td>The line table entry basename to the file for the current line entry in the current frame.</td></tr>
     86                     <tr valign=top><td><b>line.file.fullpath</b></td><td>The line table entry fullpath to the file for the current line entry in the current frame.</td></tr>
     87                     <tr valign=top><td><b>line.number</b></td><td>The line table entry line number for the current line entry in the current frame.</td></tr>
     88                     <tr valign=top><td><b>line.start-addr</b></td><td>The line table entry start address for the current line entry in the current frame.</td></tr>
     89                     <tr valign=top><td><b>line.end-addr</b></td><td>The line table entry end address for the current line entry in the current frame.</td></tr>
     90                     <tr valign=top><td><b>module.file.basename</b></td><td>The basename of the current module (shared library or executable)</td></tr>
     91                     <tr valign=top><td><b>module.file.fullpath</b></td><td>The basename of the current module (shared library or executable)</td></tr>
     92                     <tr valign=top><td><b>process.file.basename</b></td><td>The basename of the file for the process</td></tr>
     93                     <tr valign=top><td><b>process.file.fullpath</b></td><td>The fullname of the file for the process</td></tr>
     94                     <tr valign=top><td><b>process.id</b></td><td>The process ID native the the system on which the inferior runs.</td></tr>
     95                     <tr valign=top><td><b>process.name</b></td><td>The name of the process at runtime</td></tr>
     96                     <tr valign=top><td><b>thread.id</b></td><td>The thread identifier for the current thread</td></tr>
     97                     <tr valign=top><td><b>thread.index</b></td><td>The unique one based thread index ID which is guaranteed to be unique as threads come and go.</td></tr>
     98                     <tr valign=top><td><b>thread.name</b></td><td>The name of the thread if the target OS supports naming threads</td></tr>
     99                     <tr valign=top><td><b>thread.queue</b></td><td>The queue name of the thread if the target OS supports dispatch queues</td></tr>
    100                     <tr valign=top><td><b>thread.stop-reason</b></td><td>A textual reason each thread stopped</td></tr>
    101                     <tr valign=top><td><b>thread.return-value</b></td><td>The return value of the latest step operation (currently only for step-out.)</td></tr>
    102                     <tr valign=top><td><b>target.arch</b></td><td>The architecture of the current target</td></tr>
    103                     <tr valign=top><td><b>target.script:<i>python_func</i></b></td><td>Use a Python function to generate a piece of textual output</td></tr>
    104                     <tr valign=top><td><b>process.script:<i>python_func</i></b></td><td>Use a Python function to generate a piece of textual output</td></tr>
    105                     <tr valign=top><td><b>thread.script:<i>python_func</i></b></td><td>Use a Python function to generate a piece of textual output</td></tr>
    106                     <tr valign=top><td><b>frame.script:<i>python_func</i></b></td><td>Use a Python function to generate a piece of textual output</td></tr>
    107                     </table>
    108                     
    109                        </div>
    110            			<div class="postfooter"></div>
    111        			</div>
    112 
    113        			<div class="post">
    114        				<h1 class ="postheader">Control Characters</h1>
    115        				<div class="postcontent">
    116 
    117                     <p>Control characters include <b><code>'{'</code></b>,
    118                     <b><code>'}'</code></b>, and <b><code>'\'</code></b>.</p>
    119 
    120                     <p>The '{' and '}' are used for scoping blocks, and the '\' character
    121                         allows you to desensitize control characters and also emit non-printable
    122                         characters.
    123     
    124                            </div>
    125                			<div class="postfooter"></div>
    126            			</div>
    127 
    128            			<div class="post">
    129            				<h1 class ="postheader">Desensitizing Characters in the format string</h1>
    130            				<div class="postcontent">
    131                     <p>The backslash control character allows your to enter the typical
    132                     <b><code>"\a"</code></b>, <b><code>"\b"</code></b>, <b><code>"\f"</code></b>, <b><code>"\n"</code></b>, 
    133                         <b><code>"\r"</code></b>, <b><code>"\t"</code></b>, <b><code>"\v"</code></b>, <b><code>"\\"</code></b>, characters 
    134                     and along with the standard octal representation <b><code>"\0123"</code></b>
    135                     and hex <b><code>"\xAB"</code></b> characters. This allows you to enter 
    136                     escape characters into your format strings and will
    137                     allow colorized output for terminals that support color.
    138 
    139                        </div>
    140            			<div class="postfooter"></div>
    141        			</div>
    142 
    143        			<div class="post">
    144        				<h1 class ="postheader">Scoping</h1>
    145        				<div class="postcontent">
    146                    <p>Many times the information that you might have in your prompt might not be
    147                    available and you won't want it to print out if it isn't valid. To take care
    148                    of this you can enclose everything that <b>must</b> resolve into a scope. A scope
    149                    is starts with <code><b>'{'</code></b> and ends with 
    150                    <code><b>'}'</code></b>. For example in order to only display
    151                    the current frame line table entry basename and line number when the information
    152                    is available for the current frame:
    153 
    154                    <p><b><code>"{ at {$line.file.basename}:${line.number}}"</code></b></p>
    155 
    156                    <p>Broken down this is:
    157                        <ul>
    158                         <li>The start the scope <p><b><code>"{"</code></b></p></li>
    159                         <li> format whose content will only be displayed if all information is available:
    160                            <p><b><code>"at {$line.file.basename}:${line.number}"</code></b></p></li>
    161                         <li>end the scope: <p><b><code>"}"</code></b></p></li>
    162                         </ul>
    163 
    164                     </div>
    165                	    <div class="postfooter"></div>
    166            		</div>
    167 
    168            		<div class="post">
    169            			<h1 class ="postheader">Making the Frame Format</h1>
    170            			<div class="postcontent">
    171                    <p>The information that we see when stopped in a frame:
    172 
    173                    <p><b><code>frame #0: 0x0000000100000e85 a.out`main + 4 at test.c:19</code></b></p>
    174 
    175                    <p>can be displayed with the following format:</p>
    176 
    177                    <p><b><code>"frame #${frame.index}: ${frame.pc}{ ${module.file.basename}`${function.name}{${function.pc-offset}}}{ at ${line.file.basename}:${line.number}}\n"</code></b></p>
    178 
    179                    <p>This breaks down to:
    180                        
    181                     <ul>
    182                         <li>Always print the frame index and frame PC:
    183 
    184                             <p><b><code>"frame #${frame.index}: ${frame.pc}"</code></b></p>
    185 
    186                    <li>only print the module followed by a tick if there is a valid
    187                    module for the current frame:
    188 
    189                    <p><b><code>"{ ${module.file.basename}`}"</code></b></p>
    190 
    191                    <li>print the function name with optional offset:</p>
    192                        <p><b><code>"{${function.name}{${function.pc-offset}}}"</code></b></p>
    193 
    194                    <li>print the line info if it is available:</p>
    195 
    196                        <p><b><code>"{ at ${line.file.basename}:${line.number}}"</code></b></p>
    197 
    198                    <li>then finish off with a newline:</p>
    199 
    200                     <p><b><code>"\n"</code></b></p>
    201                     </ul>
    202 
    203                     </div>
    204                	    <div class="postfooter"></div>
    205            		</div>
    206 
    207            		<div class="post">
    208            			<h1 class ="postheader">Making Your Own Formats</h1>
    209            			<div class="postcontent">
    210 
    211                    <p>When modifying your own format strings, it is useful
    212                        to start with the default values for the frame and
    213                        thread format strings. These can be accessed with the
    214                        <b><code>"settings show"</code></b> command:
    215                        
    216                    <p><b><code>(lldb)</b> settings show thread-format 
    217                    <br>thread-format (string) = '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'
    218                    <br><b>(lldb)</b> settings show frame-format 
    219                    <br>frame-format (string) = 'frame #${frame.index}: ${frame.pc}{ ${module.file.basename}`${function.name}{${function.pc-offset}}}{ at ${line.file.basename}:${line.number}}\n'
    220                    </code></p>
    221 
    222 
    223                    <p>When making thread formats, you will need surround any
    224                        of the information that comes from a stack frame with scopes (<b>{</b> <i>frame-content</i> <b>}</b>)
    225                        as the thread format doesn't always want to show frame information.
    226                        When displaying the backtrace for a thread, we don't need to duplicate
    227                        the information for frame zero in the thread information:
    228 
    229                    <p><code><b>(lldb)</b> thread backtrace 
    230                    <br>thread #1: tid = 0x2e03, stop reason = breakpoint 1.1 2.1
    231                    <br>&nbsp;&nbsp;frame #0: 0x0000000100000e85 a.out`main + 4 at test.c:19
    232                    <br>&nbsp;&nbsp;frame #1: 0x0000000100000e40 a.out`start + 52
    233                    </code>
    234                    </p>
    235                        
    236                    <p>The frame related variables are:
    237                       <ul>
    238                       <li><code><b>${file.*}</b></code></li>
    239                       <li><code><b>${frame.*}</b></code></li>
    240                       <li><code><b>${function.*}</b></code></li>
    241                       <li><code><b>${line.*}</b></code></li>
    242                       <li><code><b>${module.*}</b></code></li>
    243                       </ul>
    244                     </p>
    245                      
    246                     <p>Looking at the default format for the thread, and underlining
    247                         the frame information:
    248                     <p><code>'thread #${thread.index}: tid = ${thread.id}<u><b>{</b>, ${frame.pc}<b>}{</b> ${module.file.basename}`${function.name}{${function.pc-offset}}<b>}</b></u>{, stop reason = ${thread.stop-reason}}{, name = ${thread.name}}{, queue = ${thread.queue}}\n'
    249                     </code></p>
    250                     <p>We can see that all frame information is contained in scopes so 
    251                         that when the thread information is displayed in a context where
    252                         we only want to show thread information, we can do so.
    253                         
    254 					<p>For both thread and frame formats, you can use ${target.script:<i>python_func</i>}, ${process.script:<i>python_func</i>} and ${thread.script:<i>python_func</i>}
    255 						(and of course ${frame.script:<i>python_func</i>} for frame formats)<br/>
    256 						In all cases, the signature of <i>python_func</i> is expected to be:<br/>
    257 							<p><code>
    258 								def <i>python_func</i>(<i>object</i>,unused):<br/>
    259 								&nbsp;&nbsp;&nbsp;&nbsp;...<br/>
    260 								&nbsp;&nbsp;&nbsp;&nbsp;return <i>string</i><br/></code>
    261 						<p>Where <i>object</i> is an instance of the SB class associated to the keyword you are using.
    262 							
    263 						<p>e.g. Assuming your function looks like<br/><code><p>
    264 						def thread_printer_func (thread,unused):<br/>
    265 						&nbsp;&nbsp;return "Thread %s has %d frames\n" % (thread.name, thread.num_frames)<br/></code><p>
    266 							
    267 						And you set it up with <code><br/><b>(lldb)</b> settings set thread-format "${thread.script:thread_printer_func}"<br/></code>
    268 						you would see output like:
    269 						</p>
    270 						<code>* Thread main has 21 frames</code>
    271 				</div>
    272 				<div class="postfooter"></div>
    273 		    </div>
    274 
    275 		</div>
    276 	</div>
    277 </div>
    278 </body>
    279 </html>
    280