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 Tutorial</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 		<div id="middle">
     18 			<div class="post">
     19 				<h1 class ="postheader">Getting Started</h1>
     20 				<div class="postcontent">
     21 
     22                     <p>Here's a short precis of how to run lldb if you are familiar with the gdb command set.
     23                         We will start with some details on lldb command structure and syntax to help orient you.</p>
     24 
     25 				</div>
     26 				<div class="postfooter"></div>
     27 
     28     			<div class="post">
     29     				<h1 class ="postheader">Command Structure</h1>
     30     				<div class="postcontent">
     31 
     32 				   <p>Unlike gdb's command set, which is rather free-form, we tried to make
     33                    the lldb command syntax fairly structured.  The commands are all of the
     34                    form:</p>
     35 
     36                    <code color=#ff0000>
     37                    &lt;noun&gt; &lt;verb&gt; [-options [option-value]] [argument [argument...]]
     38                    </code>
     39 
     40                    <p>The command line parsing is done before command execution, so it is
     41                    uniform across all the commands.  The command syntax for basic commands is very simple,
     42                    arguments, options and option values are all white-space
     43                    separated, and double-quotes are used to protect white-spaces in an argument.  
     44                    If you need to put a backslash or double-quote character
     45                    in an argument you back-slash it in the argument.  That makes the
     46                    command syntax more regular, but it also means you may have to
     47                    quote some arguments in lldb that you wouldn't in gdb.</p>
     48 
     49                    <p>Options can be placed anywhere on the command line, but if the arguments
     50                    begin with a "<code>-</code>" then you have to tell lldb that you're done with options
     51                    for the current command by adding an option termination: "<code>--</code>"
     52                    So for instance if you want to launch a process and give the "process launch" command 
     53                    the "<code>--stop-at-entry</code>" option, yet you want the
     54                    process you are about to launch to be launched with the arguments 
     55                    "<code>-program_arg value</code>", you would type:</p>
     56 
     57                    <code>
     58                        (lldb) process launch --stop-at-entry -- -program_arg value
     59                    </code>
     60 
     61                    <p>We also tried to reduce the number of special purpose argument
     62                    parsers, which sometimes forces the user to be a little more explicit
     63                    about stating their intentions.  The first instance you'll note of
     64                    this is the breakpoint command.  In gdb, to set a breakpoint, you
     65                    might enter</p>
     66 
     67                    <code>
     68                        (gdb) break foo.c:12
     69                    </code>
     70                    <p>to break at line 12 of foo.c, and:</p>
     71                    <code>
     72                        (gdb) break foo
     73                    </code>
     74 
     75                    <p>to break at the function <code>foo</code>.  As time went on, the parser that tells <code>foo.c:12</code>
     76                    from <code>foo</code> from <code>foo.c::foo</code> (which means the function foo in the file
     77                    foo.c) got more and more complex and bizarre, and especially in C++
     78                    there are times where there's really no way to specify the function
     79                    you want to break on. The lldb commands are more verbose but also more precise
     80                    and allow for intellegent auto completion.
     81                    
     82                    <p>To set the same file and line breakpoint in LLDB you can enter either of:</p>
     83 
     84                    <code>
     85                       (lldb) breakpoint set --file foo.c --line 12
     86                       <br>(lldb) breakpoint set -f foo.c -l 12
     87                   </code>
     88 
     89                    <p>To set a breakpoint on a function named <code>foo</code> in LLDB you can enter either of:</p>
     90 
     91                     <code>
     92                         (lldb) breakpoint set --name foo
     93                         <br>(lldb) breakpoint set -n foo
     94                     </code>
     95 
     96                    <p>You can use the --name option multiple times to make a breakpoint on a set of functions as well.  This is convenient
     97                       since it allows you to set commmon conditions or commands without having to specify them multiple times:</p>
     98 
     99                     <code>
    100                         (lldb) breakpoint set --name foo --name bar
    101                     </code>
    102 
    103                    <p>Setting breakpoints by name is even more specialized in LLDB as you can specify
    104                        that you want to set a breakpoint at a function by method name. To set a breakpoint
    105                        on all C++ methods named <code>foo</code> you can enter either of:</p>
    106 
    107                    <code>
    108                        (lldb) breakpoint set --method foo
    109                        <br>(lldb) breakpoint set -M foo
    110                   </code>
    111 
    112                    <p>To set a breakpoint Objective C selectors named <code>alignLeftEdges:</code> you can enter either of:</p>
    113 
    114                    <code>
    115                        (lldb) breakpoint set --selector alignLeftEdges:
    116                        <br>(lldb) breakpoint set -S alignLeftEdges:
    117                   </code>
    118 
    119                    <p>You can limit any breakpoints to a specific executable image by using
    120                        the "<code>--shlib &lt;path&gt;</code>" ("<code>-s &lt;path&gt;</code>" for short):</p>
    121 
    122                    <code>
    123                       (lldb) breakpoint set --shlib foo.dylib --name foo
    124                       <br>(lldb) breakpoint set -s foo.dylib -n foo
    125                   </code>
    126 
    127                    <p>The <code>--shlib</code> option can also be repeated to specify several shared libraries.</p>
    128 
    129                    <p>Suggestions on more interesting primitives of this sort are also very welcome.</p>
    130 
    131                    <p>Just like gdb, the lldb command interpreter does a shortest unique
    132                    string match on command names, so the following two commands will
    133                    both execute the same command:</p>
    134 
    135                    <code>
    136                        (lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]"
    137                        <br>(lldb) br s -n "-[SKTGraphicView alignLeftEdges:]"
    138                   </code>
    139 
    140                    <p>lldb also supports command completion for source file names, symbol
    141                    names, file names, etc. Completion is initiated by a hitting a <b>TAB</b>.
    142                    Individual options in a command can have different completers, so for
    143                    instance the "<code>--file &lt;path&gt;</code>" option in "breakpoint" completes to source files, the
    144                    "<code>--shlib &lt;path&gt;</code>" option to currently loaded shared libraries, etc.  We can even do 
    145                    things like if you specify "<code>--shlib &lt;path&gt;</code>", and are completing on "<code>--file &lt;path&gt;</code>", we will only
    146                    list source files in the shared library specified by "<code>--shlib &lt;path&gt;</code>".</p>
    147 
    148                    <p>The individual commands are pretty extensively documented.  You can
    149                    use the <code>help</code> command to get an overview of which commands are
    150                    available or to obtain details about specific commands.  There is also an
    151                    <code>apropos</code> command that will search the help text for all commands
    152                    for a particular word and dump a summary help string for each matching
    153                    command.</p>
    154 
    155                    <p>Finally, there is a mechanism to construct aliases for commonly used
    156                    commands.  So for instance if you get annoyed typing:</p>
    157 
    158                    <code>
    159                        (lldb) breakpoint set --file foo.c --line 12
    160                    </code>
    161 
    162                    <p>you can do:</p>
    163 
    164                    <code>
    165                        (lldb) command alias bfl breakpoint set -f %1 -l %2
    166                        <br>(lldb) bfl foo.c 12
    167                    </code>
    168 
    169                    <p>We have added a few aliases for commonly used commands (e.g. "step",
    170                    "next" and "continue") but we haven't tried to be exhaustive because
    171                    in our experience it is more convenient to make the basic commands
    172                    unique down to a letter or two, and then learn these sequences than
    173                    to fill the namespace with lots of aliases, and then have to type them
    174                    all the way out.</p>
    175 
    176                    <p>However, users are free to customize lldb's command set however they
    177                    like, and since lldb reads the file ~/.lldbinit at startup, you can
    178                    store all your aliases there and they will be generally available to
    179                    you.  Your aliases are also documented in the help command so you can
    180                    remind yourself of what you've set up.</p>
    181 
    182                    <p> One alias of note that we do include by popular demand is a weak emulator
    183                    of gdb's &quot;break&quot; command.  It doesn't try to do everything that gdb's
    184                    break command does (for instance, it doesn't handle <code>foo.c::bar</code>.  But
    185                    it mostly works, and makes the transition easier.  Also by popular demand, it
    186                    is aliased to <code>b</code>.  If you actually want to learn the lldb command
    187                    set natively, that means it will get in the way of the rest of the breakpoint
    188                    commands.  Fortunately, if you don't like one of our aliases, you an easily
    189                    get rid of it by running (for example):</p>
    190 
    191                    <code>
    192                     (lldb) command unalias b
    193                    </code>
    194 
    195                    <p>I actually also do:</p>
    196 
    197                    <code>
    198                      (lldb) command alias b breakpoint
    199                    </code>
    200 
    201                    <p>so I can run the native lldb breakpoint command with just <code>b</code></p>
    202                      
    203                    <p>The lldb command parser also supports "raw" commands, where, after command options
    204                    are stripped off, the rest of the command string is passed uninterpreted to the command.
    205                    This is convenient for commands whose arguments might be some complex expression that would
    206                    be painful to backslash protect.
    207                    For instance the "expression" command is a "raw" command for obvious reasons.  The
    208                    "help" output for a command will tell you if it is "raw" or not, so you know what to expect.
    209                    The one thing you have to watch out for is that since raw commands still can have options,
    210                    if your command string has dashes in it, you'll have to indicate these are not option
    211                    markers by putting "--" after the command name, but before your command string.  
    212 
    213                    <p>lldb also has a built-in Python interpreter, which is accessible by
    214                    the "script" command.  All the functionality of the debugger is
    215                    available as classes in the Python interpreter, so the more complex
    216                    commands that in gdb you would introduce with the "define" command can
    217                    be done by writing Python functions using the lldb-Python library,
    218                    then loading the scripts into your running session and accessing them
    219                    with the "script" command.</p>
    220 
    221                    <p>Having given an overview of lldb's command syntax, we proceed to lay out the stages
    222                    of a standard debug session.</p>
    223 
    224 				</div>
    225 				<div class="postfooter"></div>
    226 
    227 
    228     			<div class="post">
    229     				<h1 class ="postheader">Loading a program into lldb</h1>
    230     				<div class="postcontent">
    231 
    232                     <p>First we need to set the program to debug. As with gdb, you
    233                          can start lldb and specify the file you wish to debug on the command line:</p>
    234 
    235                     <code>
    236                         $ lldb /Projects/Sketch/build/Debug/Sketch.app
    237                         <br>Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64).
    238                     </code>
    239 
    240                     <p>or you can specify it after the fact with the "file" command:</p>
    241 
    242                     <code>
    243                         $ lldb
    244                         <br>(lldb) file /Projects/Sketch/build/Debug/Sketch.app
    245                         <br>Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64).
    246                     </code>
    247                 <p>
    248 				</div>
    249 				<div class="postfooter"></div>
    250 
    251     			<div class="post">
    252     				<h1 class ="postheader">Setting breakpoints</h1>
    253     				<div class="postcontent">
    254 
    255                     <p>We've discussed how to set breakpoints above.  You can use <code>help breakpoint set</code>
    256                     to see all the options for breakpoint setting.  For instance, we might do:</p>
    257 
    258                     <code>
    259                         (lldb) breakpoint set --selector alignLeftEdges:
    260                         <br>Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1
    261                     </code>
    262 
    263                     <p>You can find out about the breakpoints you've set with:</p>
    264 
    265                     <pre><tt>(lldb) breakpoint list
    266 Current breakpoints:
    267 1: name = 'alignLeftEdges:', locations = 1, resolved = 1
    268   1.1: where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405, address = 0x0000000100010d5b, resolved, hit count = 0 
    269 </tt></pre>
    270 
    271                     <p>Note that setting a breakpoint creates a <i>logical</i> breakpoint, which could
    272                     resolve to one or more <i>locations</i>.  For instance, break by selector would
    273                     set a breakpoint on all the methods that implement that selector in the classes in
    274                     your program.  Similarly, a file and line breakpoint might result in multiple
    275                     locations if that file and line were inlined in different places in your code.</p>
    276 
    277                     <p>The logical breakpoint has an integer id, and it's locations have an
    278                     id within their parent breakpoint (the two are joined by a ".",
    279                     e.g. 1.1 in the example above.)  </p>
    280 
    281                     <p>Also the logical breakpoints remain <i>live</i> so that if another shared library
    282                     were to be loaded that had another implementation of the
    283                     "<code>alignLeftEdges:</code>" selector, the new location would be added to
    284                     breakpoint 1 (e.g. a "1.2" breakpoint would be set on the newly loaded
    285                     selector).</p>
    286 
    287                     <p>The other piece of information in the breakpoint listing is whether the
    288                     breakpoint location was <i>resolved</i> or not.  A location gets resolved when
    289                     the file address it corresponds to gets loaded into the program you are
    290                     debugging.  For instance if you set a breakpoint in a shared library that 
    291                     then gets unloaded, that breakpoint location will remain, but it will no 
    292                     longer be <i>resolved</i>.</p>
    293 
    294                     <p>One other thing to note for gdb users is that lldb acts like gdb with:</p>
    295 
    296                     <code>
    297                         (gdb) set breakpoint pending on
    298                     </code>
    299 
    300                     <p>That is, lldb will always make a breakpoint from your specification, even
    301                     if it couldn't find any locations that match the specification.  You can tell
    302                     whether the expression was resolved or not by checking the locations field
    303                     in "breakpoint list", and we report the breakpoint as "pending" when you
    304                     set it so you can tell you've made a typo more easily, if that was indeed 
    305                     the reason no locations were found:</p>
    306 
    307                     <code>
    308                         (lldb) breakpoint set --file foo.c --line 12
    309                         <br>Breakpoint created: 2: file ='foo.c', line = 12, locations = 0 (pending)
    310                         <br>WARNING:  Unable to resolve breakpoint to any actual locations.
    311                     </code>
    312 
    313                     <p>You can delete, disable, set conditions and ignore counts either on all the
    314                     locations generated by your logical breakpoint, or on any one of the particular locations
    315                     your specification resolved to.  For instance if we wanted to add a command
    316                     to print a backtrace when we hit this breakpoint we could do:</p>
    317 
    318                     <code>
    319                         (lldb) breakpoint command add 1.1
    320                         <br>Enter your debugger command(s).  Type 'DONE' to end.
    321                         <br>&gt; bt
    322                         <br>&gt; DONE
    323                     </code>
    324 
    325                     <p>By default, the <code> breakpoint command add</code> command takes lldb command line commands.
    326                     You can also specify this explicitly by passing the "<code>--command</code>" option.
    327                     Use "<code>--script</code>" if you want to implement your breakpoint command using the Python script instead.</p>
    328 
    329                     <p>This is an convenient point to bring up another feature of the lldb command help.  Do:</p>
    330 
    331                     <code>
    332                     (lldb) help break command add
    333                      <br>Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit.
    334                      <br>
    335                      <br>Syntax: breakpoint command add &lt;cmd-options&gt; &lt;breakpt-id&gt;
    336                      <br> etc...
    337                     </code>
    338                      
    339                      <p>When you see arguments to commands specified in the Syntax in angle 
    340                      brackets like <code>&lt;breakpt-id&gt;</code>, that indicates that
    341                      that is some common argument type that you can get further help on from the command system.  
    342                      So in this case you could do:</p>
    343 
    344                      <code>
    345                     (lldb) help &lt;breakpt-id&gt;
    346                     <br>&lt;breakpt-id&gt; -- Breakpoint ID's consist major and minor numbers;  the major
    347                     <br> etc...
    348                      </code>
    349 
    350 			    </div>
    351 				<div class="postfooter"></div>
    352 
    353                 <div class="post">
    354     				<h1 class ="postheader">Setting watchpoints</h1>
    355     				<div class="postcontent">
    356 
    357                     <p>In addition to breakpoints, you can use <code>help watchpoint</code>
    358                     to see all the commands for watchpoint manipulations.  For instance, we might do the following to watch
    359                     a variable called 'global' for write operation, but only stop if the condition '(global==5)' is true:</p>
    360 
    361                    <pre><tt>(lldb) watch set var global
    362 Watchpoint created: Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
    363     declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
    364 (lldb) watch modify -c '(global==5)'
    365 (lldb) watch list
    366 Current watchpoints:
    367 Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
    368     declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
    369     condition = '(global==5)'
    370 (lldb) c
    371 Process 15562 resuming
    372 (lldb) about to write to 'global'...
    373 Process 15562 stopped and was programmatically restarted.
    374 Process 15562 stopped and was programmatically restarted.
    375 Process 15562 stopped and was programmatically restarted.
    376 Process 15562 stopped and was programmatically restarted.
    377 Process 15562 stopped
    378 * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
    379     frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
    380    13  	
    381    14  	static void modify(int32_t &var) {
    382    15  	    ++var;
    383 -> 16  	}
    384    17  	
    385    18  	int main(int argc, char** argv) {
    386    19  	    int local = 0;
    387 (lldb) bt
    388 * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
    389     frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
    390     frame #1: 0x0000000100000eac a.out`main + 108 at main.cpp:25
    391     frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1
    392 (lldb) frame var global
    393 (int32_t) global = 5
    394 (lldb) watch list -v
    395 Current watchpoints:
    396 Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
    397     declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
    398     condition = '(global==5)'
    399     hw_index = 0  hit_count = 5     ignore_count = 0   
    400 (lldb) </tt></pre>
    401 			    </div>
    402 				<div class="postfooter"></div>
    403 
    404     			<div class="post">
    405     				<h1 class ="postheader">Starting or attaching to your Program</h1>
    406     				<div class="postcontent">
    407 
    408                     <p>To launch a program in lldb we use the "<code>process launch</code>" command or 
    409                         one of its built in aliases:</p>
    410 
    411                     <code>
    412                         (lldb) process launch
    413                         <br>(lldb) run
    414                         <br>(lldb) r
    415                     </code>
    416 
    417                     <p>You can also attach to a process by process ID or process name.
    418                         When attaching to a process by name, lldb also supports the "<code>--waitfor</code>" option which waits for the
    419                     next process that has that name to show up, and attaches to it</p>
    420 
    421                     <code>
    422                         (lldb) process attach --pid 123
    423                         <br>(lldb) process attach --name Sketch
    424                         <br>(lldb) process attach --name Sketch --waitfor
    425                     </code>
    426 
    427                     <p>After you launch or attach to a process, your process might stop
    428                         somewhere:</p>
    429                         <code>
    430                             (lldb) process attach -p 12345
    431                             <br>Process 46915 Attaching
    432                             <br>Process 46915 Stopped
    433                             <br>1 of 3 threads stopped with reasons:
    434                             <br>* thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
    435                         </code>
    436                         
    437                         
    438                     <p>Note the line that says "<code>1 of 3 threads stopped with reasons:</code>" and the
    439                     lines that follow it. In a multi-threaded environment it is very
    440                     common for more than one thread to hit your breakpoint(s) before the
    441                     kernel actually returns control to the debugger.  In that case, you
    442                     will see all the threads that stopped for some interesting reason
    443                     listed in the stop message.</p>
    444 
    445 				</div>
    446 				<div class="postfooter"></div>
    447 
    448     			<div class="post">
    449     				<h1 class ="postheader">Controlling your Program</h1>
    450     				<div class="postcontent">
    451 
    452 
    453                     <p>After launching, we can continue until we hit our breakpoint.  The primitive
    454                     commands for process control all exist under the "thread" command:</p>
    455 
    456                     <code>
    457                         (lldb) thread continue
    458                         <br>Resuming thread 0x2c03 in process 46915
    459                         <br>Resuming process 46915
    460                         <br>(lldb)
    461                     </code>
    462 
    463                     <p>At present you can only operate on one thread at a time, but the
    464                     design will ultimately support saying "step over the function in
    465                     Thread 1, and step into the function in Thread 2, and continue Thread
    466                     3" etc.  When we eventually support keeping some threads running while
    467                     others are stopped this will be particularly important.  For
    468                     convenience, however, all the stepping commands have easy aliases.  
    469                     So "thread continue" is just "c", etc.</p>
    470 
    471                     <p>The other program stepping commands are pretty much the same as in gdb.  
    472                     You've got:</p>
    473 
    474                     <pre><tt>(lldb) thread step-in    // The same as gdb's "step" or "s" 
    475 (lldb) thread step-over  // The same as gdb's "next" or "n"
    476 (lldb) thread step-out   // The same as gdb's "finish" or "f"
    477 </tt></pre>
    478 
    479                     <p>By default, lldb does defined aliases to all common gdb process control 
    480                         commands ("<code>s</code>", "<code>step</code>", "<code>n</code>", "<code>next</code>", "<code>finish</code>").
    481                         If we have missed any, please add them to your <code>~/.lldbinit</code> file
    482                         using the "<code>command alias</code>" command.
    483 
    484                     <p>lldb also supported the <i>step by instruction</i> versions:</p>
    485                     <pre><tt>(lldb) thread step-inst       // The same as gdb's "stepi" / "si"
    486 (lldb) thread step-over-inst  // The same as gdb's "nexti" / "ni"
    487 </tt></pre>
    488 
    489                     <p>Finally, lldb has a <i>run until line or frame exit</i> stepping mode:</p>
    490 
    491                     <code>
    492                         (lldb) thread until 100
    493                     </code>
    494 
    495                     <p>This command will run the thread in the current frame till it reaches line 100 in
    496                     this frame or stops if it leaves the current frame.  This is a pretty 
    497                     close equivalent to gdb's "<code>until</code>" command.</p>
    498 
    499                     <p>A process, by default, will shared the lldb terminal with the inferior
    500                         process. When in this mode, much like when debugging with gdb, when
    501                         the process is running anything you type will go to the STDIN of the
    502                         inferior process. To interrupt your inferior program, type CTRL+C.</p>
    503                         
    504                     <p>If you attach to a process, or launch a process with the &quot;<code>--no-stdin</code>&quot;
    505                         option, the command interpreter is always available to enter commands. This 
    506                         might be a little disconcerting to gdb users when always have an <code>(lldb)</code>
    507                         prompt. This allows you to set a breakpoint, etc without having to explicitly interrupt
    508                         the program you are debugging:</p>
    509 
    510                         <code>
    511                             (lldb) process continue
    512                             <br>(lldb) breakpoint set --name stop_here
    513                         </code>
    514                         
    515                     <p>There are many commands that won't work while running, and the command
    516                         interpreter should do a good job of letting you know when this is the
    517                         case. If you find any instances where the command interpreter isn't
    518                         doing its job, please file a bug. This way of operation will set us
    519                         up for a future debugging mode called <i>thread centric debugging</i>.
    520                         This mode will allow us to run all threads and only stop the threads
    521                         that are at breakpoints or have exceptions or signals.</p>
    522 
    523                     <p>The commands that currently work while running include
    524                         interrupting the process to halt execution ("<code>process interrupt</code>"),
    525                         getting the process status ("<code>process status</code>"),
    526                         breakpoint setting and clearing ("<code> breakpoint [set|clear|enable|disable|list] ...</code>"),
    527                         and memory reading and writing  ("<code> memory [read|write] ...</code>").
    528                         </p>
    529 
    530                     <p>The question of disabling stdio when running brings up a good opportunity to 
    531                         show how to set debugger properties in general.  
    532                         If you always want to run in the <code>--no-stdin</code> mode, you can set this
    533                         as a generic process property using the lldb &quot;<code>settings</code>&qout; command, 
    534                         which is equivalent to gdb's &quot;<code>set</code>&quot; command.  For instance, 
    535                         in this case you would say:</p>
    536                     
    537                     <code>
    538                     (lldb) settings set target.process.disable-stdio true
    539                     </code>
    540 
    541                     <p>Over time, gdb's &quot;<code>set</code> command became a wilderness of disordered options, 
    542                         so that there were useful options that even experienced gdb users didn't know about
    543                         because they were too hard to find.  We tried to organize the settings hierarchically
    544                         using the structure of the basic entities in the debugger.  For the most part anywhere
    545                         you can specify a setting on a generic entity (threads, for example) you can also apply
    546                         the option to a particular instance, which can also be convenient at times.
    547                         You can view the available settings with &quot;<code>settings list</code>&quot; and
    548                         there is help on the settings command explaining how it works more generally.</p>
    549 
    550     				</div>
    551     				<div class="postfooter"></div>
    552 
    553         			<div class="post">
    554         				<h1 class ="postheader">Examining Thread State</h1>
    555         				<div class="postcontent">
    556 
    557                     <p>Once you've stopped, lldb will choose a current thread, usually the
    558                     one that stopped "for a reason", and a current frame in that thread (on stop this is always the bottom-most frame).
    559                     Many the commands for inspecting state work on this current
    560                     thread/frame.</p>
    561 
    562                     <p>To inspect the current state of your process, you can start with the
    563                     threads:</p>
    564 
    565                     <pre><tt>(lldb) thread list
    566 Process 46915 state is Stopped
    567 * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
    568   thread #2: tid = 0x2e03, 0x00007fff85cbb08a, where = libSystem.B.dylib`kevent + 10, queue = com.apple.libdispatch-manager
    569   thread #3: tid = 0x2f03, 0x00007fff85cbbeaa, where = libSystem.B.dylib`__workq_kernreturn + 10
    570 </tt></pre>
    571 
    572                     <p>The * indicates that Thread 1 is the current thread.  To get a
    573                     backtrace for that thread, do:</p>
    574 
    575                     <pre><tt>(lldb) thread backtrace
    576 thread #1: tid = 0x2c03, stop reason = breakpoint 1.1, queue = com.apple.main-thread
    577  frame #0: 0x0000000100010d5b, where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405
    578  frame #1: 0x00007fff8602d152, where = AppKit`-[NSApplication sendAction:to:from:] + 95
    579  frame #2: 0x00007fff860516be, where = AppKit`-[NSMenuItem _corePerformAction] + 365
    580  frame #3: 0x00007fff86051428, where = AppKit`-[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 121
    581  frame #4: 0x00007fff860370c1, where = AppKit`-[NSMenu performKeyEquivalent:] + 272
    582  frame #5: 0x00007fff86035e69, where = AppKit`-[NSApplication _handleKeyEquivalent:] + 559
    583  frame #6: 0x00007fff85f06aa1, where = AppKit`-[NSApplication sendEvent:] + 3630
    584  frame #7: 0x00007fff85e9d922, where = AppKit`-[NSApplication run] + 474
    585  frame #8: 0x00007fff85e965f8, where = AppKit`NSApplicationMain + 364
    586  frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11
    587  frame #10: 0x0000000100000f20, where = Sketch`start + 52
    588 </tt></pre>
    589 
    590                     <p>You can also provide a list of threads to backtrace, or the keyword
    591                     "all" to see all threads:</p>
    592 
    593                     <code>
    594                         (lldb) thread backtrace all
    595                     </code>
    596 
    597                     <p>You can select the current thread, which will be used by default in all the commands in 
    598                     the next section, with the "thread select" command:</p>
    599 
    600                     <code>
    601                       (lldb) thread select 2
    602                     </code>
    603 
    604                     <p>where the thread index is just the one shown in the &quot;<code>thread list</code>&quot listing.
    605                     
    606 				</div>
    607 				<div class="postfooter"></div>
    608 
    609     			<div class="post">
    610     				<h1 class ="postheader">Examining Stack Frame State</h1>
    611     				<div class="postcontent">
    612 
    613 
    614                     <p>The most convenient way to inspect a frame's arguments and local variables is to use the "<code>frame variable</code>" command:</p>
    615 
    616                     <code>
    617                         (lldb) frame variable 
    618                         <br>self = (SKTGraphicView *) 0x0000000100208b40
    619                         <br>_cmd = (struct objc_selector *) 0x000000010001bae1
    620                         <br>sender = (id) 0x00000001001264e0
    621                         <br>selection = (NSArray *) 0x00000001001264e0
    622                         <br>i = (NSUInteger) 0x00000001001264e0
    623                         <br>c = (NSUInteger) 0x00000001001253b0
    624                     </code>
    625 
    626                     <p>As you see above, if you don't specify any variable names, all arguments 
    627                         and locals will be shown. If you call "<code>frame variable</code>" 
    628                         passing in the names of a particular local(s), only those variables
    629                         will be printed.  For instance:
    630                         </p>
    631 
    632                     <code>
    633                         (lldb) frame variable self
    634                         <br>(SKTGraphicView *) self = 0x0000000100208b40
    635                     </code>
    636 
    637                     <p>You can also pass in a path to some subelement of one of the available locals,
    638                       and that sub-element will be printed. For instance:
    639                       </p>
    640 
    641                     <code>
    642                         <br>(lldb) frame variable self.isa
    643                         <br>(struct objc_class *) self.isa = 0x0000000100023730
    644                     </code>
    645 
    646                     <p>The "<code>frame variable</code>" command is not a full expression 
    647                         parser but it does support a few simple operations like &amp;, *, ->, [] (no overloaded
    648                     operators). The array brackets can be used on pointers to treat pointers
    649                     as arrays:</p>
    650 
    651                     <code>
    652                         (lldb) frame variable *self
    653                         <br>(SKTGraphicView *) self = 0x0000000100208b40
    654                         <br>(NSView) NSView = {
    655                         <br>(NSResponder) NSResponder = {
    656                         <br>...
    657                         <br>
    658                         <br>(lldb) frame variable &amp;self
    659                         <br>(SKTGraphicView **) &amp;self = 0x0000000100304ab
    660                         <br>
    661                         <br>(lldb) frame variable argv[0]
    662                         <br>(char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch"
    663                     </code>
    664 
    665                     <p>The frame variable command will also perform "object printing" operations on
    666                     variables (currently we only support ObjC printing, using the object's "description" method.
    667                     Turn this on by passing the -o flag to frame variable:</p>
    668 
    669                     <code>
    670                         (lldb) frame variable -o self
    671                         (SKTGraphicView *) self = 0x0000000100208b40 &lt;SKTGraphicView: 0x100208b40&gt;
    672                     </code>
    673 
    674                     <p>You can select another frame to view with the "<code>frame select</code>" command</p>
    675 
    676                     <code>
    677                         (lldb) frame select 9
    678                         <br>frame #9: 0x0000000100015ae3, where = Sketch`function1 + 33 at /Projects/Sketch/SKTFunctions.m:11
    679                     </code>
    680 
    681                     <p>You can also move up and down the stack by passing the &quot;<code>--relative</code>&quot; (&quot;<code>-r</code>&quot;)
    682                       option.  And we have built-in aliases &quot;<code>u</code>&quot; and &quot;<code>d</code>&quot; which
    683                       behave like their gdb equivalents.
    684 
    685                     <p>If you need to view more complex data or change program data, you can
    686                     use the general "expression" command.  It takes an expression and
    687                     evaluates it in the scope of the currently selected frame.  For instance:</p>
    688 
    689                     <code>
    690                         (lldb) expr self
    691                         <br>$0 = (SKTGraphicView *) 0x0000000100135430
    692                         <br>(lldb) expr self = 0x00
    693                         <br>$1 = (SKTGraphicView *) 0x0000000000000000
    694                         <br>(lldb) frame var self
    695                         <br>(SKTGraphicView *) self = 0x0000000000000000
    696                     </code>
    697 
    698                     <p>You can also call functions:</p>
    699 
    700                     <code>
    701                         (lldb) expr (int) printf ("I have a pointer 0x%llx.\n", self)
    702                         <br>$2 = (int) 22
    703                         <br>I have a pointer 0x0.
    704                     </code>
    705 
    706                     <p>As I said above, &quot;expression&quot; is one of the &quot;raw&quot; commands.  So
    707                     you don't have to quote your whole expression, nor backslash protect quotes,
    708                     etc...</p>
    709 
    710                     <p>Finally, the results of the expressions are stored in persistent variables
    711                     (of the form $[0-9]+) that you can use in further expressions, like:</p>
    712 
    713                     <code>
    714                         (lldb) expr self = $0
    715                         <br>$4 = (SKTGraphicView *) 0x0000000100135430
    716 				    </code>
    717                     <p>
    718                 </div>
    719           	    <div class="postfooter"></div>
    720     			
    721             </div>
    722       	</div>
    723 	</div>
    724 </div>
    725 </body>
    726 </html>
    727