动态调试就是在咱们的程序运行之时,经过下断点、打印等一系列方式查看参数、返回值、函数调用流程等等。不只是在iOS开放中须要动态调试,在任何语言的开发过程当中都须要用到动态调试python
可使用终端取代Xcode来对App进行动态调试正则表达式
ldid -e debugserver > debugserver.entitlements 复制代码
ldid -Sdebugserver.entitlements debugserver
复制代码
chmod +x /usr/bin/debugserver
复制代码
#查看权限基本信息 codesign -d --entitlements - debugserver #签名权限 codesign -f -s - --entitlements debugserver.entitlements debugserver #也能够简写为 codesign -fs - --entitlements debugserver.entitlements debugserver 复制代码
debugserver *:端口号 -a 进程 复制代码
*:端口号:表示使用iPhone上的某个端口启动debugserver服务(注意:不能使用保留端口号)
-a 进程:指定进程id或者进程名称express
debugserver -x auto *:端口号 App可执行文件路径
复制代码
在以前的学习中,咱们知道可使用iPhone的ip地址来链接手机,可是这样须要保证手机和电脑在同一个wifi下,而且使用这种方式传输数据十分缓慢。因此,一般的作法是经过usb链接iPhone,将iPhone上的某个端口映射到Mac上的某个端口,而后然LLDB和Mac上的端口通讯便可xcode
python ./usbmuxd/tcprelay.py -t 22:10088 9999:10089
复制代码
此处的10089端口能够任意定义,只要不使用保留端口号便可。使用10088端口映射22端口,是为了和iPhone进行SSH通讯bash
debugserver *:9999 -a live4iphone 复制代码
➜ ~ lldb
(lldb)
复制代码
process connect connect://localhost:10089
复制代码
(lldb) c
Process 635 resuming
复制代码
<command> [<subcommand> [<subcommand>...]] <action> [-options [option- value]] [argument [argument...]] 复制代码
对应着markdown
命令 子命令 命令操做 命令选项 命令参数
复制代码
例如给test这个函数设置断点:app
breakpoint set -n test 复制代码
help指令能够帮助咱们快速查找LLDB指令的使用方法iphone
help breakpoint help breakpoint set 复制代码
expression指令被用来执行一个表达式tcp
expression self.view.backgroundColor = [UIColor redColor]
//或者
expression -- self.view.backgroundColor = [UIColor redColor]
复制代码
expression后的 -- 表示命令选项结束符,表示全部的命令选项已经设置完毕,若是没有命令选项,--能够省略。若是expression以后有命令选项,则--不能省略。函数
==thread backtrace==指令的做用是打印线程的堆栈信息,效果和 ==bt== 的效果相同。
(lldb) thread backtrace * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 * frame #0: 0x0000000102d4d61d TestFont`-[ViewController touchesBegan:withEvent:](self=0x00007fd2f86066d0, _cmd="touchesBegan:withEvent:", touches=1 element, event=0x00006000036d4ab0) at ViewController.m:26 frame #1: 0x0000000106f6f8e8 UIKitCore`forwardTouchMethod + 353 ...... (lldb) bt * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 * frame #0: 0x0000000102d4d61d TestFont`-[ViewController touchesBegan:withEvent:](self=0x00007fd2f86066d0, _cmd="touchesBegan:withEvent:", touches=1 element, event=0x00006000036d4ab0) at ViewController.m:26 frame #1: 0x0000000106f6f8e8 UIKitCore`forwardTouchMethod + 353 ...... 复制代码
让函数返回某个值,不会执行以后的代码。若是函数有返回值,在后面跟上返回值,若是函数没有返回值,就直接使用thread return便可
打印当前栈帧的变量
如下指令从左到右依次表示:指令全称、指令简称、极简指令
si、ni和s、n指令相似,可是s、n是源码级别,si、ni是汇编指令级别。每一句OC代码会有一条或多条汇编指令构成,s、n指令表示一步一步执行每一句OC代码,而si、ni表示一步一步执行汇编指令。
设置断点
此处跟上正则表达式,会将全部匹配到的方法都加上断点
列出全部的断点,每一个断点都有单独的编号
禁用断点
启用断点
删除断点
给指定断点编号的断点预先设置须要执行的命令,到触发断点时,就会按顺序执行预先设置的命令
查看某个编号的断点全部预先设置的命令
删除指定编号断点的全部预设命令
给指定的内存下断点,当内存中的数据发生改变时会触发
对指定的变量设置内存断点,当变量值改变的时候会触发
watchpoint set variable self->_age 复制代码
注意:此处不能使用self.age
对指定内存地址设置断点,做用和watchpoint set variable相同
列出全部的内存断点
禁用内存断点
启用内存断点
删除内存断点
给指定断点编号的内存断点预先设置须要执行的命令,到触发内存断点时,就会按顺序执行预先设置的命令
查看某个编号的内存断点全部预先设置的命令
删除指定编号内存断点的全部预设命令
模块查询指令
列出全部所加载的模块信息
(lldb) breakpoint list (lldb) br li (lldb) br l (lldb) breakpoint set -n test (lldb) br s -n test 复制代码