iOS 调试技巧——LLDB

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

1、什么是 LLDB?

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

2、LLDB的简单使用

2.1、打印局部变量

这个是我最早接触LLDB 的用法,也是LLDB最简单的用法,操作很简单,只需要po “你所关注的变量名”,就可以该对象在该断点时的值。
在这里插入图片描述

2.2、操作断点

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

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

在这里插入图片描述

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

此种方式可以在控制台打印所以断点的详细信息在这里插入图片描述

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

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

以上面断点为例:

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

breakpoint disable 2

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

breakpoint disable 2.1

在这里插入图片描述
此时再使用breakpoint list 查看断点列表
在这里插入图片描述
会出现Options:disable标识哪些断点被禁用

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

在这里插入图片描述

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

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

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

在这里插入图片描述
在这里插入图片描述
continue可以跳过当前断点,继续执行后面的程序

3、LLDB的高级使用

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
使用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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值