--- name: lldb description: LLDB debugger skill for C/C++/Swift/Objective-C programs. Use when debugging with LLDB on macOS, FreeBSD, or Linux-clang environments, mapping GDB mental models to LLDB commands, using LLDB in Xcode or VS Code, or debugging Swift/Objective-C. Activates on queries about LLDB commands, GDB to LLDB migration, Apple platform debugging, LLDB Python scripting, or IDE-integrated debugging with clang-built binaries. --- # LLDB ## Purpose Guide agents through LLDB sessions and map existing GDB knowledge to LLDB. Covers command differences, Apple specifics, Python scripting, and IDE integration. ## Triggers - "I'm on macOS and need to debug a C++ program" - "How does LLDB differ from GDB?" - "How do I do [GDB command] in LLDB?" - "LLDB shows `` for variables" - "How do I use LLDB in VS Code?" - "How do I write an LLDB Python script?" ## Workflow ### 1. Start LLDB ```bash lldb ./prog # load binary lldb ./prog -- arg1 arg2 # with arguments lldb -p 12345 # attach to PID lldb -c core.1234 # load core dump lldb ./prog core.1234 # binary + core ``` ### 2. GDB → LLDB command map Source: | GDB | LLDB | Notes | |-----|------|-------| | `run [args]` | `process launch [args]` / `r` | | | `continue` | `process continue` / `c` | | | `next` | `thread step-over` / `n` | | | `step` | `thread step-in` / `s` | | | `nexti` | `thread step-inst-over` / `ni` | | | `stepi` | `thread step-inst` / `si` | | | `finish` | `thread step-out` / `finish` | | | `break main` | `breakpoint set -n main` / `b main` | | | `break file.c:42` | `breakpoint set -f file.c -l 42` / `b file.c:42` | | | `break *0x400abc` | `breakpoint set -a 0x400abc` / `b -a 0x400abc` | | | `watch x` | `watchpoint set variable x` / `wa s v x` | | | `print x` | `frame variable x` / `p x` | | | `print/x x` | `p/x x` | | | `info locals` | `frame variable` / `fr v` | | | `info args` | `frame variable --arguments` | | | `backtrace` | `thread backtrace` / `bt` | | | `frame N` | `frame select N` / `f N` | | | `info threads` | `thread list` | | | `thread N` | `thread select N` | | | `thread apply all bt` | `thread backtrace all` | | | `x/10wx addr` | `memory read -s4 -fx -c10 addr` / `x/10xw addr` | | | `set var = 42` | `expression var = 42` / `expr var = 42` | | | `quit` | `quit` / `q` | | ### 3. Breakpoints ```lldb # By name b main breakpoint set --name foo breakpoint set --name foo --condition 'x > 0' # By file:line b file.c:42 breakpoint set --file file.c --line 42 # By address b -a 0x100003f20 # By regex breakpoint set --func-regex '^MyClass::' # List breakpoint list / br l # Delete breakpoint delete 2 # Disable/enable breakpoint disable 1 breakpoint enable 1 # Commands on hit breakpoint command add 1 > p x > continue > DONE ``` ### 4. Inspect state ```lldb # Print variable p x frame variable x p *ptr p arr[0] # Print expression expression x * 2 + 1 expr (int)sqrt(9.0) # All locals frame variable fr v -a # include arguments # Registers register read register read rip rsp # Memory memory read --size 4 --format x --count 10 0x7fff0000 x/10xw 0x7fff0000 # GDB-compatible syntax # Type info image lookup --type MyClass type lookup MyClass ``` ### 5. Watchpoints ```lldb watchpoint set variable x # write watchpoint watchpoint set variable -w read x # read watchpoint watchpoint set variable -w read_write x watchpoint set expression -- &x # by address watchpoint list watchpoint delete 1 ``` ### 6. Threads ```lldb thread list thread select 3 thread backtrace all thread backtrace --count 5 # limit depth # Per-thread stepping thread step-over # step this thread only ``` ### 7. macOS / Apple specifics ```lldb # Symbol lookup in shared cache image lookup --address 0x18ab12345 image lookup --name objc_msgSend # Objective-C method breakpoint b "-[NSArray objectAtIndex:]" b "+[NSString stringWithFormat:]" # Inspect Objective-C object po myObject # print-object (calls -description) po [arr count] # Show loaded libraries image list image list -b # brief (names only) ``` ### 8. VS Code integration Install the `CodeLLDB` extension. `.vscode/launch.json`: ```json { "version": "0.2.0", "configurations": [ { "name": "Debug (lldb)", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/build/prog", "args": [], "cwd": "${workspaceFolder}", "preLaunchTask": "build" } ] } ``` ### 9. LLDB Python scripting ```python import lldb def print_all_threads(debugger, command, result, internal_dict): target = debugger.GetSelectedTarget() process = target.GetProcess() for thread in process: print(f"Thread {thread.GetIndexID()}: {thread.GetName()}") for frame in thread: print(f" {frame}") def __lldb_init_module(debugger, internal_dict): debugger.HandleCommand('command script add -f myscript.print_all_threads pthreads') ``` Load: `command script import /path/to/myscript.py` For a full GDB↔LLDB command map, see [references/gdb-lldb-map.md](references/gdb-lldb-map.md). ## Related skills - Use `skills/debuggers/gdb` for GDB workflows - Use `skills/debuggers/core-dumps` for core dump analysis - Use `skills/compilers/clang` for building with debug info