<!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 share 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>&quot; 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>
