LLDB 命令
lldb 中的命令总结下来有两点:
- 原则上只要敲够足够的命令字符,而不引起歧义,都可以执行。
- 某些较长的命令有 abbreviation(缩写)。
下面是一些分类示例,只列举了常用的和它的一些缩写,其他子命令可以通过 help 命令查看详情。
- help
(lldb) help
(lldb) he
- target
(lldb) target module
(lldb) image
(lldb) i
- process
(lldb) process launch
(lldb) run
(lldb) r
(lldb) continue
(lldb) c
- breakpoint
(lldb) breakpoint
(lldb) br
(lldb) b
(lldb) rbreak
(lldb) rb
- expression
(lldb) expression -O -- raw_input
(lldb) po
(lldb) p
(lldb) p/x 10
- thread
(lldb) thread
(lldb) bt
(lldb) frame info
(lldb) next
(lldb) step
(lldb) finish
- register
(lldb) register
- memory
(lldb) memory read
(lldb) x
- setting
(lldb) setting
- ~/.lldbinit
(lldb) command alias --
汇编
- 指令样式
opcode source destination
- 内存名词
名词 | 解释 |
---|---|
Nybble | 4 位,16 进制中的单值。 |
Byte | 字节,8 位。 |
Half word | 半字,16位,2个字节。 |
Word | 字,32位,4个字节。 |
Double word or Giant Word | 双字,64 位,8 个字节。 |
- address
最小的内存单位为 bit,我们将每个 bit 依次编号 0,1,2...N,这个编号就叫做地址。对于 32 位的指令集来说,我们就用 32 位来表示一个地址,比如 10101010101010101010101010101010,但是这样会产生两个问题,第一是,这样表示的地址太长了,不容易书写;第二是,1 bit 能储存的东西实在太少了,它只能代表 0 或 1。因此,我们就将 8 个 bit 组成一个稍微大一点的单位 byte,并且,采用 16 进制来书写地址,上面的地址转换为 16 进制就是 0x99999999。很明显是,16 进制中的两位数,比如 0x99,就代表了一个字节。另外当高位为 0 的时候,为了方便起见,我们通常将高位的 0 省略,这样表达起来更方便。到了 64 位指令集,地址的位数扩大了一倍,这样做就更加有意义了。
- stack
在程序的运行过程中必然会产生很多的函数调用,stack 就是用来这些函数调用过程中的产生的临时变量的。stack 是从高内存地址向低内存地址生长的,每一次函数调用,都把这个函数调用需要用到的栈空间称为一帧(frame)。
- RIP
可以看做 Register Instruction Pointer 的简写,用来储存指向当前指令的地址。
- RAX
储存函数的返回值。
- RSP
可以看做 Register stack pointer 的简写,总是指向栈的顶部。
- RBP
指向当前函数调用栈帧开始的地址。