动态调试就是在咱们的程序运行之时,经过下断点、打印等一系列方式查看参数、返回值、函数调用流程等等。不只是在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...]]
复制代码
对应着app
命令 子命令 命令操做 命令选项 命令参数
复制代码
例如给test这个函数设置断点:iphone
breakpoint set -n test
复制代码
help指令能够帮助咱们快速查找LLDB指令的使用方法tcp
help breakpoint
help breakpoint set
复制代码
expression指令被用来执行一个表达式函数
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
复制代码