Ekulelu's Blog

iOS安全开发笔记1——常用的lldb命令

iOS安全开发笔记1——常用的lldb命令

lldb,一个强大的debug调试工具,这里记录一下常用的命令。下面的命令都可以使用 help + 命令+ 子命令 来查看帮助菜单。

lldb调试的断点是可以在 ~/.lldbinit 里面写入加载的脚本,我们可以将一些通用的命令写进去。

expression

expression这个命令应该是最常用的,可以方便地进行打印各种对象信息或者执行代码。一般我们用到的都是它的简写:p 、 exp 和 po。

p 或者 exp 后面可以直接接OC的代码

po 后面则是接需要打印的对象

breakpoint

这个可以用来设置和管理断点,就像在代码区左边点一下一样。常用的命令有

  1. 设置断点,这个方法会将UIViewController的touchesBegan:withEvent:设置一个断点

    1
    breakpoint set -n "-[UIViewController touchesBegan:withEvent:]"

    后面可以带几个-n参数。注意的是这样设置的断点会归为一个组,里面的断点是这个组的第几个断点,比如下面语句会生成断点组1,里面有1.1的断点和1.2的断点。

    1
    breakpoint set -n "-[UIViewController touchesBegan:withEvent:]" -n "-[UIViewController touchesEnded:withEvent:]"

    带不同参数的时候

1
breakpoint set -r Game: // 遍历整个项目中满足Game:这个字符的所有方法
  1. 删除断点

    1
    breakpoint delete 1

    如果不带后面的断点1来指定具体的断点,则会删除全部断点。

  2. 启用和禁用断点

    1
    2
    breakpoint enable 1.2
    breakpoint disable 1
  3. 列出所有断点

    1
    breakpoint list
  4. 想在进入断点的时候执行代码,输入下面的命令之后,就会进入到一个代码编辑的状态,输入完代码之后,输入 ‘DONE’退出这个模式

    1
    breakpoint command add 1

watchpoint

监控某个变量的改变

1
watchpoint set variable p1->_name

之后就会打印出它的新值和旧值的内存地址,你可以用po进行查看。

1
2
3
Watchpoint 1 hit:
old value: 0x0000000000000000
new value: 0x0000000103cfd118

它也有和breakpoint一样的其他enable、list等子命令。

堆栈信息

打印当前堆栈,这个命令其实在左边的堆栈表里面就可看到了

1
thread backtrace

简写是

1
bt

堆栈上下跳转

最简单的就是使用downup

或者用

1
frame select 1

那个1在你打印堆栈信息的时候,每个调用栈的最前面都会有个frame #x的信息,那个1就是序号。

打印当前参数

1
frame variable

下面这个命令可以回退执行,但是继续运行之后程序就会停了。

1
thread return

stop-hook

这个命令会在断点进入lldb的时候,调用你指定的代码

1
target stop-hook add

流程控制

继续c、单步执行不进入子函数n、单步执行进入子函数s、汇编级别的单步执行ni,或者按住ctrl键去点击XCode的那些按钮。

image lookup

看内存代码,可以把命令地址转为代码,也就是符号化。这个在奔溃的时候输出的那些内存地址信息特别有用

1
image lookup -a 0x2dd33

打印头文件

1
image lookup -t 类名

register

读写寄存器

1
2
register read x0
register write x0

memory read

读内存,这个命令的简写是x

1
memory read 0x10460b4aa //内存开始地址