XCODE调试技巧收集

【Xcode使用技巧】Xcode调试方法 这里记录一下自己学习到的一些XCode调试的方法。这些调试方法可以让我们使用XCode编写代码进行调试时用起来更顺心应手。XCode的调试方法包括运行时设置断点,打印到控制台,手写命令打印等。 阅读详情

前记:编写代码过程中,出现错误、异常是不可避免的,这个时候,就体现了调试的重要性,下面就总结一下,平常我自己使用的一些调试技巧,以及汇总网络上其他网友使用的技巧。(ps以后有新的调试技巧,我也会一并更新)

1、使用僵尸变量(NSZombieEnabled)

 2、重写object的respondsToSelector方法

在iphone开发的时候EXC_BAD_ACCESS这个bug时不容易找到原因的。

首先说一下EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作,或者操作一个在循环代码中被修改的序列中的对象。虽然使用NSZombieEnabled变量可以帮助你找到问题所在,但有的时候,即使通过设置NSZombieEnabled变量,还是不能定位到问题所在,这个时候,你可以试试重写object的respondsToSelector方法,显示出现EXEC_BAD_ACCESS前访问的最后一个object,下面是具体的步骤:
a、在每个类并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。的实现文件(.m,.mm)文件中,添加如下代码:
[cpp] 
-(BOOL) respondsToSelector : (SEL)aSelector { 
    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]); 
    return [super respondsToSelector:aSelector]; 
} 

b、并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。

3、让XCode反馈足够多的信息

在Edit–>Scheme里面 找到Arguments ,在Environment Variables这里添加
把下面2个值设置成YES
NSAutoreleaseFreedObjectCheckEnabled
NSDebugEnabled
这种方法非常好用,建议在建立一个工程的时候,加入此设置

4、设置全局异常断点

在程序抛出异常时候,往往需要定位到异常
键入快捷键 cmd + 6 进入断点窗口,点击左下角的"+"按钮,选择弹出框的“Add Exception BreakPoint”项,如下图所示:

然后使用默认设置,点击"done"按钮,设置全局异常断点就完成了



其他

使用xcode调试僵尸对象

  
在写obj-c代码的时候,僵尸对象是比较麻烦的问题.僵尸对象是指,提前释放内存的对象.对于iphone/mac程序来说,出现这个问题的原因一般有2个,第一,程序员自己过早释放内存,第二,使用了外部框架导致的.第一点很容易查出来,第二点来说,主要是因为外部框架一般会使用autorelease,如果对框架怎么运行不清楚的话,提前手动释放内存,就会使自动释放内存的时候出错.
举例来说:
 NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

  NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];

[data release];

  [pool release];
由于NSData的dataWithBytes是类方法,并且会设置autorelease,所以在pool释放内存的时候,data已经是僵尸对象.

解决方法来说一般也是2个,第一个所有对象都使用autorelease方式,但是这种方式的问题在于performance不怎么好,而且也不利于程序员水平的提高.第二个就是找到僵尸对象,查看其调用关系,理顺内存释放顺序.那么找到僵尸对象就成为了急需解决的问题.

苹果有个头文件,叫NSDebug.h,具体在 这里. 很久以前就是靠引入这个头文件来解决问题.当然随着obj-c2.0的引入,我们可以不再用这么古老的方式.新的做法如下:

1 在xode里右击可执行文件,选择getinfo-->arguments-->Variables to beset in the ENV

2 添加以下变量
  NSDebugEnabled

  NSZombieEnabled

  MallocStackLogging

  MallocStackLoggingNoCompact

?设置他们的值为YES.



3 在debug模式下运行程序,到pool release的时候,会在console上看到:

2010-12-25 08:01:38.644 autoreleasebug[3939] *** *** Selector 'release'

  sent to dealloced instance 0xa4e10 of class NSConcreteData.

这就说明有僵尸对象出现,给了进程id--3939,对象内存地址--0xa4e10.



4 接下来在console里敲shell malloc_history pid(3939) address(0xa4e10).得到调用关系如下:



Call [2] [arg=24]: thread_a000a1ec |0x0 | _dyld_start | _start | main | NSApplicationMain

 | -[NSApplication run] | -[NSApplication sendEvent:] | -[NSWindow sendEvent:]

 | -[NSControl mouseDown:] | -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:]

 | -[NSCell trackMouse:inRect:ofView:untilMouseUp:] | -[NSCell _sendActionFrom:]

 | -[NSControl sendAction:to:] | -[NSApplication sendAction:to:from:] | -[MEController 

newCity:] | -[MECityEditor editCity:otherCities:] | -[NSApplication runModalForWindow:]

 | -[NSApplication _realDoModalLoop:peek:] | -[NSApplication nextEventMatchingMask:

untilDate:inMode:dequeue:] | _DPSNextEvent | BlockUntilNextEventMatchingListInMode

 | ReceiveNextEventCommon | RunCurrentEventLoopInMode | CFRunLoopRunSpecific

 | __CFRunLoopRun | __CFRunLoopDoObservers | _handleWindowNeedsDisplay | -[NSWindow 

displayIfNeeded] | -[NSView displayIfNeeded] | -[NSView _displayRectIgnoringOpacity:

isVisibleRect:rectIsVisibleRectForView:] | -[NSThemeFrame 

_recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:

topView:] | -[NSFrameView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:

rectIsVisibleRectForView:topView:] | -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:

isVisibleRect:rectIsVisibleRectForView:topView:] | -[NSView

_recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]

 | -[NSView(NSInternal) _getDirtyRects:clippedToRect:count:boundingBox:] | -[NSRegion 

mutableCopy] | NSAllocateObject | _internal_class_createInstanceFromZone | malloc_zone_ca

lloc



根据这个调用关系,我们就可以哪个对象被提前释放了,从而修改程序.


深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样? 本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。 阅读详情

相关推荐

全志 mipi屏幕和触摸驱动调试记录

mipi屏幕与触摸调试记录

u011996684的博客 3217

XCode常用的替换符

%@ NSString实例 %d,%D,%i 整数 %u,%U 无符号整数 %x 将无符号整数以十六进制小写字母显示 %X 将无符号整数以十六进制大写字母显示 %f 小数 %c 字符 %s C语言字符串 %% 显示%字符本身

houchangxi的专栏 1217

USB摄像头开发实战:从参数配置到图像采集的完整流程(Python+OpenCV)

本文详细介绍了USB摄像头开发的完整流程,从参数配置到图像采集,使用Python和OpenCV实现。内容涵盖硬件原理、环境配置、参数调优及高级优化技巧,帮助开发者解决常见问题如分辨率设置、帧率控制和灯光频闪等,提升开发效率。

star的博客 235

iOSLearningDiaryXcode调试技巧_3

引言: 程序调试技巧在开发过程中起着举足轻重的地位,熟练的使用可以加快我们捕捉问题的速度. 毕竟BUG这个词是我们程序员一直要伴随的字眼,最关键的,人不是计算机,总有那么一点点小细节容易在我们慎密的思绪中偷偷溜走,从而导致一个BUG的出现.那么本文就是为了介绍关于在开发iOS程序时有哪些好用的技巧辅助我们迅速的找到错误. 参考资料: 1:Xcode的控制台调试命令

tyforfreedom的专栏 299

三菱 FX5U PLC 4轴程序 控制松下伺服3个, 步进电机一个

三菱 FX5U PLC 4轴程序。 控制松下伺服3个, 步进电机一个, 四轴自动堆垛码垛设备程序, 回原点动作用专用的原点回归指令写的, 手动运行用三菱相对定位指令写的 , 自动运行用绝对定位指令写的取料运行, 表格定位写的自动放料运行, 设备各种报警异常都有写出 程序每一步都有注释。 包括PLC程序、显控触摸屏 程序、松下伺服驱动器接线图。 程序内都有IO注释 编号:4816635519484681汇美0808 ...

m0_68069172的博客 3381

一步一步搭建S32K14x的AutoSar项目----S32DS 代码工程的搭建

一步一步搭建S32K14X的AutoSar项目----S32DS代码工程的搭建

wo580231的博客 3487

聪明 iOS 开发者的 Xcode 技巧

聪明 iOS 开发者的 Xcode 技巧

qq_33777090的博客 618

【GameFramework框架内置模块】15、场景(Scene)

场景(Scene)模块,提供场景管理的功能,负责场景的加载、卸载、切换和管理。可以方便地管理不同场景之间的切换以及不同场景之间的信息传递。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1882

iOS崩溃调试的使用和技巧总结

在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题。简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的。 现在网上有很多关于解析崩溃信息的博客,但是大多质量参差不齐,或者有些细节没有注意到。今天写一篇博客总结一下我对崩溃调试的使用和技巧,如果有哪些错误或遗漏,还请指点,谢谢! 获取崩溃信息 在iOS中获

Junyan_Jaya的博客 474

【Davinci开发】:MPU(内存保护)

【Davinci开发】:MPU(内存保护)

2205

S32K1XX Autosar开发实战|全网独家复现EB MCAL Port/Dio配置、详解引脚分层原理、实现经典跑马灯助力车载IO电控落地

在NXP S32K1XX系列车规MCU的AUTOSAR标准开发体系中,MCAL(微控制器抽象层)是软硬件解耦的核心载体,而Port端口模块与Dio数字IO模块是MCAL最基础、最核心的入门模块,也是车载指示灯、按键检测、继电器驱动、外设硬件启停控制的底层支撑。区别于传统裸机直接操作寄存器的开发方式,AUTOSAR架构采用分层隔离设计,Port负责硬件静态初始化、Dio负责动态电平操控,严格遵循车规级开发规范,杜绝硬件资源冲突、引脚配置混乱等问题。

getusushu的博客 42

Xcode调试技巧总结

前言 本来觉得调试是一件很简单的事情,但是看了很多介绍调试方法的文章,发现有些技巧并不知道,有必要对常用的Xcode调试技巧做一个总结,提高工作效率。 一、调试面板 上方:断点开关、继续执行、单步执行、单步步入、单步步过等命令; 左边:watch窗口,负责变量信息显示,如果想查看寄存器的内容,可以将左下角的Auto切换为All 右边:日志窗口,接受和显示程序日志,左下角可以选择All/Debugger/Target output 二、断点 1- 普通断点 找到下断点的代码行,可以通过下面3种

box_kun的博客 9278

位置点位到达判断FC(Easy+Codesys+博途平台)

IN rActPositon REAL 轴当前实际位置 1IN arAbsPosition REAL[10] 各工作点位坐标 2IN rDeadZone REAL 位置达到判断域值 范围 3OUT abInAbsPos BOOL[10] 到达各绝对定位点位标志 位置到达输出 4VAR i INT 循环计数 5VAR rErr REAL 位置偏差 6。

RXXW_Dor的博客 531

iOS开发调试和问题解决策略

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33675507的博客 150

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Xcode 调试技巧

Xcode 调试技巧

Han的小站 542

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

一、Xcode 调试技巧之:NSLog2、Xcode调试技巧之:LLDB三、Xcode调试技巧之:断点调试(breakpoint)3.1 Breakpoint(断点)调试(1) Name 和 Condition(2) Ignore(3) action6.Sound参考资料。

yunfeihope的博客 8496

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Xcode 调试方法总结

前言:编写代码过程中出现错误、异常是不可避免的。通常我们都需要进行大量的调试去寻找、解决问题。这时,熟练掌握调试技巧将很大程度上的提高工作效率。接下来就说说开发过程中Xcode的调试方法。

jamalping的专栏 1万+

5个Xcode开发调试技巧

4个非常实用的Xcode开发调试技巧:1.Enable NSZombie Objects(开启僵尸对象)2.对于所有异常添加Global BreakPoint(全局断点)3.Static Analyzer(静态分析)4.Condational Breakpoints(条件断点)

kingzwt2009的专栏 7072

learnuv调试技巧:如何使用Xcode和Ninja高效调试libuv应用程序

learnuv是一个帮助开发者学习libuv库的自导式工作坊,libuv是为Node.js提供支持的核心库。本文将分享使用Xcode和Ninja工具调试libuv应用程序的实用技巧,帮助开发者更高效地解决开发过程中遇到的问题。 ### 为什么选择Xcode和Ninja进行调试? Xcode是macOS平台上强大的集成开发环境,提供了丰富的调试功能,如断点设置、变量监视和调用栈分析等。Ninja

gitblog_01139的博客 883

xcode调试 c语言 变量不可见,XCode调试技巧

本文从以前做的幻灯中整理而来的,主要讲一下XCode结合LLDB调试命令以及OBJC运行时的调试技巧。一、常用宏定义1、OPTIMIZE,Debug和Release判定Release编译时定义当我们想要某些代码只在Debug环境下才运行可以使用此宏定义判别2、i386与x86_64,模拟器环境判定模拟器编译时定义有时工程依赖的Lib库只编译了真机的代码,模拟器编译出错。为了可以模拟器调试,使用此宏...

weixin_32512381的博客 646

Xcode使用&调试技巧(debugging)

基于Xcode11.5版本 本文分为 使用技巧 面包屑导航 批量Rename 快速查看文档 代码折叠 调试技巧(debugging) 日志打印(log) 断点调试(Breakpoint) 条件断点(conditional BreakPoint) UI层级(UI Hierarchy) 内存层级(Memory Graph Hierarchy) .

原住民的自修室 1571

Xcode调试技巧之LLDB

开胃小菜--简单的断点调试 在xcode中打开一个app,在想要break的行号上单击,即可生成一个深色的箭头标识--断点。如下图,在viewDidLoad:中设置了断点。LLDB Debug教程" height="214" width="700" style=""> 运行app,等待。。。就可以看到xcode在断点处进入调试模式,现在让我们把视线移到xcode右下角的控制台,有木有看到(ll

hmxiao_1983的专栏 672

Xcode开发调试技巧

本文来自:http://blog.youkuaiyun.com/joywii/article/details/19641931 1.Enable NSZombie Objects(开启僵尸对象) Enable NSZombie Objects可能是整个Xcode开发环境中最有用的调试技巧。这个技巧非常非常容易追踪到重复释放的问题。该技巧会以非常简洁的方式打印指出重复释放的类和该类的内存地址。

有目标才会更充实 920

Xcode调试技巧

//转自:http://article.ityran.com/archives/1006 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了。(悲伤地音乐响起) 我们需要做的第一件事就是:不要惊慌。 修复崩溃不是很困难的。假如你崩溃了,并且胡乱的改些东西,而且还在不停的念着咒语希望bug神奇的自动消

Lovegarfield的专栏 2093
上一篇: ios6.0中,UIAlertView不能在子线程中执行了
下一篇: Xcode 精简版僵尸变量 处理EXC_BAD_ACCESS
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值