iOS 调试技巧——LLDB

当我们的项目过大时,就会使我们项目的编译耗时过长,如何在项目运行时进项代码调试,熟练使用LLDB就可以解决这个难题,大幅度提高我们的开发效率。

1、什么是 LLDB?

LLDB是英文Low Lever Debug的缩写,是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能。

2、LLDB的简单使用

2.1、打印局部变量

这个是我最早接触LLDB 的用法,也是LLDB最简单的用法,操作很简单,只需要po “你所关注的变量名”,就可以该对象在该断点时的值。
iOS 调试技巧——LLDB_第1张图片

2.2、操作断点

通常情况下,我们可以在Xcode用鼠标打断点,其实使用LLDB也可以操作断点

a、给方法添加断点:b [xxx xxx]

iOS 调试技巧——LLDB_第2张图片

b、查看打印当前所有断点:breakpoint list

此种方式可以在控制台打印所以断点的详细信息iOS 调试技巧——LLDB_第3张图片

从打印信息中可以看出,当前有两个断点组,每组有一个断点

c、禁用断点:breakpoint disable “组ID/断点ID”

以上面断点为例:

若想把ID为2的整组断点禁用:

breakpoint disable 2

若想把ID为2.1的单个断点禁用:

breakpoint disable 2.1

iOS 调试技巧——LLDB_第4张图片
此时再使用breakpoint list 查看断点列表
iOS 调试技巧——LLDB_第5张图片
会出现Options:disable标识哪些断点被禁用

d、启用断点:breakpoint enable “组ID/断点ID”

iOS 调试技巧——LLDB_第6张图片

e、删除断点:breakpoint delete “组ID”

与禁用不同的是,删除断点只能删除一组断点,如果强行“breakpoint delete”后面+一个断点ID,则LLDB只会将这个断点禁用。iOS 调试技巧——LLDB_第7张图片
如图所示,执行breakpoint delete 2.1后,再执行breakpoint list ,断点数量并没有减少,只是ID为2.1的断点后面出现“Options:disable”标识,被禁用。当执行breakpoint delete 2后,再执行breakpoint list ,会发现组ID为2的整租断点都被删除了。

f、从当前断点处继续执行:continue

iOS 调试技巧——LLDB_第8张图片
iOS 调试技巧——LLDB_第9张图片
continue可以跳过当前断点,继续执行后面的程序

3、LLDB的高级使用

3.1、查看堆栈、线程等信息
a、打印当前线程完整的堆栈信息:bt

b、查看任何一个堆栈的信息:frame select 堆栈ID

iOS 调试技巧——LLDB_第10张图片
iOS 调试技巧——LLDB_第11张图片
iOS 调试技巧——LLDB_第12张图片

c、展示当前作用域下的参数和局部变量:frame variable

iOS 调试技巧——LLDB_第13张图片

d、展示当前列出全部线程列表:thread list
e、输出当前线程的信息:thread info

iOS 调试技巧——LLDB_第14张图片
使用LLDB来打印堆栈、线程等信息是一种很好的排查问题的方式,好好应用可以大大提高排查问题的效率。

f、反汇编地址: dis -s +地址

当我们调试过程中遇到crash,我们可以通过:dis -s +地址 命令来反汇编地址,来排查导致crash的具体原因。

添加一段必定crash的代码并执行:

- (void)crashAction {
   
    NSString *st;
    NSDictionary *dic = @{
   @"st":st};
}

控制台打印:

2020-01-19 15:33:03.724199+0800 LLDB调试[80770:54503590] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
*** First throw call stack:
(
	0   CoreFoundation                      0x00007fff23c4f02e __exceptionPreprocess + 350
	1   libobjc.A.dylib                     0x00007fff50b97b20 objc_exception_throw + 48
	2   CoreFoundation                      0x00007fff23ce1a71 _CFThrowFormattedException + 194
	3   CoreFoundation                      0x00007fff23cec496 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:].cold.4 + 38
	4   CoreFoundation                      0x00007fff23cacd57 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:] + 247
	5   CoreFoundation                      0x00007fff23c4aedb +[NSDictionary dictionaryWithObjects:forKeys:count:] + 59
	6   LLDB调试                          0x0000000103eaad29 -[ViewController crashAction] + 105
	7   LLDB调试                          0x0000000103eaacb5 -[ViewController clickAction] + 149
	8   UIKitCore                           0x00007fff47850dfa -[UIApplication sendAction:to:from:forEvent:] + 83
	9   UIKitCore                           0x00007fff4722ac22 -[UIControl sendAction:to:forEvent:] + 223
	10  UIKitCore                           0x00007fff4722af6c -[UIControl _sendActionsForEvents:withEvent:] + 398
	11  UIKitCore                           0x00007fff47229ecb -[UIControl touchesEnded:withEvent:] + 481
	12  UIKitCore                           0x00007fff4788bc1d -[UIWindow _sendTouchesForEvent:] + 2604
	13  UIKitCore                           0x00007fff4788d524 -[UIWindow sendEvent:] + 4596
	14  UIKitCore                           0x00007fff47868427 -[UIApplication sendEvent:] + 356
	15  UIKitCore                           0x00007fff478e987e __dispatchPreprocessedEventFromEventQueue + 6847
	16  UIKitCore                           0x00007fff478ec344 __handleEventQueueInternal + 5980
	17  CoreFoundation                      0x00007fff23bb2221 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
	18  CoreFoundation                      0x00007fff23bb214c __CFRunLoopDoSource0 + 76
	19  CoreFoundation                      0x00007fff23bb1924 __CFRunLoopDoSources0 + 180
	20  CoreFoundation                      0x00007fff23bac62f __CFRunLoopRun + 1263
	21  CoreFoundation                      0x00007fff23babe16 CFRunLoopRunSpecific + 438
	22  GraphicsServices                    0x00007fff38438bb0 GSEventRunModal + 65
	23  UIKitCore                           0x00007fff4784fb48 UIApplicationMain + 1621
	24  LLDB调试                          0x0000000103eab064 main + 116
	25  libdyld.dylib                       0x000

你可能感兴趣的:(iOS,And,More~,ios,objective-c)