阅读更多

0顶
0踩

操作系统

转载新闻 Xcode7 新特性 AddressSanitizer

2017-01-17 16:21 by 副主编 jihong10102006 评论(0) 有8621人浏览
昨天发现微博的圈子里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 层了. ...

  • 三菱FX3G FX3S与四台E700变频器Modbus RTU通讯控制:正反转、频率设定与读取方案,三菱FX3G FX3S与四台E700变频器通讯:Modbus RTU协议实现正反转、频率设定与控制

    三菱FX3G FX3S与四台E700变频器Modbus RTU通讯控制:正反转、频率设定与读取方案,三菱FX3G FX3S与四台E700变频器通讯:Modbus RTU协议实现正反转、频率设定与控制,快速反馈与教程包含,三菱FX3G FX3S 485协议通讯四台三菱E700变频器程序资料 三菱FX3G FX3S+485bd扩展,采用modbus rtu协议,crc校验,通讯控制四台E700变频器,可以实现正反转,停止,频率的设定,频率,电流等的读取。 反馈快,使用方便,包括教程,plc和触摸屏程序,变频器参数设置和接线,别的变频器支持rtu协议也可以实现。 ,三菱FX系列PLC; 485协议通讯; 变频器E700; 通讯控制; 参数设置; 教程。,三菱PLC控制E700变频器:485协议通讯与程序设置全解

  • hyphen-nl-0.20050617-10.el7.x64-86.rpm.tar.gz

    1、文件内容:hyphen-nl-0.20050617-10.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/hyphen-nl-0.20050617-10.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

  • 西门子S7-1200PLC结构化编程在5轴伺服项目中的应用:模块化设计、触摸屏控制及电气图纸实战解析,西门子S7-1200PLC结构化编程实现多轴联动与多种伺服功能应用:CAD图纸、PLC程序和触摸屏

    西门子S7-1200PLC结构化编程在5轴伺服项目中的应用:模块化设计、触摸屏控制及电气图纸实战解析,西门子S7-1200PLC结构化编程实现多轴联动与多种伺服功能应用:CAD图纸、PLC程序和触摸屏程序协同运作。,西门子S7-1200PLC结构化编程5轴伺服项目 ,包含plc程序、威纶通触摸屏程序、cad电气图纸。 可以实现以下功能,规格有: 1.三轴机械手X轴-Y轴-Z轴联动取放料PTO脉冲定位控制台达B2伺服 2.台达伺服速度模式应用+扭矩模式应用实现收放卷 3.程序为结构化编程,每一功能为模块化设计,功能:自动_手动_单步_暂停后原位置继续运行_轴断电保持_报警功能_气缸运行及报警. 4.每个功能块可以无数次重复调用,可以建成库,用时调出即可 5.上位机采样威纶通触摸屏 6.参考本案例熟悉掌握结构化编程技巧,扩展逻辑思维。 博图14以上都可以打开 ,核心关键词:西门子S7-1200PLC; 结构化编程; 5轴伺服项目; PLC程序; 威纶通触摸屏程序; CAD电气图纸; 三轴机械手; PTO脉冲定位控制; 台达B2伺服; 速度模式应用; 扭矩模式应用; 模块化设计; 轴断电保

  • 情感分析算法的关键应用领域与典型实战案例

    情感分析算法在多个领域有着广泛的应用场景和丰富的案例

Global site tag (gtag.js) - Google Analytics