lldb
2022-03-27
直接回车 重复上一条命令
可以设置命令别名
l/list 源码(编译时带-g)
- +文件名 看特定文件(多文件编译时)
- +函数名
b/breakpoint+行号 下断点(可–file指定文件)
- +–method+cpp类名 按类下断点
- +set+–name+函数名 按函数名下断点
- +list 查看断点列表
- +disabled 禁用断点
- +enabled 启用断点
- +delete 删除断点
n/next 步过(源码级别)
- ni (汇编级别) s/step 步入(源码级别)
- si (汇编级别) f/finish 步出 c/continue 继续执行
bt 查看所有帧(调用堆栈) frame select+序号 跳到指定帧(f +序号) frame variable 查看当前帧的变量(局部变量)
image list -o -f 各个模块的基址
register read 读取寄存器的值 register write 修改寄存器的值
e/expression+表达式 执行表达式(可修改寄存器的值 expression $r8=1)(也可调用某类某方法)(也可利用exp unsigned int $a = 0xFF 初始化变量(似乎不能在开始调试后修改变量))
thread list 打印线程
memory read
- -s 数据大小(一个单位多少字节)
- -f 显示的数据类型(使用-f观察返回)
- -c 显示多少个数据(1024个以上要加 –force)
- 可以直接填起止地址
x===memory read x+变量(+偏移) 打印二进制文件 x -f A+起始地址+结束地址 打印内存
- –size
memory write
- -s 指定写入的数据大小(1,2,4,8字节)
- 用空格将要写入的数据分开
dis/disassemble 打印当前位置的汇编 dis/disassemble -a+地址 打印汇编
- +thumb 按照相关ARM反编译(tab查看) dis/disassemble -l
p/x 按十六进制打印 p/t按二进制打印 p/o按八进制打印 参数可强制转换类型
watchpoint 硬件断点(一般最多4个)
一个插件 voltron
//如果用的是zsh安装后手动加上路径
打开监听窗口
~/ voltron view -h [16:11:57]
usage: voltron view [-h]
{backtrace,t,bt,back,registers,r,reg,register,breakpoints,b,bp,break,command,c,cmd,memory,m,mem,disasm,d,dis,stack,s,st}
...
optional arguments:
-h, --help s show this help message and exit
views:
valid view types
{backtrace,t,bt,back,registers,r,reg,register,breakpoints,b,bp,break,command,c,cmd,memory,m,mem,disasm,d,dis,stack,s,st}
additional help
backtrace (t,bt,back)
backtrace view
registers (r,reg,register)
register values
breakpoints (b,bp,break)
breakpoints view
command (c,cmd) run a command each time the debugger host stops
memory (m,mem) display a chunk of memory
disasm (d,dis) disassembly view
stack (s,st) display a chunk of stack memory
lldbinit
lldbinitcmds 列出所有命令
datawin 数据部分变化时触发断点(watchpoint)
fr v -R [object] 来查看对象内存结构
break modify -i <忽略的次数> <断点标号>
-N 指定断点名
memory read -f uint64 -s 16 [addr]
(-f (format) -s (每个元素多少字节))
// memory read -f uint64 -s 8 -c 1 [addr]
等价于 x/gx [addr]
- lldb 远程调试iOS App
mac上找到合适版本的debugserver
ls /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
将dmg里的debugserver取出, 重签名
entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/ PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key> <true/>
<key>run-unsigned-code</key> <true/>
<key>get-task-allow</key> <true/>
<key>task_for_pid-allow</key> <true/>
</dict>
</plist>
codesign -s - --entitlements entitlements.plist -f debugserver
用scp拷贝到iPhone, 然后运行
debugserver *:6666 -a [App Name | PID]
挂起App
// 以下为有线连接方式, 无线方式在这
Mac上启动代理
iproxy 6666 6666
lldb运行
platform select remote-ios
process connect connect://localhost:6666
// 连接可能需要等待一段时间lldb进行分析
// 如果出现 error: rejecting incoming connection from ::ffff:xxx.xxx.xxx.xxx (expecting ::1)
// 则iPhone上运行 debugserver xxx.xxx.xxx.xxx:6666 -a [App Name | PID]
指定一下IPv4地址 //一般是debugserver 127.0.0.1:6666 -a [App Name | PID]
其他可能报错处理方法在这