1 Here's a short precis of how to run lldb if you are familiar with the 2 gdb command set: 3 4 5 1) LLDB Command Structure: 6 7 First some details on lldb command structure to help orient you... 8 9 Unlike gdb's command set, which is rather free-form, we tried to make 10 the lldb command syntax fairly structured. The commands are all of the 11 form 12 13 <noun> <verb> [-options [option-value]] [argument [argument...]] 14 15 The command line parsing is done before command execution, so it is 16 uniform across all the commands. The command syntax is very simple, 17 basically arguments, options and option values are all white-space 18 separated. If you need to put a backslash or double-quote character 19 in an argument you back-slash it in the argument. That makes the 20 command syntax more regular, but it also means you may have to 21 quote some arguments in lldb that you wouldn't in gdb. 22 23 Options can be placed anywhere on the command line, but if the arguments 24 begin with a "-" then you have to tell lldb that you're done with options 25 using the "--" option. So for instance, the "process launch" command takes 26 the "-s" option to mean "stop the process at the first instruction". It's 27 arguments are the arguments you are passing to the program. So if you wanted 28 to pass an argument that contained a "-" you would have to do: 29 30 (lldb) process launch -- -program_arg value 31 32 We also tried to reduce the number of special purpose argument 33 parsers, which sometimes forces the user to be a little more explicit 34 about stating their intentions. The first instance you'll note of 35 this is the breakpoint command. In gdb, to set a breakpoint, you 36 would just say: 37 38 (gdb) break foo.c:12 39 40 or 41 42 (gdb) break foo 43 44 if foo is a function. As time went on, the parser that tells foo.c:12 45 from foo from foo.c::foo (which means the function foo in the file 46 foo.c) got more and more complex and bizarre, and especially in C++ 47 there are times where there's really no way to specify the function 48 you want to break on. The lldb commands are more verbose but also precise. 49 So you say: 50 51 (lldb) breakpoint set -f foo.c -l 12 52 53 to set a file & line breakpoint. To set a breakpoint on a function 54 by name, you do: 55 56 (lldb) breakpoint set -n foo 57 58 This can allow us to be more expressive, so you can say: 59 60 (lldb) breakpoint set -M foo 61 62 to break on all C++ methods named foo, or: 63 64 (lldb) breakpoint set -S alignLeftEdges: 65 66 to set a breakpoint on all ObjC selectors called alignLeftEdges:. It 67 also makes it easy to compose specifications, like: 68 69 (lldb) breakpoint set -s foo.dylib -n foo 70 71 for all functions called foo in the shared library foo.dylib. Suggestions 72 on more interesting primitives of this sort are also very welcome. 73 74 So for instance: 75 76 (lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]" 77 78 Just like gdb, the lldb command interpreter does a shortest unique 79 string match on command names, so the previous command can also be 80 typed: 81 82 (lldb) b s -n "-[SKTGraphicView alignLeftEdges:]" 83 84 lldb also supports command completion for source file names, symbol 85 names, file names, etc. Completion is initiated by a hitting a <TAB>. 86 Individual options in a command can have different completers, so for 87 instance the -f option in "breakpoint" completes to source files, the 88 -s option to currently loaded shared libraries, etc... We can even do 89 things like if you specify -s, and are completing on -f, we will only 90 list source files in the shared library specified by -s... 91 92 The individual commands are pretty extensively documented, using 93 the "help" command. And there is an "apropos" command that will 94 search the help for a particular word and dump a summary help string 95 for each matching command. 96 97 Finally, there is a mechanism to construct aliases for commonly used 98 commands. So for instance if you get annoyed typing 99 100 (lldb) b s -f foo.c -l 12 101 102 you can do: 103 104 (lldb) command alias bfl breakpoint set -f %1 -l %2 105 (lldb) bfl foo.c 12 106 107 We have added a few aliases for commonly used commands (e.g. "step", 108 "next" and "continue") but we haven't tried to be exhaustive because 109 in our experience it is more convenient to make the basic commands 110 unique down to a letter or two, and then learn these sequences than 111 fill the namespace with lots of aliases, and then have to type them 112 all the way out. 113 114 However, users are free to customize lldb's command set however they 115 like, and since lldb reads the file ~/.lldbinit at startup, you can 116 store all your aliases there and they will be generally available to 117 you. Your aliases are also documented in the help command so you can 118 remind yourself of what you've set up. 119 120 lldb also has a built-in Python interpreter, which is accessible by 121 the "script" command. All the functionality of the debugger is 122 available as classes in the Python interpreter, so the more complex 123 commands that in gdb you would introduce with the "define" command can 124 be done by writing Python functions using the lldb-Python library, 125 then loading the scripts into your running session and accessing them 126 with the "script" command. 127 128 129 130 2) A typical session: 131 132 133 a) Setting the program to debug: 134 135 136 As with gdb, you can start lldb and specify the file you wish to debug 137 on the command line: 138 139 $ lldb /Projects/Sketch/build/Debug/Sketch.app 140 Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). 141 142 or you can specify it after the fact with the "file" command: 143 144 (lldb) file /Projects/Sketch/build/Debug/Sketch.app 145 Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). 146 147 148 b) Setting breakpoints: 149 150 151 We've discussed how to set breakpoints above. You can use "help break set" 152 to see all the options for breakpoint setting. For instance, we might do: 153 154 (lldb) b s -S alignLeftEdges: 155 Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1 156 157 You can find out about the breakpoints you've set with: 158 159 (lldb) break list 160 Current breakpoints: 161 1: name = 'alignLeftEdges:', locations = 1, resolved = 1 162 1.1: where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405, address = 0x0000000100010d5b, resolved, hit count = 0 163 164 Note that each "logical" breakpoint can have multiple "locations". 165 The logical breakpoint has an integer id, and it's locations have an 166 id within their parent breakpoint (the two are joined by a ".", 167 e.g. 1.1 in the example above.) 168 169 Also the breakpoints remain "live" so that if another shared library 170 were to be loaded that had another implementation of the 171 "alignLeftEdges:" selector, the new location would be added to 172 breakpoint 1 (e.g. a "1.2" breakpoint would be set on the newly loaded 173 selector). 174 175 The other piece of information in the breakpoint listing is whether the 176 breakpoint location was "resolved" or not. A location gets resolved when 177 the file address it corresponds to gets loaded into the program you are 178 debugging. For instance if you set a breakpoint in a shared library that 179 then gets unloaded, that breakpoint location will remain, but it will no 180 longer be "resolved". 181 182 One other thing to note for gdb users is that lldb acts like gdb with: 183 184 (gdb) set breakpoint pending on 185 186 That is, lldb should always make a breakpoint from your specification, even 187 if it couldn't find any locations that match the specification. You can tell 188 whether the expression was resolved or not by checking the locations field 189 in "breakpoint list", and we report the breakpoint as "pending" when you 190 set it so you can tell you've made a typo more easily, if that was indeed 191 the reason no locations were found: 192 193 (lldb) b s -f no_such_file.c -l 10000000 194 Breakpoint created: 1: file ='no_such_file.c', line = 10000000, locations = 0 (pending) 195 196 You can delete, disable, set conditions and ignore counts either on all the 197 locations generated by your logical breakpoint, or on particular locations 198 your specification resolved to. For instance if we wanted to add a command 199 to print a backtrace when we hit this breakpoint we could do: 200 201 (lldb) b command add -c 1.1 202 Enter your debugger command(s). Type 'DONE' to end. 203 > bt 204 > DONE 205 206 The "-c" option specifies that the breakpoint command is a set of lldb 207 command interpreter commands. Use "-s" if you want to implement your 208 breakpoint command using the Python interface instead. 209 210 211 c) Running the program: 212 213 Then you can either launch the process with the command: 214 215 (lldb) process launch 216 217 or its alias: 218 219 (lldb) r 220 221 Or you can attach to a process by name with: 222 223 (lldb) process attach -n Sketch 224 225 the "attach by name" also supports the "-w" option which waits for the 226 next process of that name to show up, and attaches to that. You can also 227 attach by PID: 228 229 (lldb) process attach -p 12345 230 Process 46915 Attaching 231 (lldb) Process 46915 Stopped 232 1 of 3 threads stopped with reasons: 233 * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread 234 235 Note that we tell you that "1 of 3 threads stopped with reasons" and 236 then list those threads. In a multi-threaded environment it is very 237 common for more than one thread to hit your breakpoint(s) before the 238 kernel actually returns control to the debugger. In that case, you 239 will see all the threads that stopped for some interesting reason 240 listed in the stop message. 241 242 243 d) Controlling execution: 244 245 246 After launching, we can continue until we hit our breakpoint. The primitive 247 commands for process control all exist under the "thread" command: 248 249 (lldb) thread continue 250 Resuming thread 0x2c03 in process 46915 251 Resuming process 46915 252 (lldb) 253 254 At present you can only operate on one thread at a time, but the 255 design will ultimately support saying "step over the function in 256 Thread 1, and step into the function in Thread 2, and continue Thread 257 3" etc. When we eventually support keeping some threads running while 258 others are stopped this will be particularly important. For 259 convenience, however, all the stepping commands have easy aliases. 260 So "thread continue" is just "c", etc. 261 262 The other program stepping commands are pretty much the same as in gdb. 263 You've got: 264 265 1. (lldb) thread step-in 266 The same as gdb's "step" -- there is also the alias "s" in lldb 267 268 2. (lldb) thread step-over 269 The same as gdb's "next" -- there is also the alias "n" in lldb 270 271 3. (lldb) thread step-out 272 The same as gdb's "finish" -- there is also the alias "f" in lldb 273 274 And the "by instruction" versions: 275 276 (lldb) thread step-inst 277 (lldb) thread step-over-inst 278 279 Finally, there's: 280 281 (lldb) thread until 100 282 283 which runs the thread in the current frame till it reaches line 100 in 284 this frame or stops if it leaves the current frame. This is a pretty 285 close equivalent to gdb's "until" command. 286 287 288 One thing here that might be a little disconcerting to gdb users here is that 289 when you resume process execution, you immediately get a prompt back. That's 290 because the lldb interpreter remains live when you are running the target. 291 This allows you to set a breakpoint, etc without having to explicitly interrupt 292 the program you are debugging. We're still working out all the operations 293 that it is safe to do while running. But this way of operation will set us 294 up for "no stop" debugging when we get to implementing that. 295 296 If you want to interrupt a running program do: 297 298 (lldb) process interrupt 299 300 To find out the state of the program, use: 301 302 (lldb) process status 303 Process 47958 is running. 304 305 This is very convenient, but it does have the down-side that debugging 306 programs that use stdin is no longer as straightforward. For now, you 307 have to specify another tty to use as the program stdout & stdin using 308 the appropriate options to "process launch", or start your program in 309 another terminal and catch it with "process attach -w". We will come 310 up with some more convenient way to juggle the terminal back & forth 311 over time. 312 313 314 e) Examining program state: 315 316 Once you've stopped, lldb will choose a current thread, usually the 317 one that stopped "for a reason", and a current frame in that thread. 318 Many the commands for inspecting state work on this current 319 thread/frame. 320 321 To inspect the current state of your process, you can start with the 322 threads: 323 324 (lldb) thread list 325 Process 46915 state is Stopped 326 * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread 327 thread #2: tid = 0x2e03, 0x00007fff85cbb08a, where = libSystem.B.dylib`kevent + 10, queue = com.apple.libdispatch-manager 328 thread #3: tid = 0x2f03, 0x00007fff85cbbeaa, where = libSystem.B.dylib`__workq_kernreturn + 10 329 330 The * indicates that Thread 1 is the current thread. To get a 331 backtrace for that thread, do: 332 333 (lldb) thread backtrace 334 thread #1: tid = 0x2c03, stop reason = breakpoint 1.1, queue = com.apple.main-thread 335 frame #0: 0x0000000100010d5b, where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405 336 frame #1: 0x00007fff8602d152, where = AppKit`-[NSApplication sendAction:to:from:] + 95 337 frame #2: 0x00007fff860516be, where = AppKit`-[NSMenuItem _corePerformAction] + 365 338 frame #3: 0x00007fff86051428, where = AppKit`-[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 121 339 frame #4: 0x00007fff860370c1, where = AppKit`-[NSMenu performKeyEquivalent:] + 272 340 frame #5: 0x00007fff86035e69, where = AppKit`-[NSApplication _handleKeyEquivalent:] + 559 341 frame #6: 0x00007fff85f06aa1, where = AppKit`-[NSApplication sendEvent:] + 3630 342 frame #7: 0x00007fff85e9d922, where = AppKit`-[NSApplication run] + 474 343 frame #8: 0x00007fff85e965f8, where = AppKit`NSApplicationMain + 364 344 frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11 345 frame #10: 0x0000000100000f20, where = Sketch`start + 52 346 347 You can also provide a list of threads to backtrace, or the keyword 348 "all" to see all threads: 349 350 (lldb) thread backtrace all 351 352 Next task is inspecting data: 353 354 The most convenient way to inspect a frame's arguments and local variables is: 355 356 (lldb) frame variable 357 self = (SKTGraphicView *) 0x0000000100208b40 358 _cmd = (struct objc_selector *) 0x000000010001bae1 359 sender = (id) 0x00000001001264e0 360 selection = (NSArray *) 0x00000001001264e0 361 i = (NSUInteger) 0x00000001001264e0 362 c = (NSUInteger) 0x00000001001253b0 363 364 You can also choose particular variables to view: 365 366 (lldb) frame variable self 367 (SKTGraphicView *) self = 0x0000000100208b40 368 369 The frame variable command is not a full expression parser but it 370 does support some common operations like dereferencing: 371 372 (lldb) fr v *self 373 (SKTGraphicView *) self = 0x0000000100208b40 374 (NSView) NSView = { 375 (NSResponder) NSResponder = { 376 ... 377 378 and structure element references: 379 380 (lldb) frame variable self.isa 381 (struct objc_class *) self.isa = 0x0000000100023730 382 383 The frame variable command will also perform "object printing" operations on 384 variables (currently we only support NSPrintForDebugger) with: 385 386 (lldb) fr v -o self 387 (SKTGraphicView *) self = 0x0000000100208b40 388 <SKTGraphicView: 0x100208b40> 389 390 You can select another frame to view with: 391 392 (lldb) frame select 9 393 frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11 394 8 395 9 396 10 int main(int argc, const char *argv[]) { 397 11 -> return NSApplicationMain(argc, argv); 398 12 } 399 13 400 14 401 402 Another neat trick that the variable list does is array references, so: 403 404 (lldb) fr v argv[0] 405 (char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch" 406 407 If you need to view more complex data or change program data, you can 408 use the general "expression" command. It takes an expression and 409 evaluates it in the scope of the currently selected frame. For instance: 410 411 (lldb) expr self 412 $0 = (SKTGraphicView *) 0x0000000100135430 413 (lldb) expr self = 0x00 414 $1 = (SKTGraphicView *) 0x0000000000000000 415 (lldb) frame var self 416 (SKTGraphicView *) self = 0x0000000000000000 417 418 You can also call functions: 419 420 (lldb) expr (int) printf ("I have a pointer 0x%llx.\n", self) 421 $2 = (int) 22 422 I have a pointer 0x0. 423 424 One thing to note from this example is that lldb commands can be defined to 425 take "raw" input. "expression" is one of these. So in the expression command, 426 you don't have to quote your whole expression, nor backslash protect quotes, 427 etc... 428 429 Finally, the results of the expressions are stored in persistent variables 430 (of the form $[0-9]+) that you can use in further expressions, like: 431 432 (lldb) expr self = $0 433 $4 = (SKTGraphicView *) 0x0000000100135430 434 435 f) Customization: 436 437 You can use the embedded Python interpreter to add the following 'pwd' and 'cd' commands 438 for your lldb session: 439 440 (lldb) script import os 441 (lldb) command alias pwd script print os.getcwd() 442 (lldb) command regex cd "s/^(.*)$/script os.chdir(os.path.expanduser('%1'))/" 443 444 ... 445 446 (lldb) cd /tmp 447 script os.chdir(os.path.expanduser('/tmp')) 448 (lldb) pwd 449 /private/tmp 450 (lldb) 451 452 Or for a more capable 'cd' command, create ~/utils.py like this: 453 454 import os 455 456 def chdir(debugger, args, result, dict): 457 """Change the working directory, or cd to ${HOME}.""" 458 dir = args.strip() 459 if dir: 460 os.chdir(args) 461 else: 462 os.chdir(os.path.expanduser('~')) 463 print "Current working directory: %s" % os.getcwd() 464 465 and, have the following in your ~/.lldbinit file: 466 467 script import os, sys 468 script sys.path.append(os.path.expanduser('~')) 469 script import utils 470 command alias pwd script print os.getcwd() 471 command script add -f utils.chdir cd 472 473 and, then in your lldb session, you can have: 474 475 (lldb) help cd 476 477 Change the working directory, or cd to ${HOME}. 478 Syntax: cd 479 (lldb) cd 480 Current working directory: /Volumes/data/Users/johnny 481 (lldb) cd /tmp 482 Current working directory: /private/tmp 483 (lldb) pwd 484 /private/tmp 485 (lldb) 486 487 For more examples of customization, look under the ToT/examples/customization 488 directory. 489