1Tutorial 2======== 3 4This document describes how to use LLDB if you are already familiar with 5GDB's command set. We will start with some details on LLDB command structure and 6syntax. 7 8Command Structure 9----------------- 10 11Unlike GDB's quite free-form commands, LLDB's are more structured. All commands 12are of the form: 13 14:: 15 16 <noun> <verb> [-options [option-value]] [argument [argument...]] 17 18The command line parsing is done before command execution, so it is the same for 19all commands. The command syntax for basic commands is very simple. 20 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 23 in an argument. 24* Escape backslashes and double quotes within arguments should be escaped 25 with a backslash ``\``. 26 27This makes LLDB's commands more regular, but it also means you may have to quote 28some arguments in LLDB that you would not in GDB. 29 30There is one other special quote character in LLDB - the backtick `````. 31If you put backticks around an argument or option value, LLDB will run the text 32of the value through the expression parser, and the result of the expression 33will be passed to the command. So for instance, if ``len`` is a local 34``int`` variable with the value ``5``, then the command: 35 36:: 37 38 (lldb) memory read -c `len` 0x12345 39 40Will receive the value ``5`` for the count option, rather than the string ``len``. 41 42Options can be placed anywhere on the command line, but if the arguments begin 43with a ``-`` then you have to tell LLDB that you are done with options for the 44current command by adding an option termination: ``--``. 45 46So for instance, if you want to launch a process and give the ``process launch`` 47command the ``--stop-at-entry`` option, yet you want the process you are about 48to launch to be launched with the arguments ``-program_arg value``, you would type: 49 50:: 51 52 (lldb) process launch --stop-at-entry -- -program_arg value 53 54We also tried to reduce the number of special purpose argument parsers, which 55sometimes forces the user to be explicit about their intentions. The first 56instance you willl see of this is the breakpoint command. In GDB, to set a 57breakpoint, you might enter: 58 59:: 60 61 (gdb) break foo.c:12 62 63To break at line ``12`` of ``foo.c``, and: 64 65:: 66 67 (gdb) break foo 68 69To break at the function ``foo``. As time went on, the parser that tells ``foo.c:12`` 70from ``foo`` from ``foo.c::foo`` (which means the function ``foo`` in the file ``foo.c``) 71got more and more complex. Especially in C++ there are times where there is 72really no way to specify the function you want to break on. 73 74The LLDB commands are more verbose but also more precise and allow for 75intelligent auto completion. 76 77To set the same file and line breakpoint in LLDB you can enter either of: 78 79:: 80 81 (lldb) breakpoint set --file foo.c --line 12 82 (lldb) breakpoint set -f foo.c -l 12 83 84To set a breakpoint on a function named ``foo`` in LLDB you can enter either of: 85 86:: 87 88 (lldb) breakpoint set --name foo 89 (lldb) breakpoint set -n foo 90 91You can use the ``--name`` option multiple times to make a breakpoint on a set of 92functions as well. This is convenient since it allows you to set common 93conditions or commands without having to specify them multiple times: 94 95:: 96 97 (lldb) breakpoint set --name foo --name bar 98 99Setting breakpoints by name is even more specialized in LLDB as you can specify 100that you want to set a breakpoint at a function by method name. To set a 101breakpoint on all C++ methods named ``foo`` you can enter either of: 102 103:: 104 105 (lldb) breakpoint set --method foo 106 (lldb) breakpoint set -M foo 107 108 109To set a breakpoint Objective-C selectors named ``alignLeftEdges:`` you can enter either of: 110 111:: 112 113 (lldb) breakpoint set --selector alignLeftEdges: 114 (lldb) breakpoint set -S alignLeftEdges: 115 116You can limit any breakpoints to a specific executable image by using the 117``--shlib <path>`` (``-s <path>`` for short): 118 119:: 120 121 (lldb) breakpoint set --shlib foo.dylib --name foo 122 (lldb) breakpoint set -s foo.dylib -n foo 123 124The ``--shlib`` option can also be repeated to specify several shared libraries. 125 126Suggestions on more interesting primitives of this sort are also very welcome. 127 128Just like GDB, the LLDB command interpreter does a shortest unique string match 129on command names, so the following two commands will both execute the same 130command: 131 132:: 133 134 (lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]" 135 (lldb) br s -n "-[SKTGraphicView alignLeftEdges:]" 136 137LLDB also supports command completion for source file names, symbol names, file 138names, etc. Completion is initiated by hitting TAB. Individual options in a 139command can have different completers, so for instance, the ``--file <path>`` 140option in ``breakpoint`` completes to source files, the ``--shlib <path>`` option 141to currently loaded shared libraries, etc. You can even do things like if you 142specify ``--shlib <path>``, and are completing on ``--file <path>``, LLDB will only 143list source files in the shared library specified by ``--shlib <path>``. 144 145The individual commands are pretty extensively documented. You can use the ``help`` 146command to get an overview of which commands are available or to obtain details 147about specific commands. There is also an ``apropos`` command that will search the 148help text for all commands for a particular word and dump a summary help string 149for each matching command. 150 151Finally, there is a mechanism to construct aliases for commonly used commands. 152For instance, if you get annoyed typing: 153 154:: 155 156 (lldb) breakpoint set --file foo.c --line 12 157 158You can do: 159 160:: 161 162 (lldb) command alias bfl breakpoint set -f %1 -l %2 163 (lldb) bfl foo.c 12 164 165LLDB 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 167is more convenient to make the basic commands unique down to a letter or two, 168and then learn these sequences than to fill the namespace with lots of aliases, 169and then have to type them all the way out. 170 171If the alias abbreviation or the full alias command collides with another 172existing command, the command resolver will prefer to use the alias over any 173other command as far as there is only one alias command match. 174 175However, users are free to customize LLDB's command set however they like, and 176since LLDB reads the file ``~/.lldbinit`` at startup, you can store all your 177aliases there and they will be generally available to you. Your aliases are 178also documented in the ``help`` command so you can remind yourself of what you have 179set up. 180 181One alias of note that LLDB does include by popular demand is a weak emulator of 182GDB's ``break`` command. It does not try to do everything that GDB's break command 183does (for instance, it does not handle ``foo.c::bar``). But it mostly works, and 184makes the transition easier. Also, by popular demand, it is aliased to ``b``. If you 185actually want to learn the LLDB command set natively, that means it will get in 186the way of the rest of the breakpoint commands. Fortunately, if you do not like 187one of our aliases, you can easily get rid of it by running, for example: 188 189:: 190 191 (lldb) command unalias b 192 193You can also do: 194 195:: 196 197 (lldb) command alias b breakpoint 198 199So you can run the native LLDB breakpoint command with just ``b``. 200 201The LLDB command parser also supports "raw" commands, where, after command 202options are stripped off, the rest of the command string is passed 203uninterpreted to the command. This is convenient for commands whose arguments 204might be some complex expression that would be painful to backslash protect. 205For instance, the ``expression`` command is a "raw" command for obvious reasons. 206The ``help`` output for a command will tell you if it is "raw" or not, so you 207know what to expect. The one thing you have to watch out for is that since raw 208commands still can have options, if your command string has dashes in it, 209you will have to indicate these are not option markers by putting ``--`` after the 210command name, but before your command string. 211 212LLDB 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 214in the Python interpreter, so the more complex commands that in GDB you would 215introduce with the ``define`` command can be done by writing Python functions 216using the LLDB Python library, then loading the scripts into your running 217session and accessing them with the ``script`` command. 218 219Loading a Program Into LLDB 220--------------------------- 221 222First you need to set the program to debug. As with GDB, you can start LLDB and 223specify the file you wish to debug on the command line: 224 225:: 226 227 $ lldb /Projects/Sketch/build/Debug/Sketch.app 228 Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). 229 230Or you can specify it after the fact with the ``file`` command: 231 232:: 233 234 $ lldb 235 (lldb) file /Projects/Sketch/build/Debug/Sketch.app 236 Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). 237 238Setting Breakpoints 239------------------- 240 241We have discussed how to set breakpoints above. You can use ``help breakpoint set`` 242to see all the options for breakpoint setting. For instance, you could do: 243 244:: 245 246 (lldb) breakpoint set --selector alignLeftEdges: 247 Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1 248 249You can find out about the breakpoints you have set with: 250 251:: 252 253 (lldb) breakpoint list 254 Current breakpoints: 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 257 258 259Note that setting a breakpoint creates a logical breakpoint, which could 260resolve to one or more locations. For instance, break by selector would set a 261breakpoint on all the methods that implement that selector in the classes in 262your program. Similarly, a file and line breakpoint might result in multiple 263locations if that file and line were inlined in different places in your code. 264 265The logical breakpoint has an integer id, and its locations have an id within 266their parent breakpoint (the two are joined by a ``.``, e.g. ``1.1`` in the example 267above). 268 269Also logical breakpoints remain live so that if another shared library were 270to be loaded that had another implementation of the ``alignLeftEdges:`` selector, 271the new location would be added to breakpoint ``1`` (e.g. a ``1.2`` breakpoint would 272be set on the newly loaded selector). 273 274The other piece of information in the breakpoint listing is whether the 275breakpoint location was resolved or not. A location gets resolved when the file 276address it corresponds to gets loaded into the program you are debugging. For 277instance if you set a breakpoint in a shared library that then gets unloaded, 278that breakpoint location will remain, but it will no longer be resolved. 279 280One other thing to note for GDB users is that LLDB acts like GDB with: 281 282:: 283 284 (gdb) set breakpoint pending on 285 286Which means that LLDB will always make a breakpoint from your specification, even if it 287could not find any locations that match the specification. You can tell whether 288the 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 290you can tell you have made a typo more easily, if that was indeed the reason no 291locations were found: 292 293:: 294 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. 298 299You can delete, disable, set conditions and ignore counts either on all the 300locations generated by your logical breakpoint, or on any one of the particular 301locations your specification resolved to. For instance, if you wanted to add a 302command to print a backtrace when you hit this breakpoint you could do: 303 304:: 305 306 (lldb) breakpoint command add 1.1 307 Enter your debugger command(s). Type 'DONE' to end. 308 > bt 309 > DONE 310 311By default, the breakpoint command add command takes LLDB command line 312commands. You can also specify this explicitly by passing the ``--command`` 313option. Use ``--script`` if you want to implement your breakpoint command using 314the Python script instead. 315 316This is a convenient point to bring up another feature of the LLDB command 317``help``. Do: 318 319:: 320 321 (lldb) help break command add 322 Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit. 323 324 Syntax: breakpoint command add <cmd-options> <breakpt-id> 325 etc... 326 327When you see arguments to commands specified in the ``Syntax`` section in angle brackets 328like ``<breakpt-id>``, that indicates that that is some common argument type that 329you can get further help on from the command system. So in this case you could 330do: 331 332:: 333 334 (lldb) help <breakpt-id> 335 <breakpt-id> -- Breakpoint ID's consist major and minor numbers; the major etc... 336 337Breakpoint Names 338---------------- 339 340Breakpoints carry two orthogonal sets of information: one specifies where to set 341the breakpoint, and the other how to react when the breakpoint is hit. The latter 342set of information (e.g. commands, conditions, hit-count, auto-continue...) we 343call breakpoint options. 344 345It is fairly common to want to apply one set of options to a number of breakpoints. 346For instance, you might want to check that ``self == nil`` and if it is, print a 347backtrace and continue, on a number of methods. One convenient way to do that would 348be to make all the breakpoints, then configure the options with: 349 350:: 351 352 (lldb) breakpoint modify -c "self == nil" -C bt --auto-continue 1 2 3 353 354That is not too bad, but you have to repeat this for every new breakpoint you make, 355and if you wanted to change the options, you have to remember all the ones you are 356using this way. 357 358Breakpoint names provide a convenient solution to this problem. The simple solution 359would be to use the name to gather the breakpoints you want to affect this way into 360a group. So when you make the breakpoint you would do: 361 362:: 363 364 (lldb) breakpoint set -N SelfNil 365 366Then when you have made all your breakpoints, you can set up or modify the options 367using the name to collect all the relevant breakpoints. 368 369:: 370 371 (lldb) breakpoint modify -c "self == nil" -C bt --auto-continue SelfNil 372 373That is better, but suffers from the problem that when new breakpoints get 374added, they do not pick up these modifications, and the options only exist in 375the context of actual breakpoints, so they are hard to store and reuse. 376 377An even better solution is to make a fully configured breakpoint name: 378 379:: 380 381 (lldb) breakpoint name configure -c "self == nil" -C bt --auto-continue SelfNil 382 383Then you can apply the name to your breakpoints, and they will all pick up 384these options. The connection from name to breakpoints remains live, so when 385you change the options configured on the name, all the breakpoints pick up 386those changes. This makes it easy to use configured names to experiment with 387your options. 388 389You can make breakpoint names in your ``.lldbinit`` file, so you can use them to 390can behaviors that you have found useful and reapply them in future sessions. 391 392You can also make a breakpoint name from the options set on a breakpoint: 393 394:: 395 396 (lldb) breakpoint name configure -B 1 SelfNil 397 398which makes it easy to copy behavior from one breakpoint to a set of others. 399 400Setting Watchpoints 401------------------- 402 403In addition to breakpoints, you can use help watchpoint to see all the commands 404for watchpoint manipulations. For instance, you might do the following to watch 405a variable called ``global`` for write operation, but only stop if the condition 406``(global==5)`` is true: 407 408:: 409 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)' 414 (lldb) watch list 415 Current watchpoints: 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)' 419 (lldb) c 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 429 13 430 14 static void modify(int32_t &var) { 431 15 ++var; 432 -> 16 } 433 17 434 18 int main(int argc, char** argv) { 435 19 int local = 0; 436 (lldb) bt 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 442 (int32_t) global = 5 443 (lldb) watch list -v 444 Current watchpoints: 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 449 (lldb) 450 451Starting or Attaching to Your Program 452------------------------------------- 453 454To launch a program in LLDB you will use the ``process launch`` command or one of 455its built in aliases: 456 457:: 458 459 (lldb) process launch 460 (lldb) run 461 (lldb) r 462 463You can also attach to a process by process ID or process name. When attaching 464to a process by name, LLDB also supports the ``--waitfor`` option which waits for 465the next process that has that name to show up, and attaches to it 466 467:: 468 469 (lldb) process attach --pid 123 470 (lldb) process attach --name Sketch 471 (lldb) process attach --name Sketch --waitfor 472 473After you launch or attach to a process, your process might stop somewhere: 474 475:: 476 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 482 483Note the line that says ``1 of 3 threads stopped with reasons:`` and the lines 484that follow it. In a multi-threaded environment it is very common for more than 485one thread to hit your breakpoint(s) before the kernel actually returns control 486to the debugger. In that case, you will see all the threads that stopped for 487some interesting reason listed in the stop message. 488 489Controlling Your Program 490------------------------ 491 492After launching, you can continue until you hit your breakpoint. The primitive commands 493for process control all exist under the "thread" command: 494 495:: 496 497 (lldb) thread continue 498 Resuming thread 0x2c03 in process 46915 499 Resuming process 46915 500 (lldb) 501 502At present you can only operate on one thread at a time, but the design will 503ultimately support saying "step over the function in Thread 1, and step into the 504function in Thread 2, and continue Thread 3" etc. When LLDB eventually supports 505keeping some threads running while others are stopped this will be particularly 506important. For convenience, however, all the stepping commands have easy aliases. 507So ``thread continue`` is just ``c``, etc. 508 509The other program stepping commands are pretty much the same as in GDB. You have got: 510 511:: 512 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" 516 517By 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 519them to your ``~/.lldbinit`` file using the ``command alias`` command. 520 521LLDB also supports the step by instruction versions: 522 523:: 524 525 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" 528 529Finally, LLDB has a run until line or frame exit stepping mode: 530 531:: 532 533 (lldb) thread until 100 534 535This command will run the thread in the current frame until it reaches line 100 536in this frame or stops if it leaves the current frame. This is a pretty close 537equivalent to GDB's ``until`` command. 538 539One other useful thing to note about the lldb stepping commands is that they 540are implemented as a stack of interruptible operations. Until the operation - 541e.g. step to the next line - is completed, it will remain on the 542stack. If the step over is interrupted and control returned to you, 543any new stepping commands you issue won't replace the step-over, but instead 544their operations will be pushed onto the stack after the original step over. 545Then each of them will be retired as they are completed, finally returning to the 546original step over operation. 547 548Suppose, for instance, you ``step-over`` a source line with a function call. 549If there is a breakpoint in that function, hitting the breakpoint will interrupt 550the step over. At that point, you will likely want to examine the state at 551the breakpoint, maybe stepping around in that frame, or stepping into other 552functions, running some expressions, etc. 553 554Because the original step-over has remained on the stack, when you've finished 555your examinations, a simple ``continue`` will resume the original ``step-over`` 556operation, and you will arrive at the end of your starting source line in the 557original frame. 558 559This saves you from having to keep track of your original intention, and manually 560issuing the requisite number of ``step-out`` commands to get back to the frame 561you were stepping over. The stack maintains that information for you. 562 563Hand-called functions using the ``expr`` command are also implemented by 564operations on this same stack. So if you are calling some code with the ``expr`` command, 565and hit a breakpoint during the evaluation of that code, you can examine 566the state where you stopped, and when you're satisfied, issue a 567``continue`` to finish the expression evaluation operation and print the function 568result. 569 570You can examine the state of the operations stack using the ``thread plan list`` 571command, and if, for instance, you decide you don't actually want that outermost 572next to continue running, you can remove it with the ``thread plan discard`` 573command. If you are interested in following this process in more detail, the 574``lldb step`` logging channel is useful source of information. 575 576A process, by default, will share the LLDB terminal with the inferior process. 577When in this mode, much like when debugging with GDB, when the process is 578running anything you type will go to the ``STDIN`` of the inferior process. To 579interrupt your inferior program, type ``CTRL+C``. 580 581If you attach to a process, or launch a process with the ``--no-stdin`` option, 582the command interpreter is always available to enter commands. It might be a 583little disconcerting to GDB users to always have an ``(lldb)`` prompt. This allows 584you to set a breakpoint, or use any other command without having to explicitly 585interrupt the program you are debugging: 586 587:: 588 589 (lldb) process continue 590 (lldb) breakpoint set --name stop_here 591 592There are many commands that won't work while running, and the command 593interpreter will let you know when this is the case. Please file an issue if 594it does not. This way of operation will set us up for a future debugging 595mode called thread centric debugging. This mode will allow us to run all 596threads and only stop the threads that are at breakpoints or have exceptions or 597signals. 598 599The commands that currently work while running include interrupting the process 600to halt execution (``process interrupt``), getting the process status (``process status``), 601breakpoint setting and clearing (``breakpoint [set|clear|enable|disable|list] ...``), 602and memory reading and writing (``memory [read|write] ...``). 603 604The question of disabling stdio when running brings up a good opportunity to 605show how to set debugger properties. If you always want to run in 606the ``--no-stdin`` mode, you can set this as a generic process property using the 607LLDB ``settings`` command, which is equivalent to GDB's ``set`` command. 608In this case you would say: 609 610:: 611 612 (lldb) settings set target.process.disable-stdio true 613 614Over time, GDB's ``set`` command became a wilderness of disordered options, so 615that there were useful options that even experienced GDB users did not know 616about because they were too hard to find. LLDB instead organizes the settings 617hierarchically using the structure of the basic entities in the debugger. For 618the most part anywhere you can specify a setting on a generic entity (threads, 619for example) you can also apply the option to a particular instance. You can 620view the available settings with the command ``settings list`` and there is help 621on the settings command explaining how it works more generally. 622 623Examining Thread State 624---------------------- 625 626Once you have stopped, LLDB will choose a current thread, usually the one that 627stopped "for a reason", and a current frame in that thread (on stop this is 628always the bottom-most frame). Many the commands for inspecting state work on 629this current thread/frame. 630 631To inspect the current state of your process, you can start with the threads: 632 633:: 634 635 (lldb) thread list 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 640 641The ``*`` indicates that Thread 1 is the current thread. To get a backtrace for 642that thread, do: 643 644:: 645 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 659 660You can also provide a list of threads to backtrace, or the keyword ``all`` to see all threads: 661 662:: 663 664 (lldb) thread backtrace all 665 666You can select the current thread, which will be used by default in all the 667commands in the next section, with the ``thread select`` command: 668 669:: 670 671 (lldb) thread select 2 672 673where the thread index is just the one shown in the ``thread list`` listing. 674 675 676Examining Stack Frame State 677--------------------------- 678 679The most convenient way to inspect a frame's arguments and local variables is 680to use the ``frame variable`` command: 681 682:: 683 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 691 692As you see above, if you do not specify any variable names, all arguments and 693locals will be shown. If you call ``frame variable`` passing in the names of 694particular local variables, only those variables will be printed. For instance: 695 696:: 697 698 (lldb) frame variable self 699 (SKTGraphicView *) self = 0x0000000100208b40 700 701You can also pass in a path to some sub-element of one of the available locals, 702and that sub-element will be printed. For instance: 703 704:: 705 706 (lldb) frame variable self.isa 707 (struct objc_class *) self.isa = 0x0000000100023730 708 709The ``frame variable`` command is not a full expression parser but it does 710support a few simple operations like ``&``, ``*``, ``->``, ``[]`` (no 711overloaded operators). The array brackets can be used on pointers to treat 712pointers as arrays: 713 714:: 715 716 (lldb) frame variable *self 717 (SKTGraphicView *) self = 0x0000000100208b40 718 (NSView) NSView = { 719 (NSResponder) NSResponder = { 720 ... 721 722 (lldb) frame variable &self 723 (SKTGraphicView **) &self = 0x0000000100304ab 724 725 (lldb) frame variable argv[0] 726 (char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch" 727 728The frame variable command will also perform "object printing" operations on 729variables (currently LLDB only supports ObjC printing, using the object's 730``description`` method. Turn this on by passing the ``-o`` flag to frame variable: 731 732:: 733 734 (lldb) frame variable -o self (SKTGraphicView *) self = 0x0000000100208b40 <SKTGraphicView: 0x100208b40> 735 You can select another frame to view with the "frame select" command 736 737 (lldb) frame select 9 738 frame #9: 0x0000000100015ae3, where = Sketch`function1 + 33 at /Projects/Sketch/SKTFunctions.m:11 739 740You can also move up and down the stack by passing the ``--relative`` (``-r``) option. 741We also have built-in aliases ``u`` and ``d`` which behave like their GDB equivalents. 742