Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error detector. It consists of a compiler instrumentation module and a run-time library. The tool can detect the following types of bugs: Out-of-bounds accesses…
原文地址: http://www.cocoachina.com/ios/20150730/12830.html WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xcode 7上使用Clang的地址消毒剂(Address Sanitizer)了.这篇文章中我们将详细讨论下这个功能,比如它是怎样工作的,以及使用的方法.这是Konstantin Gonikman提议的话题. C语言中一种异常危险的情况 从很多方面来看,C语言都是一种伟大的编程语言.事实上,发明至今已逾…
一.Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log.而在OC语言中,打Log是采用NSLog方法.但是NSLog效率低下,具体原因可以看这篇博客(NSLog效率低下的原因及尝试lldb断点打印Log).所以在平时的开发过程中,能不打Log就不打Log.实在想打Log网上也有对NSLog的一些优化方法,可以阅读王巍的<宏定义的黑魔法 - 宏菜鸟起飞手册>如下代码便出自其中: #define NSLog(format, ...) do {…
NSLog,po命令和普通断点调试相信每个iOS开发者都会,这里就不作介绍了. 一.Memory Graph Xcode8新增:Memory Graph解决闭包引用循环问题 有很多叹号说明就有问题了.看内存中object的名字,有一条是Closure captures leaked.展开后点击就可以看到这个issue对应的内存图形展示在中间的面板中.当然了,我们更多的时候是在debug页面下查看: 所以,这里面引用循环了.点击紫色的叹号会出现Xcode分析出来的内存引用图形: 有了这个图就很容易…
尽管在ARC中,野指针出现的频率已经大大降低了,但是仍然会有野指针困扰着我们. 在模拟器调试中,我们可以开启scribble或者zombieObject来将已经释放的内存填充无意义的内容,能够将一些非必现的野指针变成必现.但是,这只能在模拟器中,但是给测试的包并不能这么做.测试是非常需要这个功能的. 为了给测试支持上这个功能,那么我们不得不自己来实现这个功能. 我首先介绍下我用到的库,来自于Facebook的fishhook 下载地址https://github.com/facebook/fis…
原因: exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后.再去通过该对象去调用其它的方法就会出现野指针错误. 解决办法: 首先得定位到哪里出现的这样野指针引用错误,如果是大型的项目代码量一大,找起来是非常痛苦的. iOS提供了一个环境变量设置来帮忙定位错误位置的信息描述:NSZombieEnabled ,就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被…
Address Sanitizer ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了AddressSanitizer,MemorySanitizer,ThreadSanitizer 和 LeakSanitizer等工具.这些工具可以检测用户空间的内存问题.通过在编译时加入指定的选项,就可以给用户程序加入 Address Sanitizer 功能. 其中Address Sanitizer(AS…
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最常见的方式是打个Log,在一些工程中处处可见NSLog.还有就是打断点的Debug方式等.诸如此类,下面就自己在开发过程中常用的Xcode调试技巧简单的做个总结. 一.Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log.而在OC语言中,打Log是…
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别…
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别…
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别…
@ 前记: 最近查一个线上项目的crash,review代码无果,crash几率低,不可在本地环境重现.之后在线上好几个服务器跑valgrind就不crash了.个人猜测可能是跑valgrind后性能下降的比较严重,导致crash那个点触发不到了. gcc从4.8开始支持address sanitizer,也比较好用,文章最后会简单分析下用法. 另我的环境是ubuntu13.04+gcc4.7.3,目标是升级到4.9.0. @ 编译gcc4.9.0 $wget ftp://mirrors.ker…
一.什么是空指针和野指针 1.空指针 1> 没有存储不论什么内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针.在没有被详细初始化之前.其值为0. 以下两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是很危急的. 回到顶部 二.野指针和空指针样例 接下来用一个简单的样例对照一下野指针和…
最近项目开发中,临时被调去修复一个页面返回时crash的问题.出现这个问题的原因也很巧合,正好服务地址在同事电脑上,也正巧网络请求响应时间狂慢!一个请求发出去回来的时间是40秒左右,要是在线上,肯定会让用户抓狂死! 当我打开项目的时候,点击页面返回时,发现网络请求依然在请求中,第一感觉就是内存管理上出错.在全局断点中定位到出问题的点上,竟然是delegate回调的地方出现了问题! if (self.delegate && [self.delegate respondsToSelector:…
一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 复制代码 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空…
总结 全局断点 →-->+-->Add Exception Breakpoint 开启僵尸监听 打开Edit scheme -->Diagnostics-->Enable Zombie Object retain 不仅仅会对计数器 + 1,而且还会返回当前对象 标号 标题 内容 一 内存管理 内存管理的重要性/内存管理概念/堆和栈/内存管理原则/多对象内存管理/set方法内存管理/dealloc方法的内存管理 二 引用计数器 引用计数概念器/作用/操作 三 dealloc deal…
1. 故障描述 故障操作步骤: 单板上插了一个U盘,出问题前正在通过FTP往单板上拷贝文件,拷贝的过程中单板自动重启. 故障现象: Entering kdb (current=0xc000000594069e38, pid 4) on processor 0 Oops: <NULL> due to oops @ 0xffffffffc08d3d84 [0]more> [0]kdb> 2. 信息采集 [0]kdb> bt Stack traceback for pid 4 0x…
写出本文仅仅是处于备忘的目的. 最近为现在做的软件添加了一个内存回收机制(以前处于某种内存只申请不释放,这并不等于内存泄露,因为我们知道这些内存块在内存中的位置)-- 在某一块内存不使用的时候将其释放掉,以防止内存缓慢增长. 由于以前没有释放内存,所以就不存在野指针的问题.于是乎肯定坑爹的事情就从内存释放开始了 ... /大哭 只从添加了内存释放机制之后软件就出现了各种崩溃 ... 好了,闲话少说,直奔主题. 一个内存块很多地方引用,一旦一个地方释放内存,而且其他地方还在引用,那后果就 ...…
定位野指针除了使用Malloc Scribble(内存涂鸦)外,还可以使用僵尸对象.所谓的僵尸对象,就是将被释放的对象标记为僵尸,系统不会回收这些对象的内存,并让这些内存无法被重用,因而也就不会被覆写. 在启用“僵尸对象”后,在调试期间,如果对象被释放了,会被转化为“僵尸对象”.如果再向对象发送消息,则对应的“僵尸对象”会收到这个消息,并抛出异常.异常信息中会明确描述被释放的对象,以及接收的是哪个消息. 要开启僵尸对象,可以勾选“Edit scheme” -> "Diagnotics&qu…
本文转载自:http://blog.csdn.net/xwdok/article/details/576497 "野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用."野指针"的成因主要有两种:(1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的…
[1]源码 工作中,时常会遇到各种各样的异常场景,有些异常场景很常见,必要备录,以防再犯. 分享本案例为:QT创建窗体时parent父窗体传野指针引起异常. 本案例源码如下: 1.1 默认新建一个QT工程(ps:本地QT版本为5.3) (1)工程目录结构 (2)工程pro文件 QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = CustomComboBox TEMPLATE = app SOURCES +=…
1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一…
今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自动释放池中,或者没有free 对象,导致这块内存一直被占用,换一种方法说,就是没有指针指向这块内存,再通俗点,开辟了一段空间,在没有被释放之前,结果找不到这块内存了,这样就会造成内存泄漏的问题.这块内存会直至程序运行结束才会被释放. 野指针:是指针指向已经delete 的对象,或者是未申请访问的受限…
1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数.反过来说,任何对象或者函数的地址都不可能是空指针.(比如这里的(void*)0就是一个空指针.把它理解为null pointer还是null pointer constant会有微秒的不同,当然也不是紧要了).其实空指针只是一种编程概念,就…
空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确定.野指针的危害程度远远大于空指针.因为当一个指针所指向的对象为空时,如果扔向该对象发送消息时,程序就会崩溃.所以一点要在完全释放对象后将指针复制为nil.一面出现野指针的问题.但是空指针是可以被发送消息的 nil.Nil.NULL.NSNull一直了解,但是一直忘,所以今天总结下.我的理解中他们重…
转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象(Enable NSZombie Objects)进击的码农 Console(lldb 命令) Profile(instruments) Xcode视图调试结语 前言 最近博主临近毕…
转自:http://www.cnblogs.com/viviwind/archive/2012/08/14/2638810.html 先看一个例子: struct student{ char* name; int score;}stu, *pstu; int main(void){ strcpy(stu.name, "Jimy"); stu.score =99; return0;} 这是很多人都容易犯的错误:定义了结构体变量stu,但结构体内部的char * name在定义结构体时只是…
视图调试 使用视图调试器检查您的视图层次结构,可以轻松地判断视图位置.大小以及实现问题. 在XCode中运行你的应用程序,在调试栏上点击“调试视图层次”按钮,进入视图调试器. XCode停止你的应用程序,在调试导航栏中显示视图层次,并在主编辑器中显示一个交互式三维模型. 选择显示的窗口,在主编辑器中点击任何位置,按下鼠标键进行拖拽.视图会分解成三维层次,方便您查看视图层的等级划分和视图之间的关系. 左侧的滑动按钮允许你去调节视图间距,使得您能更方便地观察单个视图对象.右侧的滑动按钮允许你使用“从…
//野指针与空指针的区别 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //野指针是指存在一个指针变量,但是这个指针变量指向的内存空间已经被释放,这时候指针的值还是不为空 //再次调用free()函数就会报错:空指针是值为NULL的指针变量 void main(){ int *p = (int *)malloc(sizeof(int)); *p = ; ////不规范写法 //if (p!=…
写本文的是因为UE4 官方文档虽然也有,但主要讲的是是用UE4Editor把游戏打成一个IPA包的形式发布的方法 而对于想通过Xcode分析UE4的渲染流程来学习或优化的朋友,那官方文档的资料还是不够的,这里是总结一下在Mac上用Xcode对UE4 ios app做Analyze的教程. 要在Xcode里调试或分析,直接下载编辑器是不行的,首先还是要有UE4的源代码,从官方或民间下载都可以,一般是1个UnrealEngine包,2个Required包,先解压UnrealEngine,再把Requ…