<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="style.css" rel="stylesheet" type="text/css" />
<title>LLDB Tutorial</title>
</head>

<body>
    <div class="www_title">
      The <strong>LLDB</strong> Debugger
    </div>
    
<div id="container">
	<div id="content">
         <!--#include virtual="sidebar.incl"-->
		<div id="middle">
			<div class="post">
				<h1 class ="postheader">Getting Started</h1>
				<div class="postcontent">

                    <p>Here's a short precis of how to run lldb if you are familiar with the gdb command set.
                        We will start with some details on lldb command structure and syntax to help orient you.</p>

				</div>
				<div class="postfooter"></div>

    			<div class="post">
    				<h1 class ="postheader">Command Structure</h1>
    				<div class="postcontent">

				   <p>Unlike gdb's command set, which is rather free-form, we tried to make
                   the lldb command syntax fairly structured.  The commands are all of the
                   form:</p>

                   <code color=#ff0000>
                   &lt;noun&gt; &lt;verb&gt; [-options [option-value]] [argument [argument...]]
                   </code>

                   <p>The command line parsing is done before command execution, so it is
                   uniform across all the commands.  The command syntax for basic commands is very simple,
                   arguments, options and option values are all white-space
                   separated, and double-quotes are used to protect white-spaces in an argument.  
                   If you need to put a backslash or double-quote character
                   in an argument you back-slash it in the argument.  That makes the
                   command syntax more regular, but it also means you may have to
                   quote some arguments in lldb that you wouldn't in gdb.</p>

                   <p>Options can be placed anywhere on the command line, but if the arguments
                   begin with a "<code>-</code>" then you have to tell lldb that you're done with options
                   for the current command by adding an option termination: "<code>--</code>"
                   So for instance if you want to launch a process and give the "process launch" command 
                   the "<code>--stop-at-entry</code>" option, yet you want the
                   process you are about to launch to be launched with the arguments 
                   "<code>-program_arg value</code>", you would type:</p>

                   <code>
                       (lldb) process launch --stop-at-entry -- -program_arg value
                   </code>

                   <p>We also tried to reduce the number of special purpose argument
                   parsers, which sometimes forces the user to be a little more explicit
                   about stating their intentions.  The first instance you'll note of
                   this is the breakpoint command.  In gdb, to set a breakpoint, you
                   might enter</p>

                   <code>
                       (gdb) break foo.c:12
                   </code>
                   <p>to break at line 12 of foo.c, and:</p>
                   <code>
                       (gdb) break foo
                   </code>

                   <p>to break at the function <code>foo</code>.  As time went on, the parser that tells <code>foo.c:12</code>
                   from <code>foo</code> from <code>foo.c::foo</code> (which means the function foo in the file
                   foo.c) got more and more complex and bizarre, and especially in C++
                   there are times where there's really no way to specify the function
                   you want to break on. The lldb commands are more verbose but also more precise
                   and allow for intelligent auto completion.
                   
                   <p>To set the same file and line breakpoint in LLDB you can enter either of:</p>

                   <code>
                      (lldb) breakpoint set --file foo.c --line 12
                      <br>(lldb) breakpoint set -f foo.c -l 12
                  </code>

                   <p>To set a breakpoint on a function named <code>foo</code> in LLDB you can enter either of:</p>

                    <code>
                        (lldb) breakpoint set --name foo
                        <br>(lldb) breakpoint set -n foo
                    </code>

                   <p>You can use the --name option multiple times to make a breakpoint on a set of functions as well.  This is convenient
                      since it allows you to set commmon conditions or commands without having to specify them multiple times:</p>

                    <code>
                        (lldb) breakpoint set --name foo --name bar
                    </code>

                   <p>Setting breakpoints by name is even more specialized in LLDB as you can specify
                       that you want to set a breakpoint at a function by method name. To set a breakpoint
                       on all C++ methods named <code>foo</code> you can enter either of:</p>

                   <code>
                       (lldb) breakpoint set --method foo
                       <br>(lldb) breakpoint set -M foo
                  </code>

                   <p>To set a breakpoint Objective C selectors named <code>alignLeftEdges:</code> you can enter either of:</p>

                   <code>
                       (lldb) breakpoint set --selector alignLeftEdges:
                       <br>(lldb) breakpoint set -S alignLeftEdges:
                  </code>

                   <p>You can limit any breakpoints to a specific executable image by using
                       the "<code>--shlib &lt;path&gt;</code>" ("<code>-s &lt;path&gt;</code>" for short):</p>

                   <code>
                      (lldb) breakpoint set --shlib foo.dylib --name foo
                      <br>(lldb) breakpoint set -s foo.dylib -n foo
                  </code>

                   <p>The <code>--shlib</code> option can also be repeated to specify several shared libraries.</p>

                   <p>Suggestions on more interesting primitives of this sort are also very welcome.</p>

                   <p>Just like gdb, the lldb command interpreter does a shortest unique
                   string match on command names, so the following two commands will
                   both execute the same command:</p>

                   <code>
                       (lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]"
                       <br>(lldb) br s -n "-[SKTGraphicView alignLeftEdges:]"
                  </code>

                   <p>lldb also supports command completion for source file names, symbol
                   names, file names, etc. Completion is initiated by a hitting a <b>TAB</b>.
                   Individual options in a command can have different completers, so for
                   instance the "<code>--file &lt;path&gt;</code>" option in "breakpoint" completes to source files, the
                   "<code>--shlib &lt;path&gt;</code>" option to currently loaded shared libraries, etc.  We can even do 
                   things like if you specify "<code>--shlib &lt;path&gt;</code>", and are completing on "<code>--file &lt;path&gt;</code>", we will only
                   list source files in the shared library specified by "<code>--shlib &lt;path&gt;</code>".</p>

                   <p>The individual commands are pretty extensively documented.  You can
                   use the <code>help</code> command to get an overview of which commands are
                   available or to obtain details about specific commands.  There is also an
                   <code>apropos</code> command that will search the help text for all commands
                   for a particular word and dump a summary help string for each matching
                   command.</p>

                   <p>Finally, there is a mechanism to construct aliases for commonly used
                   commands.  So for instance if you get annoyed typing:</p>

                   <code>
                       (lldb) breakpoint set --file foo.c --line 12
                   </code>

                   <p>you can do:</p>

                   <code>
                       (lldb) command alias bfl breakpoint set -f %1 -l %2
                       <br>(lldb) bfl foo.c 12
                   </code>

                   <p>We have added a few aliases for commonly used commands (e.g. "step",
                   "next" and "continue") but we haven't tried to be exhaustive because
                   in our experience it is more convenient to make the basic commands
                   unique down to a letter or two, and then learn these sequences than
                   to fill the namespace with lots of aliases, and then have to type them
                   all the way out.</p>

                   <p>However, users are free to customize lldb's command set however they
                   like, and since lldb reads the file ~/.lldbinit at startup, you can
                   store all your aliases there and they will be generally available to
                   you.  Your aliases are also documented in the help command so you can
                   remind yourself of what you've set up.</p>

                   <p> One alias of note that we do include by popular demand is a weak emulator
                   of gdb's &quot;break&quot; command.  It doesn't try to do everything that gdb's
                   break command does (for instance, it doesn't handle <code>foo.c::bar</code>.  But
                   it mostly works, and makes the transition easier.  Also by popular demand, it
                   is aliased to <code>b</code>.  If you actually want to learn the lldb command
                   set natively, that means it will get in the way of the rest of the breakpoint
                   commands.  Fortunately, if you don't like one of our aliases, you an easily
                   get rid of it by running (for example):</p>

                   <code>
                    (lldb) command unalias b
                   </code>

                   <p>I actually also do:</p>

                   <code>
                     (lldb) command alias b breakpoint
                   </code>

                   <p>so I can run the native lldb breakpoint command with just <code>b</code></p>
                     
                   <p>The lldb command parser also supports "raw" commands, where, after command options
                   are stripped off, the rest of the command string is passed uninterpreted to the command.
                   This is convenient for commands whose arguments might be some complex expression that would
                   be painful to backslash protect.
                   For instance the "expression" command is a "raw" command for obvious reasons.  The
                   "help" output for a command will tell you if it is "raw" or not, so you know what to expect.
                   The one thing you have to watch out for is that since raw commands still can have options,
                   if your command string has dashes in it, you'll have to indicate these are not option
                   markers by putting "--" after the command name, but before your command string.  

                   <p>lldb also has a built-in Python interpreter, which is accessible by
                   the "script" command.  All the functionality of the debugger is
                   available as classes in the Python interpreter, so the more complex
                   commands that in gdb you would introduce with the "define" command can
                   be done by writing Python functions using the lldb-Python library,
                   then loading the scripts into your running session and accessing them
                   with the "script" command.</p>

                   <p>Having given an overview of lldb's command syntax, we proceed to lay out the stages
                   of a standard debug session.</p>

				</div>
				<div class="postfooter"></div>


    			<div class="post">
    				<h1 class ="postheader">Loading a program into lldb</h1>
    				<div class="postcontent">

                    <p>First we need to set the program to debug. As with gdb, you
                         can start lldb and specify the file you wish to debug on the command line:</p>

                    <code>
                        $ lldb /Projects/Sketch/build/Debug/Sketch.app
                        <br>Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64).
                    </code>

                    <p>or you can specify it after the fact with the "file" command:</p>

                    <code>
                        $ lldb
                        <br>(lldb) file /Projects/Sketch/build/Debug/Sketch.app
                        <br>Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64).
                    </code>
                <p>
				</div>
				<div class="postfooter"></div>

    			<div class="post">
    				<h1 class ="postheader">Setting breakpoints</h1>
    				<div class="postcontent">

                    <p>We've discussed how to set breakpoints above.  You can use <code>help breakpoint set</code>
                    to see all the options for breakpoint setting.  For instance, we might do:</p>

                    <code>
                        (lldb) breakpoint set --selector alignLeftEdges:
                        <br>Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1
                    </code>

                    <p>You can find out about the breakpoints you've set with:</p>

                    <pre><tt>(lldb) breakpoint list
Current breakpoints:
1: name = 'alignLeftEdges:', locations = 1, resolved = 1
  1.1: where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405, address = 0x0000000100010d5b, resolved, hit count = 0 
</tt></pre>

                    <p>Note that setting a breakpoint creates a <i>logical</i> breakpoint, which could
                    resolve to one or more <i>locations</i>.  For instance, break by selector would
                    set a breakpoint on all the methods that implement that selector in the classes in
                    your program.  Similarly, a file and line breakpoint might result in multiple
                    locations if that file and line were inlined in different places in your code.</p>

                    <p>The logical breakpoint has an integer id, and it's locations have an
                    id within their parent breakpoint (the two are joined by a ".",
                    e.g. 1.1 in the example above.)  </p>

                    <p>Also the logical breakpoints remain <i>live</i> so that if another shared library
                    were to be loaded that had another implementation of the
                    "<code>alignLeftEdges:</code>" selector, the new location would be added to
                    breakpoint 1 (e.g. a "1.2" breakpoint would be set on the newly loaded
                    selector).</p>

                    <p>The other piece of information in the breakpoint listing is whether the
                    breakpoint location was <i>resolved</i> or not.  A location gets resolved when
                    the file address it corresponds to gets loaded into the program you are
                    debugging.  For instance if you set a breakpoint in a shared library that 
                    then gets unloaded, that breakpoint location will remain, but it will no 
                    longer be <i>resolved</i>.</p>

                    <p>One other thing to note for gdb users is that lldb acts like gdb with:</p>

                    <code>
                        (gdb) set breakpoint pending on
                    </code>

                    <p>That is, lldb will always make a breakpoint from your specification, even
                    if it couldn't find any locations that match the specification.  You can tell
                    whether the expression was resolved or not by checking the locations field
                    in "breakpoint list", and we report the breakpoint as "pending" when you
                    set it so you can tell you've made a typo more easily, if that was indeed 
                    the reason no locations were found:</p>

                    <code>
                        (lldb) breakpoint set --file foo.c --line 12
                        <br>Breakpoint created: 2: file ='foo.c', line = 12, locations = 0 (pending)
                        <br>WARNING:  Unable to resolve breakpoint to any actual locations.
                    </code>

                    <p>You can delete, disable, set conditions and ignore counts either on all the
                    locations generated by your logical breakpoint, or on any one of the particular locations
                    your specification resolved to.  For instance if we wanted to add a command
                    to print a backtrace when we hit this breakpoint we could do:</p>

                    <code>
                        (lldb) breakpoint command add 1.1
                        <br>Enter your debugger command(s).  Type 'DONE' to end.
                        <br>&gt; bt
                        <br>&gt; DONE
                    </code>

                    <p>By default, the <code> breakpoint command add</code> command takes lldb command line commands.
                    You can also specify this explicitly by passing the "<code>--command</code>" option.
                    Use "<code>--script</code>" if you want to implement your breakpoint command using the Python script instead.</p>

                    <p>This is an convenient point to bring up another feature of the lldb command help.  Do:</p>

                    <code>
                    (lldb) help break command add
                     <br>Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit.
                     <br>
                     <br>Syntax: breakpoint command add &lt;cmd-options&gt; &lt;breakpt-id&gt;
                     <br> etc...
                    </code>
                     
                     <p>When you see arguments to commands specified in the Syntax in angle 
                     brackets like <code>&lt;breakpt-id&gt;</code>, that indicates that
                     that is some common argument type that you can get further help on from the command system.  
                     So in this case you could do:</p>

                     <code>
                    (lldb) help &lt;breakpt-id&gt;
                    <br>&lt;breakpt-id&gt; -- Breakpoint ID's consist major and minor numbers;  the major
                    <br> etc...
                     </code>

			    </div>
				<div class="postfooter"></div>

                <div class="post">
    				<h1 class ="postheader">Setting watchpoints</h1>
    				<div class="postcontent">

                    <p>In addition to breakpoints, you can use <code>help watchpoint</code>
                    to see all the commands for watchpoint manipulations.  For instance, we might do the following to watch
                    a variable called 'global' for write operation, but only stop if the condition '(global==5)' is true:</p>

                   <pre><tt>(lldb) watch set var global
Watchpoint created: Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
    declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
(lldb) watch modify -c '(global==5)'
(lldb) watch list
Current watchpoints:
Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
    declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
    condition = '(global==5)'
(lldb) c
Process 15562 resuming
(lldb) about to write to 'global'...
Process 15562 stopped and was programmatically restarted.
Process 15562 stopped and was programmatically restarted.
Process 15562 stopped and was programmatically restarted.
Process 15562 stopped and was programmatically restarted.
Process 15562 stopped
* thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
    frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
   13  	
   14  	static void modify(int32_t &var) {
   15  	    ++var;
-> 16  	}
   17  	
   18  	int main(int argc, char** argv) {
   19  	    int local = 0;
(lldb) bt
* thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
    frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
    frame #1: 0x0000000100000eac a.out`main + 108 at main.cpp:25
    frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1
(lldb) frame var global
(int32_t) global = 5
(lldb) watch list -v
Current watchpoints:
Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
    declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
    condition = '(global==5)'
    hw_index = 0  hit_count = 5     ignore_count = 0   
(lldb) </tt></pre>
			    </div>
				<div class="postfooter"></div>

    			<div class="post">
    				<h1 class ="postheader">Starting or attaching to your Program</h1>
    				<div class="postcontent">

                    <p>To launch a program in lldb we use the "<code>process launch</code>" command or 
                        one of its built in aliases:</p>

                    <code>
                        (lldb) process launch
                        <br>(lldb) run
                        <br>(lldb) r
                    </code>

                    <p>You can also attach to a process by process ID or process name.
                        When attaching to a process by name, lldb also supports the "<code>--waitfor</code>" option which waits for the
                    next process that has that name to show up, and attaches to it</p>

                    <code>
                        (lldb) process attach --pid 123
                        <br>(lldb) process attach --name Sketch
                        <br>(lldb) process attach --name Sketch --waitfor
                    </code>

                    <p>After you launch or attach to a process, your process might stop
                        somewhere:</p>
                        <code>
                            (lldb) process attach -p 12345
                            <br>Process 46915 Attaching
                            <br>Process 46915 Stopped
                            <br>1 of 3 threads stopped with reasons:
                            <br>* thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
                        </code>
                        
                        
                    <p>Note the line that says "<code>1 of 3 threads stopped with reasons:</code>" and the
                    lines that follow it. In a multi-threaded environment it is very
                    common for more than one thread to hit your breakpoint(s) before the
                    kernel actually returns control to the debugger.  In that case, you
                    will see all the threads that stopped for some interesting reason
                    listed in the stop message.</p>

				</div>
				<div class="postfooter"></div>

    			<div class="post">
    				<h1 class ="postheader">Controlling your Program</h1>
    				<div class="postcontent">


                    <p>After launching, we can continue until we hit our breakpoint.  The primitive
                    commands for process control all exist under the "thread" command:</p>

                    <code>
                        (lldb) thread continue
                        <br>Resuming thread 0x2c03 in process 46915
                        <br>Resuming process 46915
                        <br>(lldb)
                    </code>

                    <p>At present you can only operate on one thread at a time, but the
                    design will ultimately support saying "step over the function in
                    Thread 1, and step into the function in Thread 2, and continue Thread
                    3" etc.  When we eventually support keeping some threads running while
                    others are stopped this will be particularly important.  For
                    convenience, however, all the stepping commands have easy aliases.  
                    So "thread continue" is just "c", etc.</p>

                    <p>The other program stepping commands are pretty much the same as in gdb.  
                    You've got:</p>

                    <pre><tt>(lldb) thread step-in    // The same as gdb's "step" or "s" 
(lldb) thread step-over  // The same as gdb's "next" or "n"
(lldb) thread step-out   // The same as gdb's "finish" or "f"
</tt></pre>

                    <p>By default, lldb does defined aliases to all common gdb process control 
                        commands ("<code>s</code>", "<code>step</code>", "<code>n</code>", "<code>next</code>", "<code>finish</code>").
                        If we have missed any, please add them to your <code>~/.lldbinit</code> file
                        using the "<code>command alias</code>" command.

                    <p>lldb also supported the <i>step by instruction</i> versions:</p>
                    <pre><tt>(lldb) thread step-inst       // The same as gdb's "stepi" / "si"
(lldb) thread step-over-inst  // The same as gdb's "nexti" / "ni"
</tt></pre>

                    <p>Finally, lldb has a <i>run until line or frame exit</i> stepping mode:</p>

                    <code>
                        (lldb) thread until 100
                    </code>

                    <p>This command will run the thread in the current frame till it reaches line 100 in
                    this frame or stops if it leaves the current frame.  This is a pretty 
                    close equivalent to gdb's "<code>until</code>" command.</p>

                    <p>A process, by default, will shared the lldb terminal with the inferior
                        process. When in this mode, much like when debugging with gdb, when
                        the process is running anything you type will go to the STDIN of the
                        inferior process. To interrupt your inferior program, type CTRL+C.</p>
                        
                    <p>If you attach to a process, or launch a process with the &quot;<code>--no-stdin</code>&quot;
                        option, the command interpreter is always available to enter commands. This 
                        might be a little disconcerting to gdb users when always have an <code>(lldb)</code>
                        prompt. This allows you to set a breakpoint, etc without having to explicitly interrupt
                        the program you are debugging:</p>

                        <code>
                            (lldb) process continue
                            <br>(lldb) breakpoint set --name stop_here
                        </code>
                        
                    <p>There are many commands that won't work while running, and the command
                        interpreter should do a good job of letting you know when this is the
                        case. If you find any instances where the command interpreter isn't
                        doing its job, please file a bug. This way of operation will set us
                        up for a future debugging mode called <i>thread centric debugging</i>.
                        This mode will allow us to run all threads and only stop the threads
                        that are at breakpoints or have exceptions or signals.</p>

                    <p>The commands that currently work while running include
                        interrupting the process to halt execution ("<code>process interrupt</code>"),
                        getting the process status ("<code>process status</code>"),
                        breakpoint setting and clearing ("<code> breakpoint [set|clear|enable|disable|list] ...</code>"),
                        and memory reading and writing  ("<code> memory [read|write] ...</code>").
                        </p>

                    <p>The question of disabling stdio when running brings up a good opportunity to 
                        show how to set debugger properties in general.  
                        If you always want to run in the <code>--no-stdin</code> mode, you can set this
                        as a generic process property using the lldb &quot;<code>settings</code>&qout; command, 
                        which is equivalent to gdb's &quot;<code>set</code>&quot; command.  For instance, 
                        in this case you would say:</p>
                    
                    <code>
                    (lldb) settings set target.process.disable-stdio true
                    </code>

                    <p>Over time, gdb's &quot;<code>set</code> command became a wilderness of disordered options, 
                        so that there were useful options that even experienced gdb users didn't know about
                        because they were too hard to find.  We tried to organize the settings hierarchically
                        using the structure of the basic entities in the debugger.  For the most part anywhere
                        you can specify a setting on a generic entity (threads, for example) you can also apply
                        the option to a particular instance, which can also be convenient at times.
                        You can view the available settings with &quot;<code>settings list</code>&quot; and
                        there is help on the settings command explaining how it works more generally.</p>

    				</div>
    				<div class="postfooter"></div>

        			<div class="post">
        				<h1 class ="postheader">Examining Thread State</h1>
        				<div class="postcontent">

                    <p>Once you've stopped, lldb will choose a current thread, usually the
                    one that stopped "for a reason", and a current frame in that thread (on stop this is always the bottom-most frame).
                    Many the commands for inspecting state work on this current
                    thread/frame.</p>

                    <p>To inspect the current state of your process, you can start with the
                    threads:</p>

                    <pre><tt>(lldb) thread list
Process 46915 state is Stopped
* thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
  thread #2: tid = 0x2e03, 0x00007fff85cbb08a, where = libSystem.B.dylib`kevent + 10, queue = com.apple.libdispatch-manager
  thread #3: tid = 0x2f03, 0x00007fff85cbbeaa, where = libSystem.B.dylib`__workq_kernreturn + 10
</tt></pre>

                    <p>The * indicates that Thread 1 is the current thread.  To get a
                    backtrace for that thread, do:</p>

                    <pre><tt>(lldb) thread backtrace
thread #1: tid = 0x2c03, stop reason = breakpoint 1.1, queue = com.apple.main-thread
 frame #0: 0x0000000100010d5b, where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405
 frame #1: 0x00007fff8602d152, where = AppKit`-[NSApplication sendAction:to:from:] + 95
 frame #2: 0x00007fff860516be, where = AppKit`-[NSMenuItem _corePerformAction] + 365
 frame #3: 0x00007fff86051428, where = AppKit`-[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 121
 frame #4: 0x00007fff860370c1, where = AppKit`-[NSMenu performKeyEquivalent:] + 272
 frame #5: 0x00007fff86035e69, where = AppKit`-[NSApplication _handleKeyEquivalent:] + 559
 frame #6: 0x00007fff85f06aa1, where = AppKit`-[NSApplication sendEvent:] + 3630
 frame #7: 0x00007fff85e9d922, where = AppKit`-[NSApplication run] + 474
 frame #8: 0x00007fff85e965f8, where = AppKit`NSApplicationMain + 364
 frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11
 frame #10: 0x0000000100000f20, where = Sketch`start + 52
</tt></pre>

                    <p>You can also provide a list of threads to backtrace, or the keyword
                    "all" to see all threads:</p>

                    <code>
                        (lldb) thread backtrace all
                    </code>

                    <p>You can select the current thread, which will be used by default in all the commands in 
                    the next section, with the "thread select" command:</p>

                    <code>
                      (lldb) thread select 2
                    </code>

                    <p>where the thread index is just the one shown in the &quot;<code>thread list</code>&quot listing.
                    
				</div>
				<div class="postfooter"></div>

    			<div class="post">
    				<h1 class ="postheader">Examining Stack Frame State</h1>
    				<div class="postcontent">


                    <p>The most convenient way to inspect a frame's arguments and local variables is to use the "<code>frame variable</code>" command:</p>

                    <code>
                        (lldb) frame variable 
                        <br>self = (SKTGraphicView *) 0x0000000100208b40
                        <br>_cmd = (struct objc_selector *) 0x000000010001bae1
                        <br>sender = (id) 0x00000001001264e0
                        <br>selection = (NSArray *) 0x00000001001264e0
                        <br>i = (NSUInteger) 0x00000001001264e0
                        <br>c = (NSUInteger) 0x00000001001253b0
                    </code>

                    <p>As you see above, if you don't specify any variable names, all arguments 
                        and locals will be shown. If you call "<code>frame variable</code>" 
                        passing in the names of a particular local(s), only those variables
                        will be printed.  For instance:
                        </p>

                    <code>
                        (lldb) frame variable self
                        <br>(SKTGraphicView *) self = 0x0000000100208b40
                    </code>

                    <p>You can also pass in a path to some subelement of one of the available locals,
                      and that sub-element will be printed. For instance:
                      </p>

                    <code>
                        <br>(lldb) frame variable self.isa
                        <br>(struct objc_class *) self.isa = 0x0000000100023730
                    </code>

                    <p>The "<code>frame variable</code>" command is not a full expression 
                        parser but it does support a few simple operations like &amp;, *, ->, [] (no overloaded
                    operators). The array brackets can be used on pointers to treat pointers
                    as arrays:</p>

                    <code>
                        (lldb) frame variable *self
                        <br>(SKTGraphicView *) self = 0x0000000100208b40
                        <br>(NSView) NSView = {
                        <br>(NSResponder) NSResponder = {
                        <br>...
                        <br>
                        <br>(lldb) frame variable &amp;self
                        <br>(SKTGraphicView **) &amp;self = 0x0000000100304ab
                        <br>
                        <br>(lldb) frame variable argv[0]
                        <br>(char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch"
                    </code>

                    <p>The frame variable command will also perform "object printing" operations on
                    variables (currently we only support ObjC printing, using the object's "description" method.
                    Turn this on by passing the -o flag to frame variable:</p>

                    <code>
                        (lldb) frame variable -o self
                        (SKTGraphicView *) self = 0x0000000100208b40 &lt;SKTGraphicView: 0x100208b40&gt;
                    </code>

                    <p>You can select another frame to view with the "<code>frame select</code>" command</p>

                    <code>
                        (lldb) frame select 9
                        <br>frame #9: 0x0000000100015ae3, where = Sketch`function1 + 33 at /Projects/Sketch/SKTFunctions.m:11
                    </code>

                    <p>You can also move up and down the stack by passing the &quot;<code>--relative</code>&quot; (&quot;<code>-r</code>&quot;)
                      option.  And we have built-in aliases &quot;<code>u</code>&quot; and &quot;<code>d</code>&quot; which
                      behave like their gdb equivalents.

                    <p>If you need to view more complex data or change program data, you can
                    use the general "expression" command.  It takes an expression and
                    evaluates it in the scope of the currently selected frame.  For instance:</p>

                    <code>
                        (lldb) expr self
                        <br>$0 = (SKTGraphicView *) 0x0000000100135430
                        <br>(lldb) expr self = 0x00
                        <br>$1 = (SKTGraphicView *) 0x0000000000000000
                        <br>(lldb) frame var self
                        <br>(SKTGraphicView *) self = 0x0000000000000000
                    </code>

                    <p>You can also call functions:</p>

                    <code>
                        (lldb) expr (int) printf ("I have a pointer 0x%llx.\n", self)
                        <br>$2 = (int) 22
                        <br>I have a pointer 0x0.
                    </code>

                    <p>As I said above, &quot;expression&quot; is one of the &quot;raw&quot; commands.  So
                    you don't have to quote your whole expression, nor backslash protect quotes,
                    etc...</p>

                    <p>Finally, the results of the expressions are stored in persistent variables
                    (of the form $[0-9]+) that you can use in further expressions, like:</p>

                    <code>
                        (lldb) expr self = $0
                        <br>$4 = (SKTGraphicView *) 0x0000000100135430
				    </code>
                    <p>
                </div>
          	    <div class="postfooter"></div>
    			
            </div>
      	</div>
	</div>
</div>
</body>
</html>
