po:print object的缩写,表示显示对象的文本描述,如果对象不存在则打印nil
p: 可以用来打印基本数据类型
call: 执行一段代码
call NSLog(@"%@",@"hello world");expr: 动态执行指定表达式
expr i = 3.14bt: 打印当前线程堆栈信息 如果要打印所在线程堆栈信息,使用:bt all即可。
image: 常用来寻找栈地址对应代码位置
应用场景(数组越界)模拟代码:
NSArray *array = @[@"你",@"好",@"棒"]; NSLog(@"%@",array[3]);错误信息如下:
*** Terminating app due to uncaught exception 'NSRangeException' , reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]' *** First throw call stack: ( 0 CoreFoundation 0x000000010579454b __exceptionPreprocess + 172 1 libobjc.A.dylib 0x00000001561f821e objc_exception_throw + 47 2 CoreFoundation 0x00000001087d1eeb -[__NSArrayI objectAtIndex:] + 153 3 BGMultimediaDemo 0x0000000104c25350 -[ViewController viewDidLoad] + 193 4 UIKit 0x0000000105d5306d -[UIViewController loadViewIfRequired] + 1245 ...... ...... ...... 21 BGMultimediaDemo 0x0000000104c35adf main + 111 22 libdyld.dylib 0x000000010857264e start + 1 23 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException可能出现错误的地址:
0x0000000104c25350我们可以使用下面命令来找出错误代码的位置:image lookup --address 0x0000000104c25350执行命令后输出结果如下:
Address: BGMultimediaDemo[0x0000000100001450] (BGMultimediaDemo.__TEXT.__text + 184) Summary: BGMultimediaDemo`-[ViewController viewDidLoad] + 188 at ViewController.m:15从上面输出结果中可以看出,错误位置应该是ViewController.m文件中的15行
1、点击 Xcode 中的“暂停”进入 LLDB 模式
2、输出当前 UI 树
po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
3、从 UI 树中取得要调试对象的地址,并为他起个新的变量名,方便后面使用。
expression UIView *$testView = (UIView *)0x7fb0c5f15900
4、修改 UI 内容
expression (void)[$testView setBackgroundColor:[UIColor redColor]]
5、渲染修改的 UI 内容
expression (void)[CATransaction flush]