`

如何排查EXC_BAD_ACCESS错误(Debugger使用GDB时适用)

阅读更多

刚开始学obj-c,遇到这个问题,网上搜了下,说的都有点短(本人愚钝,理解能力弱~~)。搞定后发上来,记录、共享。。

我的xcode是4.2的

操作如下:

1、增加NSZombieEnabled和MallocStackLogging环境变量:菜单Product--》Edit Scheme...,在弹出的窗口上方选择自己的项目及模拟器,左侧选择"Run ***.app"(***是你的项目名称),右侧选择Arguments选项卡,在Environment Variables中增加Name: NSZombieEnabled--》Value:YES、Name: MallocStackLogging--》Value:YES,并点击2个环境变量左侧的复选框,保证在启用状态。

2、debug自己的项目,出现EXC_BAD_ACCESS错误的时候,在控制台会出现类似下面的log

 

 写道
fbft(1431) malloc: recording malloc stacks to disk using standard recorder
fbft(1431) malloc: process 1249 no longer exists, stack logs deleted from /tmp/stack-logs.1249.fbft.bBsBO7.index
fbft(1431) malloc: stack logs being written into /tmp/stack-logs.1431.fbft.Fz32vw.index
2012-01-18 11:38:55.118 fbft[1431:ef03] *** -[_UIResizableImage release]: message sent to deallocated instance 0x7245470

 从最后一行可以看出是调用了已经被dealloc的对象。(UIResizableImage应该是已经release的对象类型)

3、在控制台的(gdb)后面输入shell malloc_history 1431 0x7245470(其中1431和0x7245470是上面log中的pid和address),并回车。得到如下信息

 

 写道
......

ALLOC 0x7245470-0x72454af [size=64]: thread_b024f000 |thread_start | _pthread_start | _ZN2KBL14BackgroundLoadEPv | KB::DynamicDictionaryImpl::background_load_address_book(KB::StaticDictionary const&) | KB::fill_with_matchable_strings_from_address_book(KB::Hashmap<KB::String, bool>&) | ABAddressBookCreate | ABCCreateAddressBookWithDatabaseDirectory | ABCCreateAddressBookWithDatabaseDirectoryAndForceInProcessMigrationInProcessLinkingAndResetSortKeys | ABCDBContextCreateWithPathAndAddressBook | CPSqliteDatabaseRegisterFunction | CPSqliteDatabaseConnectionForWriting | _connectAndCheckVersion | _createConnectionForWriting | CPSqliteConnectionPerformSQL | CPSqliteConnectionStatementForSQLAndIgnoreErrors | CPSqlitePreparedStatement | sqlite3_prepare_v2 | sqlite3LockAndPrepare | sqlite3Prepare | sqlite3RunParser | sqlite3Parser | yy_reduce | sqlite3Pragma | sqlite3Init | sqlite3InitOne | sqlite3_exec | sqlite3InitCallback | sqlite3LockAndPrepare | sqlite3Prepare | sqlite3RunParser | sqlite3Parser | yy_reduce | sqlite3ExprAlloc | sqlite3DbMallocRaw | sqlite3MemMalloc | malloc_zone_malloc
----
FREE 0x7245470-0x72454af [size=64]: thread_b024f000 |thread_start | _pthread_start | _ZN2KBL14BackgroundLoadEPv | KB::DynamicDictionaryImpl::background_load_address_book(KB::StaticDictionary const&) | KB::fill_with_matchable_strings_from_address_book(KB::Hashmap<KB::String, bool>&) | ABAddressBookCreate | ABCCreateAddressBookWithDatabaseDirectory | ABCCreateAddressBookWithDatabaseDirectoryAndForceInProcessMigrationInProcessLinkingAndResetSortKeys | ABCDBContextCreateWithPathAndAddressBook | CPSqliteDatabaseRegisterFunction | CPSqliteDatabaseConnectionForWriting | _connectAndCheckVersion | _createConnectionForWriting | CPSqliteConnectionPerformSQL | CPSqliteConnectionStatementForSQLAndIgnoreErrors | CPSqlitePreparedStatement | sqlite3_prepare_v2 | sqlite3LockAndPrepare | sqlite3Prepare | sqlite3RunParser | sqlite3Parser | yy_reduce | sqlite3Pragma | sqlite3Init | sqlite3InitOne | sqlite3_exec | sqlite3InitCallback | sqlite3LockAndPrepare | sqlite3Prepare | sqlite3RunParser | sqlite3Parser | yy_reduce | sqlite3ExprDelete | sqlite3ExprDelete | sqlite3ExprDelete | sqlite3ExprDelete | sqlite3ExprDelete | sqlite3ExprListDelete | sqlite3ExprDelete | sqlite3DbFree | sqlite3MemFree | malloc_zone_free

ALLOC 0x7245470-0x7245493 [size=36]: thread_ad12a2c0 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] | -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] | -[FbftAppDelegate application:didFinishLaunchingWithOptions:] | -[UIWindow makeKeyAndVisible] | -[UIWindow _orderFrontWithoutMakingKey] | -[UIWindow _setHidden:forced:] | -[UIWindow addRootViewControllerViewIfPossible] | -[UIViewController view] | -[TestViewController viewDidLoad] | -[UIImage(UIImageDeprecated) stretchableImageWithLeftCapWidth:topCapHeight:] | -[UIImage(UIImagePrivate) _stretchableImageWithCapInsets:] | -[UIImage resizableImageWithCapInsets:] | _objc_rootAlloc | +[NSObject allocWithZone:] | _objc_rootAllocWithZone | class_createInstance | calloc | malloc_zone_calloc

Binary Images:
0x1000 - 0x3ffb +fbft (??? - ???) <92BCD2F3-83ED-36DD-A56A-37022E0229E0> /Users/fangjiawang/Library/Application Support/iPhone Simulator/5.0/Applications/8ED06429-A51E-4D6C-9ACC-C9A6E269C80A/fbft.app/fbft
0x7000 - 0x612fff +UIKit (1600.0.0 - comp
.......

 从上面标红的log中可以大概知道是哪里的代码出了问题,TestViewController类中的stretchableImageWithLeftCapWidth:topCapHeight方法中引入了已经release对象

 

PS-疑问:配置的两个环境变量,对发布出来的应用有影响吗?有答案的留下言~ 谢谢~~

分享到:
评论

相关推荐

    查找EXC_BAD_ACCESS的错误代码处

    为了有效地解决问题并提高应用的稳定性,开发者需要掌握一种有效的调试技巧——使用Xcode内置的Instrument工具来定位和修复`EXC_BAD_ACCESS`错误。 #### 二、Instrument工具简介 Instrument是Xcode集成开发环境中...

    查找 EXC_BAD_ACCESS 问题根源的方法

    当出现 EXC_BAD_ACCESS 错误时,可以在终端中使用 `malloc_history` 命令来查看相关对象的内存分配历史记录。 - **命令格式**:`malloc_history ${App_PID} ${Object_instance_addr}` - **示例**:根据之前的...

    ios EXC_BAD_ACCESS错误调试

    当程序尝试访问一个已经释放的对象时,系统就会抛出EXC_BAD_ACCESS错误,这在C语言中通常被理解为使用了野指针。由于内存访问错误可能会导致应用程序崩溃,因此快速准确地定位这类问题是每个iOS开发者必须掌握的技能...

    关于出现僵尸信号SIGBAT或者EXC_BAD_ACCESS的解决方案

    标题中的“僵尸信号SIGABRT或EXC_BAD_ACCESS”是iOS开发中常见的错误类型,主要与内存管理和对象生命周期有关。这两个错误通常出现在Objective-C或Swift编程中,涉及到内存泄漏、过早释放对象或者试图访问已经释放的...

    iOS内存错误EXC_BAD_ACCESS的解决方法

    首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作。举一个简单的例子来说明吧,首先看一段Java代码: 代码如下:public class Test{ public static void ...

    db2exc_975_WIN_x86.exe

    db2exc_975_WIN 数据库安装包,官网下载,亲测可用。 IBM DB2 是一套关系型数据库管理系统,DB2 Express - C

    db2exc_970_LNX_x86_64.tar.z01

    db2exc_970_LNX_x86_64.tar.gz Linux 64位系统 的db2 安装包。(第一部分)

    db2exc_970_LNX_x86_64.tar.zip

    db2exc_970_LNX_x86_64.tar.gz Linux 64位系统 的db2 安装包。(第二部分) 另一部分:https://download.csdn.net/download/qq_37570669/11260296

    Python使用sys.exc_info()方法获取异常信息

    使用 sys 模块中的 exc_info 方法; 使用 traceback 模块中的相关函数。 本节首先介绍如何使用 sys 模块中的 exc_info() 方法获得更多的异常信息。 有关 sys 模块更详细的介绍,可阅读《Python sys模块》。 模块 ...

    code_file_exc_电磁波_

    这个"code_file_exc_电磁波_"的压缩包文件很可能包含了一系列用于进行电磁波时域有限元分析的代码,帮助我们理解和模拟电磁波的行为,确保波形的准确性和不失真性。 时域有限元方法(Finite Element Method, FEM)...

    inh-exc_neuron_oscillation_

    标题“inh-exc_neuron_oscillation_”暗示了我们正在探讨神经网络中抑制性与兴奋性神经元之间的交互,特别是关于它们如何引发振荡的现象。描述中的“excitatory neuron connection”进一步指出了兴奋性神经元间的...

    Data_Extract_src.zip_Excel数据提取_VB_VB提取excel数据_extract exc_提取exce

    标题 "Data_Extract_src.zip_Excel数据提取_VB_VB提取excel数据_extract exc_提取excel" 描述了一个使用VB.NET编程语言编写的程序,该程序能够自动从Excel文件中提取数据。这个项目可能是一个实用工具,帮助用户快速...

    DB2_V9.7在linux上安装教程

    1、tar -xzvf db2exc_nlpack_970_LNX_x86.tar.gz 得到文件夹nlpack 2、tar -xzvf v9.7_linuxia32_server.tar.gz 得到文件夹server 二、 语言包整合 cp -r nlpack/* ./server/ 三、 安装 1、cd server 2、sudo ./...

    将ADO数据转换到EXCEL的代码.rar_ado EXC_ado excel_excel ado

    在程序结束时,应正确处理可能出现的错误,并释放所有使用的对象以防止内存泄漏: ``` On Error Resume Next If Not objRecordset Is Nothing Then objRecordset.Close If Not objCommand Is Nothing Then Set ...

    cad2excel.rar_ excel cad_AutoCAD VBA_Cad2Exc_VBa_cad-excel

    CAD to Excel VBA程序 AutoCAD中的二次开发程序

    calculate.rar_Excel VBA_VBA calculate_calculate exc_工程量汇总vba_工程量

    excel做的传统工程量计算表(加入vba后能自动计算、汇总、标注说明) 1、序号根据填入的分部分项名称自动填出1~N的数值。 2、代码栏根据填入的数据自动给出同一分部分项名称序号,为汇总提供方便。...

    ios-GPUImageFiltersCamera.zip

    出现EXC_BAD_ACCESS。 需要修改Product-&gt;Scheme-&gt;Edit Scheme-&gt;Options-&gt;GPU Frame Capture 选择 Disabled。 功能介绍 模仿Filckr的照相功能实现了: 1.实时滤镜 2.相机基本功能:拍照,对焦,前后...

    CK_EXC_UnityGraphicBeginner

    本教程“CK_EXC_UnityGraphicBeginner”将引导你入门Unity中的图形编程,让你逐步掌握在Unity中创建、操纵和优化图形的技术。 一、Unity基础 Unity的工作界面由多个面板组成,包括项目面板、资产面板、层次面板、...

Global site tag (gtag.js) - Google Analytics