初识 LLDB
越看大别的书愈发觉得自己基础的薄弱,刚对汇编有了一个初步认识,接下来又要用 lldb 来看寄存器数据,这让我如何是好,只好再次放下书,继续 Google ……
同样,本文只为我在简单了解 lldb 时的笔记,定有纰漏还请见谅。
什么是 LLDB
The LLDB Debugger (LLDB) is a software debugger. It is built as a set of reusable components which extensively use existing libraries from the larger LLVM Project, such as the Clang expression parser and LLVM disassembler. — quote from Wikipedia
LLDB 调试器是一款软件调试器。它是作为一组可重用组件构建的,它广泛使用来自较大 LLVM 项目的现有库,如 Clang 表达式解析器和 LLVM 反汇编器。
如何使用 LLDB 来调试
这里以经典的 hello.c 程序来演示:
源码如图所示
首先我们用 gcc 来编译出可执行文件,gcc hello.c -o hello
准备工作都做好了,接下来就可以进行调试工作了。
在命令行中输入 lldb ./hello 即可进入调试模式:
到了这一步,可能你不知所措了,这个时候可以键入 help 来查看 lldb 所支持的所有指令。
由于 lldb 有非常多的命令,这里就不一一截图了,只展示一小部分。不过还是要把常用的一些指令拿出来说一下:
list / l 查看代码
Tips: 不输入指令直接回车,会执行上一次执行的指令。
你或许会发现 list 之后再回车或者执行 list 将没有内容输出,这是因为已经 list 到文末,没有内容可以输出了,这个时候键入 list 1 / l 1 就回到第一行来。
此外,list n (n 表示自然数)表示从指定行向下输入 10 行。如果你的项目由多个文件构成,还可以 list filename 查看指定文件的代码。list function_name 查看具体函数。
breakpoint / br 断点
我们知道想要调试程序则必须要有断点,lldb 也一样,通过 breakpoint / br 可以设置断点。
可以根据函数名下断点,如图所示(br set -n main # C 函数);
还可以根据:
文件名 + 行号:br set –file filename –line line_number
C++ 类方法:br set –method func
Objective-C 选择器:br set –selector func
等等。
br list 查看断点列表
br disable breakpoint_number (breakpoint_number 为 list 所示标号) 禁用指定断点
br enable breakpoint_number (breakpoint_number 为 list 所示标号) 启用指定断点
br delete breakpoint_number (breakpoint_number 为 list 所示标号) 删除指定断点
OK,断点加好了,这个时候就需要启动了,很简单,键入 r 即可运行。
run / r 运行
next / n , step over 下一步
step / s, step into 步入
finish. step out 步出
continue / c, goto next breakpoint 继续执行到下一个断点
print / p, 打印出变量
call, 调用
backtrace / bt, 打印出当前堆栈
register read, 读取寄存器信息
disassemble –pc, 打印出寄存器指向的信息
…