The LLDB Debugger (LLDB) is the
debugger component of the
LLVM project. It is built as a set of reusable components which extensively use existing libraries from LLVM, such as the
Clang expression parser and LLVM
disassembler. LLDB is
free and open-source software under the
University of Illinois/NCSA Open Source License,
["LLVM Release License"](_blank)
/ref> a BSD-style permissive software license
A permissive software license, sometimes also called BSD-like or BSD-style license, is a free-software license which instead of copyleft protections, carries only minimal restrictions on how the software can be used, modified, and redistributed, ...
. Since v9.0.0, it was relicensed to the Apache License 2.0 with LLVM Exceptions.
Current state
LLDB supports debugging of programs written in C, Objective-C, and C++. The Swift community maintains a version which adds support for the language. Free Pascal and the Lazarus IDE can use LLDB as backend for their own FpDebug engine.
The LLDB debugger is known to work on macOS, Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
, FreeBSD, NetBSD and Windows, and supports i386, x86-64, and ARM instruction sets. LLDB is the default debugger for Xcode 5 and later. Android Studio also uses LLDB for debug. LLDB can be used from other IDEs, including Visual Studio Code, C++Builder, Eclipse, and CLion.
Examples of commands
An example session
Consider the following incorrect program written in C:
#include
int main(void)
Using the clang compiler on macOS, the code above can be compiled using the -g
flag to include appropriate debug information on the binary generated—including the source code—making it easier to inspect it using LLDB. Assuming that the file containing the code above is named test.c
, the command for the compilation could be:
$ clang -Wno-error=int-conversion -g test.c -o test
And the binary can now be run:
$ ./test
Segmentation fault
Since the example code, when executed, generates a segmentation fault, lldb can be used to inspect the problem:
$ lldb test
(lldb) target create "test"
Current executable set to 'test' (x86_64).
(lldb) run
Process 70716 launched: '/Users/wikipedia/test' (x86_64)
Process 70716 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xffffff90)
frame #0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18
libsystem_platform.dylib`_platform_strlen:
-> 0x7fff6c7c46f2 <+18>: pcmpeqb xmm0, xmmword ptr di 0x7fff6c7c46f6 <+22>: pmovmskb esi, xmm0
0x7fff6c7c46fa <+26>: and rcx, 0xf
0x7fff6c7c46fe <+30>: or rax, -0x1
Target 0: (test) stopped.
The problem occurs when calling the function strlen
, but we can run a backtrace to identify the exact line of code that is causing the problem:
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xffffff90)
* frame #0: 0x00007fff6c7c46f2 libsystem_platform.dylib`_platform_strlen + 18
frame #1: 0x00007fff6c66b16a libsystem_c.dylib`__vfprintf + 8812
frame #2: 0x00007fff6c6911c3 libsystem_c.dylib`__v2printf + 475
frame #3: 0x00007fff6c668e22 libsystem_c.dylib`vfprintf_l + 54
frame #4: 0x00007fff6c666f72 libsystem_c.dylib`printf + 174
frame #5: 0x0000000100000f6d test`main at test.c:5:2
frame #6: 0x00007fff6c5dc3d5 libdyld.dylib`start + 1
(lldb) source list
3 int main(void)
From the line beginning with frame #5
, LLDB indicates that the error is at line 5 of test.c
. Running source list
, we see that this refers to the call to printf
. According to the exception code EXC_BAD_ACCESS
from the backtrace, strlen
is trying to read from a region of memory it does not have access to by dereferencing an invalid pointer. Returning to the source code, we see that the variable msg
is of type char
but contains a string instead of a character. To fix the problem, we modify the code to indicate that msg
is a ''pointer'' to a string of chars
by adding the *
operator:
#include
int main(void)
After recompiling and running the executable again, LLDB now gives the correct result:
(lldb) target create "test"
Current executable set to 'test' (x86_64).
(lldb) run
Process 93319 launched: '/Users/wikipedia/test' (x86_64)
Hello, world!
Process 93319 exited with status = 0 (0x00000000)
(lldb)
LLDB runs the program, which prints the output of printf
to the screen. After the program exits normally, LLDB indicates that the process running the program has completed, and prints its exit status.
See also
* GNU Debugger
* Microsoft Visual Studio Debugger
References
External links
*{{Official website, https://lldb.llvm.org/
Supported LLDB Versions in Qt Creator
Debuggers
Free software programmed in C++
Lua (programming language)-scriptable software
Software using the University of Illinois/NCSA Open Source License
Software using the Apache license
Video game development software for Linux