阅读更多

0顶
0踩

操作系统

转载新闻 Xcode7 新特性 AddressSanitizer

2017-01-17 16:21 by 副主编 jihong10102006 评论(0) 有8399人浏览
昨天发现微博的圈子里iOS学习氛围比较好,所以特意注册了一个新浪微博。无意中在微博里看到了@没故事的卓同学的文章Xcode7中你一定要知道的炸裂调试神技,介绍Xcode7中新增了AddressSanitizer工具可以捕获EXC_BAD_ACCESS。然而Xcode中不是已经有了Zombie了么?怎么又出来了一个Address Sanitizer,他们有什么区别呢?

AddressSanitizer VS Zombie

原理
  • zombie:
  • zombie的原理是用生成僵尸对象来替换dealloc的实现,当对象引用计数为0的时候,将需要dealloc的对象转化为僵尸对象。如果之后再给这个僵尸对象发消息,则抛出异常,并打印出相应的信息,调试者可以很轻松的找到异常发生位置。
  • AddressSanitizer:
  • AddressSanitizer的原理是当程序创建变量分配一段内存时,将此内存后面的一段内存也冻结住,标识为中毒内存。如图所示,黄色是变量所占内存,紫色是冻结的中毒内存。


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

适用性
了解原理之后我们可以大概猜到Zombie和AddressSanitizer的适用性,不过一切还得以实验结果为准:

实验后发现AddressSanitizer比Zombie拥有更强大的捕获能力,特别是在malloc对象和内存越界方面,zombie几乎无能为力。如果在debug的时候无法捕获异常,上线之后crash log中概率性的EXC_BAD_ACCESS简直是一种灾难。

缺陷
上面研究发现AddressSanitizer比zombie更有优势,那么AddressSanitizer有什么缺陷呢?
  • AddressSanitizer可能会没有log,不过会在访问中毒内存的代码处断住,这倒是对debug影响不大
  • 使用AddressSanitizer除了分配对象的内存之外,还需要额外的内存,这会导致App内存大量增加,用起来有可能会比较卡
虽然AddressSanitizer有一些缺陷,但是总的来说AddressSanitizer还是一个非常好用的debug工具。

AddressSanitizer使用
在了解AddressSanitizer的功能之后,我们来看看AddressSanitizer用。
AddressSanitizer的使用其实非常简单,在Xcode上方选择设备的地方,点击工程名字,选择Edit Scheme.

在Diagnostics中选中enable address sanitizer即可。

AddressSanitizer开启之后,在debug过程中,如果遇到EXC_BAD_ACCESS的问题,Xcode会自动中断,抛出异常

其他compiler flags
实际AddressSanitizer很早以前就有了,只是没在Xcode中集成而已。除了AddressSanitizer还有很多其他的compiler flags,undefined-trap就是其中的一种。undefined-trap的功能也非常强大,它可以检测出程序中的不明确行为,如数据溢出等。

下面我们以undefined-trap举例,看看怎么用其他的compiler flags:

在Build Settings中的Custom Compiler Flags下为other C Flags添加-fsanitize=undefined-trap -fsanitize-undefined-trap-on-error

完成undefined-trap的设置之后,当程序的数据发生溢出行为时,系统就会抛出异常。


End
经过ARC的洗礼之后,普通的访问释放对象产生的EXC_BAD_ACCESS已经大量减少了,现在出现的EXC_BAD_ACCESS有很大一部分来自malloc的对象或者越界访问。简单的敌人已经被干掉,剩下的都是难缠的对手了。还好Apple给我们升级了装备,以后遇到EXC_BAD_ACCESS应该不用那么心惊胆战了吧?

Reference
Xcode7中你一定要知道的炸裂调试神技
在Xcode 7上直接使用Address Sanitizer
Clang 3.8 documentation
  • 大小: 17.5 KB
  • 大小: 42.7 KB
  • 大小: 74 KB
  • 大小: 92.6 KB
  • 大小: 33.8 KB
  • 大小: 66.1 KB
来自: 小笨狼
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Xcode7新特性AddressSanitizer

    无意中在微博里看到了@没故事的卓同学的文章Xcode7中你一定要知道的炸裂调试神技,介绍Xcode7中新增了AddressSanitizer工具可以捕获EXC_BAD_ACCESS。然而Xcode中不是已经有了Zombie了么?怎么又出来了一个Address ...

  • Xcode特性Address Sanitizer,对比僵尸对象

    无意中在微博里看到了@没故事的卓同学的文章Xcode7中你一定要知道的炸裂调试神技,介绍Xcode7中新增了AddressSanitizer工具可以捕获EXC_BAD_ACCESS。然而Xcode中不是已经有了Zombie了么?怎么又出来了一个Address ...

  • 在Xcode 7上直接使用Address Sanitizer

    在WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xcode 7上使用Clang的地址消毒剂(Address Sanitizer)了。这篇文章中我们将详细讨论下这个功能,比如它是怎样工作的,以及使用的方法。这是...

  • iOS开发之Xcode常用调试技巧总结,NSLog,LLDB, Breakpoint,EXC_BAD_ACCESS,Address Sanitizer

    一、Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log。而在OC语言中,打Log是采用NSLog方法。但是NSLog效率低下,具体原因可以看这篇博客(《NSLog效率低下的原因及尝试...

  • (转)在Xcode 7上直接使用Clang Address Sanitizer

    WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xcode 7上使用Clang的地址消毒剂(Address Sanitizer)了。这篇文章中我们将详细讨论下这个功能,比如它是怎样工作的,以及使用的方法。这是...

  • 在Xcode 7上直接使用Clang Address Sanitizer

    在WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xcode 7上使用Clang的地址消毒剂(Address Sanitizer)了。这篇文章中我们将详细讨论下这个功能,比如它是怎样工作的,以及使用的方法。这是...

  • Xcode7新特性

    Xcode7新特性Xcode7.0随着IOS9的到来,苹果更新了对应的开发工具Xcode,在新的Xcode7中,新的开发工具已经扩大到支持watchOS2平台以及IOS9,IS X EC Capitan,借助于许多新的特性使得我们开发者开发应用,测试,调试...

  • Sanitizers 系列之 address sanitizer 用法篇

    非法的内存访问是最最常见的一种内存错误,本文介绍用于检测这类错误的 Sanitizer:AddressSanitizer(简称 asan)。由于 asan 涉及的内容较多,将内容分为上下两篇来进行介绍:上篇: 介绍 asan 的用法、工程实践,并...

  • Clang Address Sanitizer

    在Xcode 7上直接使用Clang Address Sanitizer 2015-07-30 10:08 编辑: suiling 分类:iOS开发 来源:Mike Ash 1 13332 Xcode 7 招聘信息: Web后端高级开发工程师iOS软件工程师java...

  • Xcode7新功能

    重要:这只是开发中API或技术的一...本文档的新版本可能用来作为未来API或技术的beta版。 Xcode是一个完整的开发工具,用于在苹果手表,ipad,iPhone和Mac创建应用程序。Xcode开发工具包涵分析工具、模拟器以及watchO

  • iOS 11系列 - Xcode 9新特性

    Xcode 9最近刚刚发布,带来了一系列不错的新特性,可以更好的帮助到开发者完成开发工作。 Xcode Runtime Tool Xcode 9中有许多Runtime Tool可以帮助开发者找到代码错误,包括如下: Main Thread ...

  • Xcode And iOS9新特性

    1. Xcode7 新特性 > 可直接在真机上运行自己的应用,只需要有苹果账号,无需购买苹果开发者账号。 > 可设置在出现 EXC_BAD_ACCESS 错误时,显示更详细的错误信息。 设置方式:XCode->Product->...

  • iOS开发之Xcode常用调试(Debug)技巧总结

    一、Xcode调试技巧之:NSLog上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log。而在OC语言中,打Log是采用NSLog方法。但是NSLog效率低下,具体原因可以看这篇博客(NSLog效率低下的原因及尝试lldb...

  • Xcode 8 的 Debug 新特性

    这些在 Xcode 7 里都是没有体现出来的, 总之通过这些标记, 能够让我们更加清晰的了解到这些约束的意义, 而不只是一根实线而已 blur rendering 这是说在新的 debug 模式下,我们能够看到 blur 层了. 是不是很美好...

  • Xcode 调试方法总结

    1、Xcode调试方法汇总----https://www.jianshu.com/p/98a776e54bbe     编写代码过程中出现错误、异常是不可避免的。通常我们都需要进行大量的调试去寻找、解决问题。这时,熟练掌握调试技巧将很大程度上的提高...

  • Xcode 8 的 Debug 新特性 —- WWDC 2016 Session 410 & 412 学习笔记

    这些在 Xcode 7 里都是没有体现出来的, 总之通过这些标记, 能够让我们更加清晰的了解到这些约束的意义, 而不只是一根实线而已   blur rendering   这是说在新的 debug 模式下,我们能够看到 blur 层了. ...

  • asp代码ASP家教信息管理系统(源代码+论文)

    asp代码ASP家教信息管理系统(源代码+论文)本资源系百度网盘分享地址

  • 基于ssm高校毕业选题管理系统.zip

    基于ssm高校毕业选题管理系统.zip

  • 基于旷视研究院领先的深度学习算法,提供满足多业务场景的预训练模型.zip

    人工智能毕业设计&课程设计

  • tensorflow_model_optimization-0.1.3.dev0-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics