美文网首页
Xcode调试

Xcode调试

作者: 观星 | 来源:发表于2017-09-19 11:05 被阅读136次

    Run

    适用场景:可以稳定复现的问题

    Debug -> Attach to Process

    前提:签名的Provisioning Profile的Entitlements中get-task-allow为true。

    默认Development Provisioning Profile这个值是true,Distribution Provisioning Profile这个值时false。在导出ipa做测试的时候,如果希望这个包可以被调试,选择"Save for Development Deployment",不希望被调试,选择“Save for Ad Hoc Deployment”。

    调试第三方应用

    基本原理还是重签名,但是操作上可以略有不同

    操作步骤

    1、获取未加密的.app
    2、使用iOS App Signer一类的工具,使用开发证书签名,就可以调试了
    3、在测试设备上安装、启动应用,连接电脑,打开Xcode -> Debug -> Attach to Process
    

    操作步骤

    1、获取解密的app
    2、建立同名工程,配置签名
    3、在run script中拷贝app到build目录,实际就是用第三方.app替换本项目生成的.app
    4、command R
    

    LLDB

    lldb的命令只要没有歧义,可以做到唯一匹配,那就可以尽可能的短,如br等效于breakpoint。

    breakpoint

    # -n,-name 
    # 对C语言函数设置断点
    breakpoint set -n viewWillAppear
    # 对OC方法设置断点
    br s -n "-[LoginVC viewWillAppear]"
    
    # 指定文件-f
    breakpoint set -f LoginVC.m -n viewWillAppear
    
    # 指定OC方法
    breakpoint set --select viewDidLoad
    br s -S viewDidLoad
    

    expression

    p、po、call都是对expression的封装。

    # 查看帮助
    (lldb)help expression
    
    # 赋值
    expression count = 18
    
    #假设对象有个私有成员变量 _canAnimation,可以通过kvc来查看这个值
    po [0x10482c6a0 valueForKey:@"canAnimation"]
    
    # int fuItem[3]
    (lldb) po [[XALiveFUManager shareInstance] fuItems][0]
    1
    

    framework

    当我们对接framework的时候,如果只有framework代码,没有工程代码,能不能debug呢?其实我们只需要拿到工程的ipa和dSYM文件,就可以debug了,通过Attach to Process,使用命令add-dsym将dSYM文件加入target,即可只debug framework,不需要工程的代码

    add-dsym ~/.../XXX.dSYM
    

    NSLog

    NSLog(@"obj指针内存地址   %x,&obj")
    NSLog(@"obj指向的对象的地址 %p",obj);
    

    一个对象可以被多个对象持有,通过Xcode查看这些变量时,显示的都是一样的地址,因为默认显示的是指针指向的对象的地址。

    指针本身也是一个变量,有自己的地址,可以输出这个地址。

    默认的description显示的也是当前对象指向的对象的地址。

    exc_bad_access

    使用Instruments, Profile -> Zombies,如果存在问题,会标记出来,可以看到变量引用计数变化的详细过程,相对于勾选scheme中的Diagnostics中的Zombie Objects更加详细,更有帮助。

    Debug View Hierarchy

    Debug View Hierarchy,一般使用reveal,很少使用Xcode自带的这个,但是Xcode自带的也能解决问题。对于UI异常,像该出现的view没有出现,很有帮助。

    Debug Memory Graph

    使用Xcode的Debug Memory Graph可以很方便的解决这种问题。

    如下图,发现XALivePageVC有个对象没有释放,点击Debug Memory Graph,在左下方搜索,能找到说明对象还存在,也就是没释放,选中就可以看到谁在引用这个对象。一个是navigationController,另外是一个XALiveToolView的toolViewClicled block,剩下的检查一下的代码就可以。

    屏幕快照 2017-11-16 下午9.13.10.png

    注意图中灰色线条和加粗黑色线条的含义
    灰色:Gray references are unknown, may be stale pointer or not strong
    加粗黑色:Bold references are known to be strong

    灰色指存在引用,但是不能确定是不是强引用,而黑色加粗表示可以确定是强引用。

    相关文章

      网友评论

          本文标题:Xcode调试

          本文链接:https://www.haomeiwen.com/subject/gfrwsxtx.html