• iOScrash分析和抛出异常和一些杂项


    http://www.cnblogs.com/smileEvday/p/Crash1.html

    Exception codes

    0x8badf00d错误码:Watchdog超时,意为“ate bad food”

     

    0xdeadfa11错误码:用户强制退出,意为“dead fall”

     

    0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。

     

    0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。

     

    0xc00010ff错误码:因为太烫了被干掉,意为“cool off”

     

    0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”。

    Exception types

    SEGV(Segmentation Violation,段违例),表明内存操作不当,比如访问一个没有权限的内存地址。

    SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;

    SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);

    SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;

    SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;

    SIGPIPE:管道另一端没有进程接手数据;

     

     

    swift抛出异常处理:

    // 定义一个可以抛错误的方法…
    func someFunctionWhichCanFail(param: Int) throws -> String {
      ...
      if (param > 0) {
        return "somestring"
      }
      else {
        throw NSError(domain: "MyDomain", code: 500, userInfo: nil)
      }
    }

    // … 然后调用这个方法
    do {
      let result: String = try someFunctionWhichCanFail(-2)
      print("success! (result)")
    }
    catch {
      print("Oops: (error)")
    }

     

     

    crash分析
    Exception codes:
    0x8badf00d错误码:Watchdog超时,意为“ate bad food”。

    0xdeadfa11错误码:用户强制退出,意为“dead fall”。

    0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。

    0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。

    0xc00010ff错误码:因为太烫了被干掉,意为“cool off”。

    0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”。
    Exception types:
    SEGV(Segmentation Violation,段违例),表明内存操作不当,比如访问一个没有权限的内存地址。
    SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;
    SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);
    SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;
    SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;
    SIGPIPE:管道另一端没有进程接手数据;

    Binary Images:crash时刻app家在地所有库,其中第一行是Crash发生时我们App可执行文件的信息,可以看出为armv7,可执行文件的包得uuid位c0f……cd65,解析Crash的时候dsym文件的uuid必须和这个一样才能完成Crash的符号化解析。
    常见的Crash类型
    1、Watchdog timeout
    Exception Code:0x8badf00d, 不太直观,可以读成“eat bad food”,意思是don‘t block main thread
    紧接着下面会有一段描述:
    Application Specific Information:
    com.xxx.yyy   failed to resume in time
    对于此类Crash,我们应该去审视自己App初始化时做的事情是否正确,是否在主线程请求了网络,或者其他耗时的事情卡住了正常初始化流程。
    通常系统允许一个App从启动到可以相应用户事件的时间最多为5S,如果超过了5S,App就会被系统终止掉。在Launch,resume,suspend,quit时都会有相应的时间要求。在Highlight Thread里面我们可以看到被终止时调用到的位置,xxxAppDelegate加上行号。
    PS. 在连接Xcode调试时为了便于调试,系统会暂时禁用掉Watchdog,所以此类问题的发现需要使用正常的启动模式。
    2、User force-quit
    Exception Codes: 0xdeadfa11, deadfall
    这个强制退出跟我们平时所说的kill掉后台任务操作还不太一样,通常在程序bug造成系统无法响应时可以采用长按电源键,当屏幕出现关机确认画面时按下Home键即可关闭当前程序。
    3、Low Memory termination
    跟一般的Crash结构不太一样,通常有Free pages,Wired Pages,Purgeable pages,largest process 组成,同事会列出当前时刻系统运行所有进程的信息。
    关于Memory warning可以参看我之前写的一篇文章IOS 内存警告 Memory warning level。
    App在运行过程中,系统内存紧张时通常会先发警告,同时把后台挂起的程序终止掉,最终如果还是内存不够的话就会终止掉当前前台的进程。
    当接受到内存警告的事后,我们应该释放尽可能多的内存,Crash其实也可以看做是对App的一种保护。
    4、Crash due to bugs
    因为程序bug导致的Crash通常千奇百怪,很难一概而论。大部分情况通过Crash日志就可以定位出问题,当然也不排除部分疑难杂症看半天都不值问题出在哪儿。这个就只能看功底了,一点点找,总是能发现蛛丝马迹。是在看不出来时还可以求助于Google大神,总有人遇到和你一样的Bug
    三、常见的Exception Type & Exception Code
    1、Exception Type
    1)EXC_BAD_ACCESS
    此类型的Excpetion是我们最长碰到的Crash,通常用于访问了不改访问的内存导致。一般EXC_BAD_ACCESS后面的"()"还会带有补充信息。
    SIGSEGV: 通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。
    SIGABRT:  收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。
    SEGV:(Segmentation  Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出等;
    SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常(如地址对齐问题)
    SIGILL:尝试执行非法的指令,可能不被识别或者没有权限
    2)EXC_BAD_INSTRUCTION
    此类异常通常由于线程执行非法指令导致
    3)EXC_ARITHMETIC
    除零错误会抛出此类异常
    2、Exception Code
    0xbaaaaaad    此种类型的log意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态。通常可以通过同时按Home键和音量键,可能由于用户不小心触发
    0xbad22222    当VOIP程序在后台太过频繁的激活时,系统可能会终止此类程序
    0x8badf00d    这个前面已经介绍了,程序启动或者恢复时间过长被watch dog终止
    0xc00010ff    程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止
    0xdead10cc    程序退到后台时还占用系统资源,如通讯录被系统终止
    0xdeadfa11    前面也提到过,程序无响应用户强制关闭
     
    三、获取Crash的途径
    1、本机
    通过xCode连接测试机器,直接在Device中即可读取到该机器上发生的所有Crash log。
    2、itunes connect
    通过itunes connect后台获取到用户上报的Crash日志。
    3、第三方的Crash收集系统
    有很多优秀的第三方Crash收集系统大大的方便了我们收集Crash,甚至还带了符号化Crash日志的功能。比较常用的有Crashlytics,Flurry等。
    四、附录
    Apple官方文档:Understanding and Analyzing iOS Application Crash Reports
            Technical Note TN2123 CrashReporter
            https://developer.apple.com/library/ios/qa/qa1592/_index.html
    WWDC视频:  Understanding Crash Reports on iPhone OS   
      Crash日志记录的时候是将Crash发生时刻,函数的调用栈,以及线程等信息写入文件。一般都是直接写的16进制地址,如果不经过符号化的话,基本上很难获取到有用信息,下一篇我们将聊一聊Crash日志的符号化,通俗点讲就是让Crash日志变成我们可读的格式。
    terminate_handler unexpectedly threw an exception

     

    OS X 和iOS
    访问越狱手机.ipa路径:/Users/Developer/Music/iTunes/iTunes Media/Mobile Applications

     

    swift一些技巧

    判断版本号:if #available(iOS 8.0, *){}
    模态半透明弹出框:设置控制器的modalPresentationStyle属性
    当shouldRasterize设成true时,layer被渲染成一个bitmap,并缓存起来,等下次使用时不会再重新去渲染了。实现圆角本身就是在做颜色混合;解决卡顿问题(self.layer.rasterizationScale = [UIScreen mainScreen].scale)

    scrollView代理方法:
    DidEndDragging    停止拖拽的时候开始执行  
    DidEndDecelerating   减速停止的时候开始执行
        //先是执行 停止拖拽的代理   然后再执行减速停止的代理

    第三方:sunnyxxx的FDFullscreenPopGesture
    * fd_interactivePopDisabled:可单独关闭某个controller的滑动返回手势
    * fd_interactivePopMaxAllowedInitialDistanceToLeftEdge:自定义手势范围。



    资料

    xcode:https://developer.apple.com/download/more

    翻墙:
    https://laod.cn/hosts/2016-google-hosts.html


    ffmpeg:http://www.jianshu.com/p/08107176d5bb

    http://blog.csdn.net/leixiaohua1020/article/details/47072519

    抓包:
    https://gold.xitu.io/post/584b711d8e450a006c586ca6

     

    ssh和git 一些命令
    ssh key路径~/.ssh/        key(公钥)在id_rsa.pub文件下用vi查看
    添加密钥到ssh:ssh-add ~/.ssh/id_rsa


    配置文件
    http://blog.csdn.net/jason_chen13/article/details/50751853
    http://www.tuicool.com/articles/ymeMfaq

     git rm --cached camera.xcodeproj/project.xcworkspace/xcuserdata/Developer.xcuserdatad/UserInterfaceState.xcuserstate

    find . -name .DS_Store -print0 | xargs -0 Git rm -f --ignore-unmatch

  • 相关阅读:
    Android 获取自带浏览器上网记录
    android 中的 ViewPager+ Fragment
    Git分支操作
    图形验证码的识别
    mac平台搭建安卓开发环境
    [报错集合]Uncaught ReferenceError: xxx is not defined
    Centos安装Python3
    VSCode 代码格式化 快捷键
    Mac下用Parallels Desktop安装Ubuntu
    请求头headers
  • 原文地址:https://www.cnblogs.com/hazhede/p/5719048.html
Copyright © 2020-2023  润新知