Xcode问题定位工具-Diagnostics

Posted 搜狗测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode问题定位工具-Diagnostics相关的知识,希望对你有一定的参考价值。

前言

Xcode自带了一款代码诊断工具-Diagnostics,不仅能够帮助开发同学高效地进行代码开发及定位问题,而且对测试同学来说也是一款神器,如测试中遇到偶现的崩溃、或者代码中潜在的内存泄漏以及各种线程问题等等,这种问题不仅难以复现甚至是难以发现,仅仅通过一些表象描述去提bug说服力是非常微弱的,而且开发同学也无从下手去定位问题,这时候我们就可以用这款Diagnostics工具去辅助测试,它是Xcode自带的分析代码的工具,通过开启某些选项运行代码就可以定位到如内存泄漏、内存溢出、线程错误、或其他各种crash问题所在。

下面小编将介绍一下Diagnostics工具在测试中如何使用及用在何处~

工具介绍-Diagnostics

前提条件:

Xcode工具(目前最新版本Xcode10.1)和开发代码;也就是能够成功将代码debug并运行到ios模拟器或者真机上。

1.如何使用-Diagnostics

路径:Xcode 的 Product –> Sheme –> edit scheme –> Run -> Diagnostics :

2.用在何处-Diagnostics各个选项功能

Address Sanitizer (Xcode7 +)

      AddressSanitizer的原理是当程序创建变量分配一段内存时,将此内存后面的一段内存也冻结住,标识为中毒内存。当程序访问到中毒内存时(越界访问),就会抛出异常,并打印出相应log信息。调试者可以根据中断位置和的log信息,识别bug。如果变量释放了,变量所占的内存也会标识为中毒内存,这时候访问这段内存同样会抛出异常(访问已经释放的对象)。

Main Thread Checker

        在app启动时,Main Thread Checker会用被调用方法implementation的一个替换版本动态的替换那些只应该在主线程调用的方法implementation。而这个方法的implementation的替换版本可以在调用之前预先检查出其是否在主线程上调用。简而言之就是,可以帮助开发者检查出那些应该在主线程调用但却在后台线程调用了的API。

        pause on issues选中后,程序会停止在问题代码那一行,不再继续执行。

Thread Sanitizer 

        当两个线程并发访问同一个变量,并且至少有一个访问是写时,会发生数据竞争。Thread Sanitizer可以帮助识别这些问题,作为一个能够检查线程错误的工具, 它能检查错误的类型包括一下几种:

1)Use of uninitialized mutexes

2)Thread leaks (missing phread_johin)

3)Unsafe calls in signal handlers (ex:malloc)

4)Unlock from wrong thread

5)Data race

Undefined Behaviour Sanitizer

        可以帮助开发者在运行时找到一些异常情况,包括如下情况:

1)运行时的Bug查找:整型溢出;

2)检查C中的不安全的Constructs;

3)和其他运行时的工具可以兼容;

Malloc Scribble

        申请内存后在申请的内存上填0xAA,内存释放后在释放的内存上填0x55;再就是说如果内存未被初始化就被访问,或者释放后被访问,就会引发异常,这样就可以使问题尽快暴漏出来。Scribble其实是malloc库libsystem_malloc.dylib自身提供的调试方案。

Malloc Guard Edges

        申请大片内存的时候在前后page上加保护,保护模式可自行Google。

Guard Mallocs

        使用libgmalloc捕获常见的内存问题,比如越界、释放之后继续使用。由于libgmalloc在真机上不存在,因此这个功能只能在模拟器上使用。

Zombie Objects

        Zombie的原理是用生成僵尸对象来替换dealloc的实现,当对象引用计数为0的时候,将需要dealloc的对象转化为僵尸对象。如果之后再给这个僵尸对象发消息,则抛出异常,并打印出相应的信息,调试者可以很轻松的找到异常发生位置。

Logging

        设置调试过程中,输出的日志包含的内容。

        Malloc Stack:动态内存分配栈,记录分配内存和释放内存时相关栈的信息。

        Dynamic Linker API Usage:记录动态链接相关API的调用信息。

        Dynamic Library Loads:库加载信息,记录动态链接相关API的调用信息。

结束语

     学习了Diagnostics工具如何使用及用在何处,接下来就是学以致用了,小编测试中最常用的是Address Sanitizer、Thread Sanitizer 和Zombie Objects,定位到了许多代码中的内存和线程错误问题,很多难以复现的严重问题也不需要你尝试各种姿势费尽九牛二虎之力去复现了,对开发同学来说解bug效率也嗖嗖地提升了,两全其美,有兴趣的同学可以尝试一下~




以上是关于Xcode问题定位工具-Diagnostics的主要内容,如果未能解决你的问题,请参考以下文章

Xcode的诊断配置

Xcode的诊断配置

Xcode7中新技术

iOS 5:使用 Xcode/Storyboard 在工具栏中定位条形按钮项

Xcode 使用和问题记录

Shell 脚本调用错误 - Xcode 6