前言
新博客
lldb命令的格式如下 :
<noun> <verb> [-options [option-value]] [argument [argument..]]
断点管理
- 简单地通过文件和行号进行断点 :
breakpoint set --file foo.c --line 12
breakpoint set -f foo.c -l 12
- 通过函数的名称来设置断点 :
breakpoint set --name foo
breakpoint set -n foo
- 可以同时使用 -n来设置多个函数的断点:
`breakpoint set -n foo -n bar
- `要为C++函数设置断点,使用method :
breakpoint set --method foo
breakpoint set -M foo
- 设置 OC里面selector的断点 :
breakpoint set --seletor alignLeftEdges:
breakpoint set -S alignLeftEdges:
- 也可以针对可执行的image设置断点 :
breakpoint set --shlib foo.dylib --name foo
breakpoint set -s foo.dylib -n foo
可以重复使用 --shlib来标记多个公共库。
- breakpoint简写为br :
breakpoint set -n "-[SKTGraphicView alignLeftEdges:]"
br s -n "-[SKTGraphicView alignLeftEdges:]"
(lldb) br list
No breakpoints currently set.
(lldb) br li
No breakpoints currently set.
使用 breakpoint delete id 删除断点,简写 br del, 使用breakpoint enable id 和 breakpoint disable id 来启用或禁用断点,
自定义alias
我们可以设置alias :
`command alias bfl breakpoint set -f %1 -l %2
`
`bfl foo.c 12
`用户可以修改~/.lldbinit文件,以存储自己的快捷键。
流程控制
process continue 取消暂停,继续执行函数 ,别名是 continue,简写是 c.
thread step-over : 执行当前函数中的一行代码,但是不跳进函数。简写是 next ,n 。
thread step-in : 跳进函数中, 简写 step,s 。
thread step-out : 跳出函数,简写是 finish 。
thread list : 列出线程列表
thread backtrace : 列出线程堆栈。可以通过thread select 2切换线程。 thread backtrace all 输出所有线程堆栈
thread return <RETURN EXPRESSION> : 直接返回当前函数, 可以设置返回值。
查看当前的断点的函数信息。
(lldb) frame info
frame #0: 0x0000000114ab4e76 libsystem_kernel.dylib`mach_msg_trap + 10
可以通过help命令查看帮助, 如help frame ,help thread , help process 。
调试的时候,我们经常需要打印界面的层次,使用以下命令:
po [[UIApp keyWindow] recursiveDescription]
recursiveDescription是一个私有函数。会打印出view的所有层次信息。
lldb高级
初始化程序,目的是从程序入口就开始进行附着,这样我们就可以在一些安全防护代码执行之前,进行破解。 最常用的就是跳过ptrace
- 添加Action以在断点时,执行自定义事件
(lldb) breakpoint set -n isEven
Breakpoint 1: where = DebuggerDance`isEven + 16 at main.m:4, address = 0x00000001083b5d00
(lldb) breakpoint modify -c 'i == 99' 1
(lldb) breakpoint command add 1
Enter your debugger command(s). Type 'DONE' to end.
> p i
> DONE
breakpoint modify -c 'i == 99' 1 指添加action的触发条件。
ps:hopper中最常用的操作(直接修改汇编代码 ,在菜单Modify - Assemble Instruction 进行汇编代码的修改。)