Skip to content

Instantly share code, notes, and snippets.

@Josscii
Created June 6, 2017 12:50
Show Gist options
  • Save Josscii/2563712bd42f184cc8f54fd5e825282a to your computer and use it in GitHub Desktop.
Save Josscii/2563712bd42f184cc8f54fd5e825282a to your computer and use it in GitHub Desktop.
lldb 学习总结

LLDB 命令

lldb 中的命令总结下来有两点:

  1. 原则上只要敲够足够的命令字符,而不引起歧义,都可以执行。
  2. 某些较长的命令有 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

指向当前函数调用栈帧开始的地址。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment