4 This document describes how to use LLDB if you are already familiar with
5 GDB's command set. We will start with some details on LLDB command structure and
11 Unlike GDB's quite free-form commands, LLDB's are more structured. All commands
16 <noun> <verb> [-options [option-value]] [argument [argument...]]
18 The command line parsing is done before command execution, so it is the same for
19 all commands. The command syntax for basic commands is very simple.
21 * Arguments, options and option values are all white-space separated.
22 * Either single ``'`` or double-quotes ``"`` (in pairs) are used to protect white-spaces
24 * Escape backslashes and double quotes within arguments should be escaped
25 with a backslash ``\``.
27 This makes LLDB's commands more regular, but it also means you may have to quote
28 some arguments in LLDB that you would not in GDB.
30 There is one other special quote character in LLDB - the backtick `````.
31 If you put backticks around an argument or option value, LLDB will run the text
32 of the value through the expression parser, and the result of the expression
33 will be passed to the command. So for instance, if ``len`` is a local
34 ``int`` variable with the value ``5``, then the command:
38 (lldb) memory read -c `len` 0x12345
40 Will receive the value ``5`` for the count option, rather than the string ``len``.
42 Options can be placed anywhere on the command line, but if the arguments begin
43 with a ``-`` then you have to tell LLDB that you are done with options for the
44 current command by adding an option termination: ``--``.
46 So for instance, if you want to launch a process and give the ``process launch``
47 command the ``--stop-at-entry`` option, yet you want the process you are about
48 to launch to be launched with the arguments ``-program_arg value``, you would type:
52 (lldb) process launch --stop-at-entry -- -program_arg value
54 We also tried to reduce the number of special purpose argument parsers, which
55 sometimes forces the user to be explicit about their intentions. The first
56 instance you willl see of this is the breakpoint command. In GDB, to set a
57 breakpoint, you might enter:
63 To break at line ``12`` of ``foo.c``, and:
69 To break at the function ``foo``. As time went on, the parser that tells ``foo.c:12``
70 from ``foo`` from ``foo.c::foo`` (which means the function ``foo`` in the file ``foo.c``)
71 got more and more complex. Especially in C++ there are times where there is
72 really no way to specify the function you want to break on.
74 The LLDB commands are more verbose but also more precise and allow for
75 intelligent auto completion.
77 To set the same file and line breakpoint in LLDB you can enter either of:
81 (lldb) breakpoint set --file foo.c --line 12
82 (lldb) breakpoint set -f foo.c -l 12
84 To set a breakpoint on a function named ``foo`` in LLDB you can enter either of:
88 (lldb) breakpoint set --name foo
89 (lldb) breakpoint set -n foo
91 You can use the ``--name`` option multiple times to make a breakpoint on a set of
92 functions as well. This is convenient since it allows you to set common
93 conditions or commands without having to specify them multiple times:
97 (lldb) breakpoint set --name foo --name bar
99 Setting breakpoints by name is even more specialized in LLDB as you can specify
100 that you want to set a breakpoint at a function by method name. To set a
101 breakpoint on all C++ methods named ``foo`` you can enter either of:
105 (lldb) breakpoint set --method foo
106 (lldb) breakpoint set -M foo
109 To set a breakpoint Objective-C selectors named ``alignLeftEdges:`` you can enter either of:
113 (lldb) breakpoint set --selector alignLeftEdges:
114 (lldb) breakpoint set -S alignLeftEdges:
116 You can limit any breakpoints to a specific executable image by using the
117 ``--shlib <path>`` (``-s <path>`` for short):
121 (lldb) breakpoint set --shlib foo.dylib --name foo
122 (lldb) breakpoint set -s foo.dylib -n foo
124 The ``--shlib`` option can also be repeated to specify several shared libraries.
126 Suggestions on more interesting primitives of this sort are also very welcome.
128 Just like GDB, the LLDB command interpreter does a shortest unique string match
129 on command names, so the following two commands will both execute the same
134 (lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]"
135 (lldb) br s -n "-[SKTGraphicView alignLeftEdges:]"
137 LLDB also supports command completion for source file names, symbol names, file
138 names, etc. Completion is initiated by hitting TAB. Individual options in a
139 command can have different completers, so for instance, the ``--file <path>``
140 option in ``breakpoint`` completes to source files, the ``--shlib <path>`` option
141 to currently loaded shared libraries, etc. You can even do things like if you
142 specify ``--shlib <path>``, and are completing on ``--file <path>``, LLDB will only
143 list source files in the shared library specified by ``--shlib <path>``.
145 The individual commands are pretty extensively documented. You can use the ``help``
146 command to get an overview of which commands are available or to obtain details
147 about specific commands. There is also an ``apropos`` command that will search the
148 help text for all commands for a particular word and dump a summary help string
149 for each matching command.
151 Finally, there is a mechanism to construct aliases for commonly used commands.
152 For instance, if you get annoyed typing:
156 (lldb) breakpoint set --file foo.c --line 12
162 (lldb) command alias bfl breakpoint set -f %1 -l %2
165 LLDB has a few aliases for commonly used commands (e.g. ``step``, ``next`` and
166 ``continue``) but it does not try to be exhaustive because in our experience it
167 is more convenient to make the basic commands unique down to a letter or two,
168 and then learn these sequences than to fill the namespace with lots of aliases,
169 and then have to type them all the way out.
171 If the alias abbreviation or the full alias command collides with another
172 existing command, the command resolver will prefer to use the alias over any
173 other command as far as there is only one alias command match.
175 However, users are free to customize LLDB's command set however they like, and
176 since LLDB reads the file ``~/.lldbinit`` at startup, you can store all your
177 aliases there and they will be generally available to you. Your aliases are
178 also documented in the ``help`` command so you can remind yourself of what you have
181 One alias of note that LLDB does include by popular demand is a weak emulator of
182 GDB's ``break`` command. It does not try to do everything that GDB's break command
183 does (for instance, it does not handle ``foo.c::bar``). But it mostly works, and
184 makes the transition easier. Also, by popular demand, it is aliased to ``b``. If you
185 actually want to learn the LLDB command set natively, that means it will get in
186 the way of the rest of the breakpoint commands. Fortunately, if you do not like
187 one of our aliases, you can easily get rid of it by running, for example:
191 (lldb) command unalias b
197 (lldb) command alias b breakpoint
199 So you can run the native LLDB breakpoint command with just ``b``.
201 The LLDB command parser also supports "raw" commands, where, after command
202 options are stripped off, the rest of the command string is passed
203 uninterpreted to the command. This is convenient for commands whose arguments
204 might be some complex expression that would be painful to backslash protect.
205 For instance, the ``expression`` command is a "raw" command for obvious reasons.
206 The ``help`` output for a command will tell you if it is "raw" or not, so you
207 know what to expect. The one thing you have to watch out for is that since raw
208 commands still can have options, if your command string has dashes in it,
209 you will have to indicate these are not option markers by putting ``--`` after the
210 command name, but before your command string.
212 LLDB also has a built-in Python interpreter, which is accessible by the
213 ``script`` command. All the functionality of the debugger is available as classes
214 in the Python interpreter, so the more complex commands that in GDB you would
215 introduce with the ``define`` command can be done by writing Python functions
216 using the LLDB Python library, then loading the scripts into your running
217 session and accessing them with the ``script`` command.
219 Loading a Program Into LLDB
220 ---------------------------
222 First you need to set the program to debug. As with GDB, you can start LLDB and
223 specify the file you wish to debug on the command line:
227 $ lldb /Projects/Sketch/build/Debug/Sketch.app
228 Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64).
230 Or you can specify it after the fact with the ``file`` command:
235 (lldb) file /Projects/Sketch/build/Debug/Sketch.app
236 Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64).
241 We have discussed how to set breakpoints above. You can use ``help breakpoint set``
242 to see all the options for breakpoint setting. For instance, you could do:
246 (lldb) breakpoint set --selector alignLeftEdges:
247 Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1
249 You can find out about the breakpoints you have set with:
253 (lldb) breakpoint list
255 1: name = 'alignLeftEdges:', locations = 1, resolved = 1
256 1.1: where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405, address = 0x0000000100010d5b, resolved, hit count = 0
259 Note that setting a breakpoint creates a logical breakpoint, which could
260 resolve to one or more locations. For instance, break by selector would set a
261 breakpoint on all the methods that implement that selector in the classes in
262 your program. Similarly, a file and line breakpoint might result in multiple
263 locations if that file and line were inlined in different places in your code.
265 The logical breakpoint has an integer id, and its locations have an id within
266 their parent breakpoint (the two are joined by a ``.``, e.g. ``1.1`` in the example
269 Also logical breakpoints remain live so that if another shared library were
270 to be loaded that had another implementation of the ``alignLeftEdges:`` selector,
271 the new location would be added to breakpoint ``1`` (e.g. a ``1.2`` breakpoint would
272 be set on the newly loaded selector).
274 The other piece of information in the breakpoint listing is whether the
275 breakpoint location was resolved or not. A location gets resolved when the file
276 address it corresponds to gets loaded into the program you are debugging. For
277 instance if you set a breakpoint in a shared library that then gets unloaded,
278 that breakpoint location will remain, but it will no longer be resolved.
280 One other thing to note for GDB users is that LLDB acts like GDB with:
284 (gdb) set breakpoint pending on
286 Which means that LLDB will always make a breakpoint from your specification, even if it
287 could not find any locations that match the specification. You can tell whether
288 the expression was resolved or not by checking the locations field in
289 ``breakpoint list``, and LLDB reports the breakpoint as ``pending`` when you set it so
290 you can tell you have made a typo more easily, if that was indeed the reason no
291 locations were found:
295 (lldb) breakpoint set --file foo.c --line 12
296 Breakpoint created: 2: file ='foo.c', line = 12, locations = 0 (pending)
297 WARNING: Unable to resolve breakpoint to any actual locations.
299 You can delete, disable, set conditions and ignore counts either on all the
300 locations generated by your logical breakpoint, or on any one of the particular
301 locations your specification resolved to. For instance, if you wanted to add a
302 command to print a backtrace when you hit this breakpoint you could do:
306 (lldb) breakpoint command add 1.1
307 Enter your debugger command(s). Type 'DONE' to end.
311 By default, the breakpoint command add command takes LLDB command line
312 commands. You can also specify this explicitly by passing the ``--command``
313 option. Use ``--script`` if you want to implement your breakpoint command using
314 the Python script instead.
316 This is a convenient point to bring up another feature of the LLDB command
321 (lldb) help break command add
322 Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit.
324 Syntax: breakpoint command add <cmd-options> <breakpt-id>
327 When you see arguments to commands specified in the ``Syntax`` section in angle brackets
328 like ``<breakpt-id>``, that indicates that that is some common argument type that
329 you can get further help on from the command system. So in this case you could
334 (lldb) help <breakpt-id>
335 <breakpt-id> -- Breakpoint ID's consist major and minor numbers; the major etc...
340 Breakpoints carry two orthogonal sets of information: one specifies where to set
341 the breakpoint, and the other how to react when the breakpoint is hit. The latter
342 set of information (e.g. commands, conditions, hit-count, auto-continue...) we
343 call breakpoint options.
345 It is fairly common to want to apply one set of options to a number of breakpoints.
346 For instance, you might want to check that ``self == nil`` and if it is, print a
347 backtrace and continue, on a number of methods. One convenient way to do that would
348 be to make all the breakpoints, then configure the options with:
352 (lldb) breakpoint modify -c "self == nil" -C bt --auto-continue 1 2 3
354 That is not too bad, but you have to repeat this for every new breakpoint you make,
355 and if you wanted to change the options, you have to remember all the ones you are
358 Breakpoint names provide a convenient solution to this problem. The simple solution
359 would be to use the name to gather the breakpoints you want to affect this way into
360 a group. So when you make the breakpoint you would do:
364 (lldb) breakpoint set -N SelfNil
366 Then when you have made all your breakpoints, you can set up or modify the options
367 using the name to collect all the relevant breakpoints.
371 (lldb) breakpoint modify -c "self == nil" -C bt --auto-continue SelfNil
373 That is better, but suffers from the problem that when new breakpoints get
374 added, they do not pick up these modifications, and the options only exist in
375 the context of actual breakpoints, so they are hard to store and reuse.
377 An even better solution is to make a fully configured breakpoint name:
381 (lldb) breakpoint name configure -c "self == nil" -C bt --auto-continue SelfNil
383 Then you can apply the name to your breakpoints, and they will all pick up
384 these options. The connection from name to breakpoints remains live, so when
385 you change the options configured on the name, all the breakpoints pick up
386 those changes. This makes it easy to use configured names to experiment with
389 You can make breakpoint names in your ``.lldbinit`` file, so you can use them to
390 can behaviors that you have found useful and reapply them in future sessions.
392 You can also make a breakpoint name from the options set on a breakpoint:
396 (lldb) breakpoint name configure -B 1 SelfNil
398 which makes it easy to copy behavior from one breakpoint to a set of others.
403 In addition to breakpoints, you can use help watchpoint to see all the commands
404 for watchpoint manipulations. For instance, you might do the following to watch
405 a variable called ``global`` for write operation, but only stop if the condition
406 ``(global==5)`` is true:
410 (lldb) watch set var global
411 Watchpoint created: Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
412 declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
413 (lldb) watch modify -c '(global==5)'
416 Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
417 declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
418 condition = '(global==5)'
420 Process 15562 resuming
421 (lldb) about to write to 'global'...
422 Process 15562 stopped and was programmatically restarted.
423 Process 15562 stopped and was programmatically restarted.
424 Process 15562 stopped and was programmatically restarted.
425 Process 15562 stopped and was programmatically restarted.
426 Process 15562 stopped
427 * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
428 frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
430 14 static void modify(int32_t &var) {
434 18 int main(int argc, char** argv) {
437 * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
438 frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
439 frame #1: 0x0000000100000eac a.out`main + 108 at main.cpp:25
440 frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1
441 (lldb) frame var global
445 Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
446 declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
447 condition = '(global==5)'
448 hit_count = 5 ignore_count = 0
451 Starting or Attaching to Your Program
452 -------------------------------------
454 To launch a program in LLDB you will use the ``process launch`` command or one of
455 its built in aliases:
459 (lldb) process launch
463 You can also attach to a process by process ID or process name. When attaching
464 to a process by name, LLDB also supports the ``--waitfor`` option which waits for
465 the next process that has that name to show up, and attaches to it
469 (lldb) process attach --pid 123
470 (lldb) process attach --name Sketch
471 (lldb) process attach --name Sketch --waitfor
473 After you launch or attach to a process, your process might stop somewhere:
477 (lldb) process attach -p 12345
478 Process 46915 Attaching
479 Process 46915 Stopped
480 1 of 3 threads stopped with reasons:
481 * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
483 Note the line that says ``1 of 3 threads stopped with reasons:`` and the lines
484 that follow it. In a multi-threaded environment it is very common for more than
485 one thread to hit your breakpoint(s) before the kernel actually returns control
486 to the debugger. In that case, you will see all the threads that stopped for
487 some interesting reason listed in the stop message.
489 Controlling Your Program
490 ------------------------
492 After launching, you can continue until you hit your breakpoint. The primitive commands
493 for process control all exist under the "thread" command:
497 (lldb) thread continue
498 Resuming thread 0x2c03 in process 46915
499 Resuming process 46915
502 At present you can only operate on one thread at a time, but the design will
503 ultimately support saying "step over the function in Thread 1, and step into the
504 function in Thread 2, and continue Thread 3" etc. When LLDB eventually supports
505 keeping some threads running while others are stopped this will be particularly
506 important. For convenience, however, all the stepping commands have easy aliases.
507 So ``thread continue`` is just ``c``, etc.
509 The other program stepping commands are pretty much the same as in GDB. You have got:
513 (lldb) thread step-in // The same as GDB's "step" or "s"
514 (lldb) thread step-over // The same as GDB's "next" or "n"
515 (lldb) thread step-out // The same as GDB's "finish" or "f"
517 By default, LLDB does defined aliases to all common GDB process control commands
518 (``s``, ``step``, ``n``, ``next``, ``finish``). If LLDB is missing any, please add
519 them to your ``~/.lldbinit`` file using the ``command alias`` command.
521 LLDB also supports the step by instruction versions:
526 (lldb) thread step-inst // The same as GDB's "stepi" / "si"
527 (lldb) thread step-over-inst // The same as GDB's "nexti" / "ni"
529 Finally, LLDB has a run until line or frame exit stepping mode:
533 (lldb) thread until 100
535 This command will run the thread in the current frame until it reaches line 100
536 in this frame or stops if it leaves the current frame. This is a pretty close
537 equivalent to GDB's ``until`` command.
539 One other useful thing to note about the lldb stepping commands is that they
540 are implemented as a stack of interruptible operations. Until the operation -
541 e.g. step to the next line - is completed, it will remain on the
542 stack. If the step over is interrupted and control returned to you,
543 any new stepping commands you issue won't replace the step-over, but instead
544 their operations will be pushed onto the stack after the original step over.
545 Then each of them will be retired as they are completed, finally returning to the
546 original step over operation.
548 Suppose, for instance, you ``step-over`` a source line with a function call.
549 If there is a breakpoint in that function, hitting the breakpoint will interrupt
550 the step over. At that point, you will likely want to examine the state at
551 the breakpoint, maybe stepping around in that frame, or stepping into other
552 functions, running some expressions, etc.
554 Because the original step-over has remained on the stack, when you've finished
555 your examinations, a simple ``continue`` will resume the original ``step-over``
556 operation, and you will arrive at the end of your starting source line in the
559 This saves you from having to keep track of your original intention, and manually
560 issuing the requisite number of ``step-out`` commands to get back to the frame
561 you were stepping over. The stack maintains that information for you.
563 Hand-called functions using the ``expr`` command are also implemented by
564 operations on this same stack. So if you are calling some code with the ``expr`` command,
565 and hit a breakpoint during the evaluation of that code, you can examine
566 the state where you stopped, and when you're satisfied, issue a
567 ``continue`` to finish the expression evaluation operation and print the function
570 You can examine the state of the operations stack using the ``thread plan list``
571 command, and if, for instance, you decide you don't actually want that outermost
572 next to continue running, you can remove it with the ``thread plan discard``
573 command. If you are interested in following this process in more detail, the
574 ``lldb step`` logging channel is useful source of information.
576 A process, by default, will share the LLDB terminal with the inferior process.
577 When in this mode, much like when debugging with GDB, when the process is
578 running anything you type will go to the ``STDIN`` of the inferior process. To
579 interrupt your inferior program, type ``CTRL+C``.
581 If you attach to a process, or launch a process with the ``--no-stdin`` option,
582 the command interpreter is always available to enter commands. It might be a
583 little disconcerting to GDB users to always have an ``(lldb)`` prompt. This allows
584 you to set a breakpoint, or use any other command without having to explicitly
585 interrupt the program you are debugging:
589 (lldb) process continue
590 (lldb) breakpoint set --name stop_here
592 There are many commands that won't work while running, and the command
593 interpreter will let you know when this is the case. Please file an issue if
594 it does not. This way of operation will set us up for a future debugging
595 mode called thread centric debugging. This mode will allow us to run all
596 threads and only stop the threads that are at breakpoints or have exceptions or
599 The commands that currently work while running include interrupting the process
600 to halt execution (``process interrupt``), getting the process status (``process status``),
601 breakpoint setting and clearing (``breakpoint [set|clear|enable|disable|list] ...``),
602 and memory reading and writing (``memory [read|write] ...``).
604 The question of disabling stdio when running brings up a good opportunity to
605 show how to set debugger properties. If you always want to run in
606 the ``--no-stdin`` mode, you can set this as a generic process property using the
607 LLDB ``settings`` command, which is equivalent to GDB's ``set`` command.
608 In this case you would say:
612 (lldb) settings set target.process.disable-stdio true
614 Over time, GDB's ``set`` command became a wilderness of disordered options, so
615 that there were useful options that even experienced GDB users did not know
616 about because they were too hard to find. LLDB instead organizes the settings
617 hierarchically using the structure of the basic entities in the debugger. For
618 the most part anywhere you can specify a setting on a generic entity (threads,
619 for example) you can also apply the option to a particular instance. You can
620 view the available settings with the command ``settings list`` and there is help
621 on the settings command explaining how it works more generally.
623 Examining Thread State
624 ----------------------
626 Once you have stopped, LLDB will choose a current thread, usually the one that
627 stopped "for a reason", and a current frame in that thread (on stop this is
628 always the bottom-most frame). Many the commands for inspecting state work on
629 this current thread/frame.
631 To inspect the current state of your process, you can start with the threads:
636 Process 46915 state is Stopped
637 * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
638 thread #2: tid = 0x2e03, 0x00007fff85cbb08a, where = libSystem.B.dylib`kevent + 10, queue = com.apple.libdispatch-manager
639 thread #3: tid = 0x2f03, 0x00007fff85cbbeaa, where = libSystem.B.dylib`__workq_kernreturn + 10
641 The ``*`` indicates that Thread 1 is the current thread. To get a backtrace for
646 (lldb) thread backtrace
647 thread #1: tid = 0x2c03, stop reason = breakpoint 1.1, queue = com.apple.main-thread
648 frame #0: 0x0000000100010d5b, where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405
649 frame #1: 0x00007fff8602d152, where = AppKit`-[NSApplication sendAction:to:from:] + 95
650 frame #2: 0x00007fff860516be, where = AppKit`-[NSMenuItem _corePerformAction] + 365
651 frame #3: 0x00007fff86051428, where = AppKit`-[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 121
652 frame #4: 0x00007fff860370c1, where = AppKit`-[NSMenu performKeyEquivalent:] + 272
653 frame #5: 0x00007fff86035e69, where = AppKit`-[NSApplication _handleKeyEquivalent:] + 559
654 frame #6: 0x00007fff85f06aa1, where = AppKit`-[NSApplication sendEvent:] + 3630
655 frame #7: 0x00007fff85e9d922, where = AppKit`-[NSApplication run] + 474
656 frame #8: 0x00007fff85e965f8, where = AppKit`NSApplicationMain + 364
657 frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11
658 frame #10: 0x0000000100000f20, where = Sketch`start + 52
660 You can also provide a list of threads to backtrace, or the keyword ``all`` to see all threads:
664 (lldb) thread backtrace all
666 You can select the current thread, which will be used by default in all the
667 commands in the next section, with the ``thread select`` command:
671 (lldb) thread select 2
673 where the thread index is just the one shown in the ``thread list`` listing.
676 Examining Stack Frame State
677 ---------------------------
679 The most convenient way to inspect a frame's arguments and local variables is
680 to use the ``frame variable`` command:
684 (lldb) frame variable
685 self = (SKTGraphicView *) 0x0000000100208b40
686 _cmd = (struct objc_selector *) 0x000000010001bae1
687 sender = (id) 0x00000001001264e0
688 selection = (NSArray *) 0x00000001001264e0
689 i = (NSUInteger) 0x00000001001264e0
690 c = (NSUInteger) 0x00000001001253b0
692 As you see above, if you do not specify any variable names, all arguments and
693 locals will be shown. If you call ``frame variable`` passing in the names of
694 particular local variables, only those variables will be printed. For instance:
698 (lldb) frame variable self
699 (SKTGraphicView *) self = 0x0000000100208b40
701 You can also pass in a path to some sub-element of one of the available locals,
702 and that sub-element will be printed. For instance:
706 (lldb) frame variable self.isa
707 (struct objc_class *) self.isa = 0x0000000100023730
709 The ``frame variable`` command is not a full expression parser but it does
710 support a few simple operations like ``&``, ``*``, ``->``, ``[]`` (no
711 overloaded operators). The array brackets can be used on pointers to treat
716 (lldb) frame variable *self
717 (SKTGraphicView *) self = 0x0000000100208b40
719 (NSResponder) NSResponder = {
722 (lldb) frame variable &self
723 (SKTGraphicView **) &self = 0x0000000100304ab
725 (lldb) frame variable argv[0]
726 (char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch"
728 The frame variable command will also perform "object printing" operations on
729 variables (currently LLDB only supports ObjC printing, using the object's
730 ``description`` method. Turn this on by passing the ``-o`` flag to frame variable:
734 (lldb) frame variable -o self (SKTGraphicView *) self = 0x0000000100208b40 <SKTGraphicView: 0x100208b40>
735 You can select another frame to view with the "frame select" command
737 (lldb) frame select 9
738 frame #9: 0x0000000100015ae3, where = Sketch`function1 + 33 at /Projects/Sketch/SKTFunctions.m:11
740 You can also move up and down the stack by passing the ``--relative`` (``-r``) option.
741 We also have built-in aliases ``u`` and ``d`` which behave like their GDB equivalents.