xgupta created this revision. xgupta updated this revision to Diff 369063. xgupta added a comment. xgupta updated this revision to Diff 369099. xgupta retitled this revision from "[LLDB][Docs] Convert some .txt files to .rst" to "[LLDB][Docs] Convert links.md & lldb-for-gdb-users.txt file to respective .rst files". xgupta edited the summary of this revision. xgupta published this revision for review. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
Convert lldb-for-gdb-users.txt xgupta added a comment. move lldb-for-gdb-users.rst to use/ folder Update links.md & lldb-for-gdb-users.txt file to respective .rst fles for consistency as most of the documentation is written in reStructuredText format. Signed-off-by: Shivam Gupta <shivam98....@gmail.com> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D108807 Files: lldb/docs/lldb-for-gdb-users.txt lldb/docs/use/links.md lldb/docs/use/links.rst lldb/docs/use/lldb-for-gdb-users.rst
Index: lldb/docs/use/lldb-for-gdb-users.rst =================================================================== --- lldb/docs/use/lldb-for-gdb-users.rst +++ lldb/docs/use/lldb-for-gdb-users.rst @@ -1,8 +1,14 @@ +LLDB for GDB users +================== + Here's a short precis of how to run lldb if you are familiar with the gdb command set: +.. contents:: + :local: -1) LLDB Command Structure: +LLDB Command Structure: +----------------------- First some details on lldb command structure to help orient you... @@ -10,6 +16,8 @@ the lldb command syntax fairly structured. The commands are all of the form +:: + <noun> <verb> [-options [option-value]] [argument [argument...]] The command line parsing is done before command execution, so it is @@ -27,7 +35,9 @@ arguments are the arguments you are passing to the program. So if you wanted to pass an argument that contained a "-" you would have to do: -(lldb) process launch -- -program_arg value +:: + +> (lldb) process launch -- -program_arg value We also tried to reduce the number of special purpose argument parsers, which sometimes forces the user to be a little more explicit @@ -35,11 +45,15 @@ this is the breakpoint command. In gdb, to set a breakpoint, you would just say: -(gdb) break foo.c:12 +:: + +> (gdb) break foo.c:12 or -(gdb) break foo +:: + +> (gdb) break foo if foo is a function. As time went on, the parser that tells foo.c:12 from foo from foo.c::foo (which means the function foo in the file @@ -48,38 +62,52 @@ you want to break on. The lldb commands are more verbose but also precise. So you say: -(lldb) breakpoint set -f foo.c -l 12 +:: + +> (lldb) breakpoint set -f foo.c -l 12 to set a file & line breakpoint. To set a breakpoint on a function by name, you do: -(lldb) breakpoint set -n foo +:: + +> (lldb) breakpoint set -n foo This can allow us to be more expressive, so you can say: -(lldb) breakpoint set -M foo +:: + +> (lldb) breakpoint set -M foo to break on all C++ methods named foo, or: -(lldb) breakpoint set -S alignLeftEdges: +:: + +> (lldb) breakpoint set -S alignLeftEdges: to set a breakpoint on all ObjC selectors called alignLeftEdges:. It also makes it easy to compose specifications, like: -(lldb) breakpoint set -s foo.dylib -n foo +:: + +> (lldb) breakpoint set -s foo.dylib -n foo for all functions called foo in the shared library foo.dylib. Suggestions on more interesting primitives of this sort are also very welcome. So for instance: -(lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]" +:: + +> (lldb) breakpoint set -n "-[SKTGraphicView alignLeftEdges:]" Just like gdb, the lldb command interpreter does a shortest unique string match on command names, so the previous command can also be typed: -(lldb) b s -n "-[SKTGraphicView alignLeftEdges:]" +:: + +> (lldb) b s -n "-[SKTGraphicView alignLeftEdges:]" lldb also supports command completion for source file names, symbol names, file names, etc. Completion is initiated by a hitting a <TAB>. @@ -97,12 +125,16 @@ Finally, there is a mechanism to construct aliases for commonly used commands. So for instance if you get annoyed typing -(lldb) b s -f foo.c -l 12 +:: + +> (lldb) b s -f foo.c -l 12 you can do: -(lldb) command alias bfl breakpoint set -f %1 -l %2 -(lldb) bfl foo.c 12 +:: + +> (lldb) command alias bfl breakpoint set -f %1 -l %2 +> (lldb) bfl foo.c 12 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 @@ -126,40 +158,48 @@ with the "script" command. - -2) A typical session: - +A typical session: +------------------ a) Setting the program to debug: +```````````````````````````````` As with gdb, you can start lldb and specify the file you wish to debug on the command line: -$ lldb /Projects/Sketch/build/Debug/Sketch.app -Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). +:: + +> lldb /Projects/Sketch/build/Debug/Sketch.app +> Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). or you can specify it after the fact with the "file" command: -(lldb) file /Projects/Sketch/build/Debug/Sketch.app -Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). +:: +> (lldb) file /Projects/Sketch/build/Debug/Sketch.app +> Current executable set to '/Projects/Sketch/build/Debug/Sketch.app' (x86_64). -b) Setting breakpoints: +b) Setting breakpoints: +``````````````````````` We've discussed how to set breakpoints above. You can use "help break set" to see all the options for breakpoint setting. For instance, we might do: -(lldb) b s -S alignLeftEdges: -Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1 +:: + +> (lldb) b s -S alignLeftEdges: +> Breakpoint created: 1: name = 'alignLeftEdges:', locations = 1, resolved = 1 You can find out about the breakpoints you've set with: -(lldb) break 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 +:: + +> (lldb) break 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 Note that each "logical" breakpoint can have multiple "locations". The logical breakpoint has an integer id, and its locations have an @@ -181,7 +221,9 @@ One other thing to note for gdb users is that lldb acts like gdb with: -(gdb) set breakpoint pending on +:: + +> (gdb) set breakpoint pending on That is, lldb should always make a breakpoint from your specification, even if it couldn't find any locations that match the specification. You can tell @@ -190,16 +232,20 @@ set it so you can tell you've made a typo more easily, if that was indeed the reason no locations were found: -(lldb) b s -f no_such_file.c -l 10000000 -Breakpoint created: 1: file ='no_such_file.c', line = 10000000, locations = 0 (pending) +:: + +> (lldb) b s -f no_such_file.c -l 10000000 +> Breakpoint created: 1: file ='no_such_file.c', line = 10000000, locations = 0 (pending) You can delete, disable, set conditions and ignore counts either on all the locations generated by your logical breakpoint, or on 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: -(lldb) b command add -c 1.1 -Enter your debugger command(s). Type 'DONE' to end. +:: + +> (lldb) b command add -c 1.1 +> Enter your debugger command(s). Type 'DONE' to end. > bt > DONE @@ -209,28 +255,38 @@ c) Running the program: +``````````````````````` + Then you can either launch the process with the command: -(lldb) process launch +:: + +> (lldb) process launch or its alias: -(lldb) r +:: + +> (lldb) r Or you can attach to a process by name with: -(lldb) process attach -n Sketch +:: + +> (lldb) process attach -n Sketch The "attach by name" also supports the "-w" option which waits for the next process of that name to show up, and attaches to that. You can also attach by PID: -(lldb) process attach -p 12345 -Process 46915 Attaching -(lldb) Process 46915 Stopped -1 of 3 threads stopped with reasons: -* thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread +:: + +> (lldb) process attach -p 12345 +> Process 46915 Attaching +> (lldb) Process 46915 Stopped +> 1 of 3 threads stopped with reasons: +> * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread Note that we tell you that "1 of 3 threads stopped with reasons" and then list those threads. In a multi-threaded environment it is very @@ -241,15 +297,18 @@ d) Controlling execution: +````````````````````````` After launching, we can continue until we hit our breakpoint. The primitive commands for process control all exist under the "thread" command: -(lldb) thread continue -Resuming thread 0x2c03 in process 46915 -Resuming process 46915 -(lldb) +:: + +> (lldb) thread continue +> Resuming thread 0x2c03 in process 46915 +> Resuming process 46915 +> (lldb) At present you can only operate on one thread at a time, but the design will ultimately support saying "step over the function in @@ -273,12 +332,16 @@ And the "by instruction" versions: -(lldb) thread step-inst -(lldb) thread step-over-inst +:: + +> (lldb) thread step-inst +> (lldb) thread step-over-inst Finally, there's: -(lldb) thread until 100 +:: + +> (lldb) thread until 100 Which runs 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 @@ -295,12 +358,16 @@ If you want to interrupt a running program do: -(lldb) process interrupt +:: + +> (lldb) process interrupt To find out the state of the program, use: -(lldb) process status -Process 47958 is running. +:: + +> (lldb) process status +> Process 47958 is running. This is very convenient, but it does have the down-side that debugging programs that use stdin is no longer as straightforward. For now, you @@ -312,6 +379,7 @@ e) Examining program state: +``````````````````````````` 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. @@ -321,105 +389,130 @@ To inspect the current state of your process, you can start with the threads: -(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 +:: + +> (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 The * indicates that Thread 1 is the current thread. To get a backtrace for that thread, do: -(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 +:: + +> (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 You can also provide a list of threads to backtrace, or the keyword "all" to see all threads: -(lldb) thread backtrace all +:: + +> (lldb) thread backtrace all Next task is inspecting data: The most convenient way to inspect a frame's arguments and local variables is: -(lldb) frame variable -self = (SKTGraphicView *) 0x0000000100208b40 -_cmd = (struct objc_selector *) 0x000000010001bae1 -sender = (id) 0x00000001001264e0 -selection = (NSArray *) 0x00000001001264e0 -i = (NSUInteger) 0x00000001001264e0 -c = (NSUInteger) 0x00000001001253b0 +:: + +> (lldb) frame variable +> self = (SKTGraphicView *) 0x0000000100208b40 +> _cmd = (struct objc_selector *) 0x000000010001bae1 +> sender = (id) 0x00000001001264e0 +> selection = (NSArray *) 0x00000001001264e0 +> i = (NSUInteger) 0x00000001001264e0 +> c = (NSUInteger) 0x00000001001253b0 You can also choose particular variables to view: -(lldb) frame variable self -(SKTGraphicView *) self = 0x0000000100208b40 +:: + +> (lldb) frame variable self +> (SKTGraphicView *) self = 0x0000000100208b40 The frame variable command is not a full expression parser but it does support some common operations like dereferencing: -(lldb) fr v *self -(SKTGraphicView *) self = 0x0000000100208b40 - (NSView) NSView = { - (NSResponder) NSResponder = { +:: + +> (lldb) fr v *self +> (SKTGraphicView *) self = 0x0000000100208b40 +> (NSView) NSView = { +> (NSResponder) NSResponder = { + ... and structure element references: -(lldb) frame variable self.isa -(struct objc_class *) self.isa = 0x0000000100023730 +:: + +> (lldb) frame variable self.isa +> (struct objc_class *) self.isa = 0x0000000100023730 The frame variable command will also perform "object printing" operations on variables (currently we only support NSPrintForDebugger) with: -(lldb) fr v -o self -(SKTGraphicView *) self = 0x0000000100208b40 -<SKTGraphicView: 0x100208b40> +:: + +> (lldb) fr v -o self +> (SKTGraphicView *) self = 0x0000000100208b40 +> <SKTGraphicView: 0x100208b40> You can select another frame to view with: -(lldb) frame select 9 -frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11 - 8 - 9 - 10 int main(int argc, const char *argv[]) { - 11 -> return NSApplicationMain(argc, argv); - 12 } - 13 - 14 +:: + +> (lldb) frame select 9 +> frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11 +> 8 +> 9 +> 10 int main(int argc, const char *argv[]) { +> 11 -> return NSApplicationMain(argc, argv); +> 12 } +> 13 +> 14 Another neat trick that the variable list does is array references, so: -(lldb) fr v argv[0] -(char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch" +:: + +> (lldb) fr v argv[0] +> (char const *) argv[0] = 0x00007fff5fbffaf8 "/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch" 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: -(lldb) expr self -$0 = (SKTGraphicView *) 0x0000000100135430 -(lldb) expr self = 0x00 -$1 = (SKTGraphicView *) 0x0000000000000000 -(lldb) frame var self -(SKTGraphicView *) self = 0x0000000000000000 +:: + +> (lldb) expr self +> $0 = (SKTGraphicView *) 0x0000000100135430 +> (lldb) expr self = 0x00 +> $1 = (SKTGraphicView *) 0x0000000000000000 +> (lldb) frame var self +> (SKTGraphicView *) self = 0x0000000000000000 You can also call functions: -(lldb) expr (int) printf ("I have a pointer 0x%llx.\n", self) -$2 = (int) 22 -I have a pointer 0x0. +:: + +> (lldb) expr (int) printf ("I have a pointer 0x%llx.\n", self) +> $2 = (int) 22 +> I have a pointer 0x0. One thing to note from this example is that lldb commands can be defined to take "raw" input. "expression" is one of these. So in the expression command, @@ -429,31 +522,40 @@ Finally, the results of the expressions are stored in persistent variables (of the form $[0-9]+) that you can use in further expressions, like: -(lldb) expr self = $0 -$4 = (SKTGraphicView *) 0x0000000100135430 +:: + +> (lldb) expr self = $0 +> $4 = (SKTGraphicView *) 0x0000000100135430 f) Customization: +````````````````` You can use the embedded Python interpreter to add the following 'pwd' and 'cd' commands for your lldb session: -(lldb) script import os -(lldb) command alias pwd script print os.getcwd() -(lldb) command regex cd "s/^(.*)$/script os.chdir(os.path.expanduser('%1'))/" +:: + +> (lldb) script import os +> (lldb) command alias pwd script print os.getcwd() +> (lldb) command regex cd "s/^(.*)$/script os.chdir(os.path.expanduser('%1'))/" ... -(lldb) cd /tmp -script os.chdir(os.path.expanduser('/tmp')) -(lldb) pwd -/private/tmp -(lldb) +:: + +> (lldb) cd /tmp +> script os.chdir(os.path.expanduser('/tmp')) +> (lldb) pwd +> /private/tmp +> (lldb) Or for a more capable 'cd' command, create ~/utils.py like this: -import os +:: + + import os -def chdir(debugger, args, result, dict): + def chdir(debugger, args, result, dict): """Change the working directory, or cd to ${HOME}.""" dir = args.strip() if dir: @@ -464,25 +566,32 @@ and, have the following in your ~/.lldbinit file: -script import os, sys -script sys.path.append(os.path.expanduser('~')) -script import utils -command alias pwd script print os.getcwd() -command script add -f utils.chdir cd +:: + + script import os, sys + script sys.path.append(os.path.expanduser('~')) + script import utils + command alias pwd script print os.getcwd() + command script add -f utils.chdir cd and, then in your lldb session, you can have: -(lldb) help cd +:: + +> (lldb) help cd Change the working directory, or cd to ${HOME}. Syntax: cd -(lldb) cd -Current working directory: /Volumes/data/Users/johnny -(lldb) cd /tmp -Current working directory: /private/tmp -(lldb) pwd -/private/tmp -(lldb) + +:: + +> (lldb) cd +> Current working directory: /Volumes/data/Users/johnny +> (lldb) cd /tmp +> Current working directory: /private/tmp +> (lldb) pwd +> /private/tmp +> (lldb) For more examples of customization, look under the ToT/examples/customization directory. Index: lldb/docs/use/links.rst =================================================================== --- /dev/null +++ lldb/docs/use/links.rst @@ -0,0 +1,82 @@ +Links +===== + +This page contains links to external resources on how to use LLDB. Being +listed on this page is not an endorsement. + +Blog Posts +---------- + +`Dancing in the Debugger â A Waltz with LLDB (2014)`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A high level overview of LLDB with a focus on debugging Objective-C +code. + +Videos +------ + +`LLDB: Beyond âpoâ (2019)`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LLDB is a powerful tool for exploring and debugging your app at runtime. +Discover the various ways to display values in your app, how to format +custom data types, and how to extend LLDB using your own Python 3 +scripts. + +`Advanced Debugging with Xcode and LLDB (2018)`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Discover advanced techniques, and tips and tricks for enhancing your +Xcode debugging workflows. Learn how to take advantage of LLDB and +custom breakpoints for more powerful debugging. Get the most out of +Xcodeâs view debugging tools to solve UI issues in your app more +efficiently. + +`Debugging with LLDB (2012)`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LLDB is the next-generation debugger for macOS and iOS. Get an +introduction to using LLDB via the console interface and within Xcodeâs +graphical debugger. The team that created LLDB will demonstrate the +latest features and improvements, helping you track down bugs more +efficiently than ever before. + +`Migrating from GDB to LLDB (2011)`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LLDB is the next-generation debugger for macOS and iOS. Discover why +youâll want to start using LLDB in your own development, get expert tips +from the team that created LLDB, and see how it will help you track down +bugs more efficiently than ever before. + +Books +----- + +`Advanced Apple Debugging & Reverse Engineering (2018)`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A book about using LLDB on Apple platforms. + +Extensions +---------- + +`facebook/chisel`_ +~~~~~~~~~~~~~~~~~~ + +Chisel is a collection of LLDB commands to assist in the debugging of +iOS apps. + +`DerekSelander/LLDB`_ +~~~~~~~~~~~~~~~~~~~~~ + +A collection of LLDB aliases/regexes and Python scripts. + +.. _Dancing in the Debugger â A Waltz with LLDB (2014): https://www.objc.io/issues/19-debugging/lldb-debugging/ +.. _`LLDB: Beyond âpoâ (2019)`: https://developer.apple.com/videos/play/wwdc2019/429/ +.. _Advanced Debugging with Xcode and LLDB (2018): https://developer.apple.com/videos/play/wwdc2018/412/ +.. _Debugging with LLDB (2012): https://developer.apple.com/videos/play/wwdc2012/415/ +.. _Migrating from GDB to LLDB (2011): https://developer.apple.com/videos/play/wwdc2011/321/ +.. _Advanced Apple Debugging & Reverse Engineering (2018): https://www.raywenderlich.com/books/advanced-apple-debugging-reverse-engineering/ +.. _facebook/chisel: https://github.com/facebook/chisel +.. _DerekSelander/LLDB: https://github.com/DerekSelander/LLDB Index: lldb/docs/use/links.md =================================================================== --- lldb/docs/use/links.md +++ /dev/null @@ -1,56 +0,0 @@ -Links -===== - -This page contains links to external resources on how to use LLDB. Being listed -on this page is not an endorsement. - -## Blog Posts - -### [Dancing in the Debugger â A Waltz with LLDB (2014) ](https://www.objc.io/issues/19-debugging/lldb-debugging/) - -A high level overview of LLDB with a focus on debugging Objective-C code. - -## Videos - -### [LLDB: Beyond "po" (2019)](https://developer.apple.com/videos/play/wwdc2019/429/) - -LLDB is a powerful tool for exploring and debugging your app at runtime. -Discover the various ways to display values in your app, how to format custom -data types, and how to extend LLDB using your own Python 3 scripts. - -### [Advanced Debugging with Xcode and LLDB (2018)](https://developer.apple.com/videos/play/wwdc2018/412/) - -Discover advanced techniques, and tips and tricks for enhancing your Xcode -debugging workflows. Learn how to take advantage of LLDB and custom breakpoints -for more powerful debugging. Get the most out of Xcode's view debugging tools -to solve UI issues in your app more efficiently. - -### [Debugging with LLDB (2012)](https://developer.apple.com/videos/play/wwdc2012/415/) - -LLDB is the next-generation debugger for macOS and iOS. Get an introduction to -using LLDB via the console interface and within Xcode's graphical debugger. The -team that created LLDB will demonstrate the latest features and improvements, -helping you track down bugs more efficiently than ever before. - -### [Migrating from GDB to LLDB (2011)](https://developer.apple.com/videos/play/wwdc2011/321/) - -LLDB is the next-generation debugger for macOS and iOS. Discover why you'll -want to start using LLDB in your own development, get expert tips from the team -that created LLDB, and see how it will help you track down bugs more -efficiently than ever before. - -## Books - -### [Advanced Apple Debugging & Reverse Engineering (2018)](https://www.raywenderlich.com/books/advanced-apple-debugging-reverse-engineering/) - -A book about using LLDB on Apple platforms. - -## Extensions - -### [facebook/chisel](https://github.com/facebook/chisel) - -Chisel is a collection of LLDB commands to assist in the debugging of iOS apps. - -### [DerekSelander/LLDB](https://github.com/DerekSelander/LLDB) - -A collection of LLDB aliases/regexes and Python scripts.
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits