ios调试技巧

调试时修改变量 e

使用如下命令e或expr可以修改变量值

e self.ttt = 3
e username = @ "username"

expr还能新声明变量,如下所示

expr int $b=2
p $b

调试时执行语句 call

call [self.view setBackgroundColor:[UIColor redColor]]

其实使用p,po,call都可以调用方法,只是p和po都是用于输出的有返回值的。call一般只在不需要显示输出,或是方法无返回值时使用。

    p [self.view setBackgroundColor:[UIColor redColor]] 
    p (void)[CATransaction flush] 

打印堆栈 bt

打印调用堆栈,加all可打印所有thread的堆栈。不详细举例说明,感兴趣的朋友可以自己试试。

打印视图层次

po [self.contentView recursiveDescription]

修改方法返回值

thread return NO/YES

监听某个方法的调用

http://www.iosxxx.com/images/xcode/1.gifenter description here

系统方法就要如图所示,x86_64系统中,rdi表示第一个参数,具体其他平台可看inspecting-obj-c-parameters-in-gdb,里面有详细的说明

$rdi ➡ arg0 (self)
$rsi ➡ arg1 (_cmd)
$rdx ➡ arg2
$rcx ➡ arg3
$r8 ➡ arg4
$r9 ➡ arg5

image寻址,找到崩溃行

有些时候crash 不会告诉你crash在哪一行,需要我们去查,如下代码

NSArray *arr=[[NSArray alloc] initWithObjects:@"1",@"2", nil];
NSLog(@"%@",arr[2]);

crash日志如下


    0   CoreFoundation                      0x0000000110e8b1e6 __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x0000000110520031 objc_exception_throw + 48
    2   CoreFoundation                      0x0000000110ecb0bc _CFThrowFormattedException + 194
    3   CoreFoundation                      0x0000000110f3d750 +[__NSArrayI allocWithZone:] + 0
    4   A                                   0x000000010fc20381 -[ViewController viewWillAppear:] + 273
    5   UIKit                               0x00000001114b1d60 -[UIViewController _setViewAppearState:isAnimating:] + 442
    6   UIKit                               0x00000001114b25cf -[UIViewController __viewWillAppear:] + 131
    7   UIKit                               0x00000001114b3e28 -[UIViewController viewWillMoveToWindow:] + 757
    8   UIKit                               0x00000001113bec1e -[UIView(Hierarchy) _willMoveToWindow:withAncestorView:] + 655
    9   UIKit                               0x00000001113d03fc -[UIView(Internal) _addSubview:positioned:relativeTo:] + 453
    10  UIKit                               0x000000011137a4d5 -[UIWindow addRootViewControllerViewIfPossible] + 1068

先找到非系统bug的崩溃地址,在我们这里就是
4 A 0x000000010fc20381 -[ViewController viewWillAppear:] + 273

然后调用image lookup --address 0x000000010fc20381得到结果如下所示

    Address: A[0x0000000100001381] (A.__TEXT.__text + 417)
      Summary: A`-[ViewController viewWillAppear:] + 273 at ViewController.m:30

symbol

添加指定的方法为断点,比如添加一个 viewDidLoad Symbol
enter description here

如果你要添加某个特定类的实例方法,可以用 -[类名 实例方法名] 。类方法是+[类名 方法名]
enter description here

unrecognized selector send to instancd 快速定位

在Symbolic中填写如下方法签名 -[NSObject(NSObject) doesNotRecognizeSelector:]
enter description here

Ref

http://www.iosxxx.com/blog/2015-06-30-xcodediao-shi-(ru-men-pian)chang-yong-ming-ling.html
https://juejin.im/entry/5a1679fff265da43085db1a5

猜你喜欢

转载自blog.csdn.net/litefish/article/details/81204219
今日推荐