(转发自  http://lizi464789754.blog.163.com/blog/static/168937085201191844225888/

第一种方法:在程序 crash 之后,在控制台输入 bt,就可以显示 crash 堆栈:

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x33a06464 in objc_msgSend ()
#1  0x3139de2e in -[UIImageView setImage:] ()
#2  0x00009ecc in -[RoundMenuView touchesEnded:withEvent:] (self=0x29e140, _cmd=0x316b1a7b, touches=0x2e1050, event=0x2424f0) at /Users/wangjun/workspace/iphone/Classes/RoundMenuView.m:130//出错地方
#3  0x313b1354 in -[UIWindow _sendTouchesForEvent:] ()
#4  0x313b0cce in -[UIWindow sendEvent:] ()

     。。。。。。。。。。。。。(中间省略)

kill
quit

第二种方法:

1:为工程运行时加入 NSZombieEnabled 环境变量,并设为启用。如下图:

xcode 调试 EXC_BAD_ACCESS - 丽子 - 舆孒瑎佬

xcode 调试 EXC_BAD_ACCESS - 丽子 - 舆孒瑎佬

2;再次运行后程序crash,如图:

xcode 调试 EXC_BAD_ACCESS - 丽子 - 舆孒瑎佬

这次可以看到问题是”message sent to dealloced object”了,但具体是哪个语句引起的还并不知道,于是需要在gdb上输入以下语句:

shell malloc_history pid address

那么pid和address是什么呢?再看下crash的图片结合一下我以下使用的命令,你应该很快就可以判定pid和address是从哪里来的了,我的命令是:

shell malloc_history 596 0×5f3ef80

再次运行,程序crash时会出现大量的stack trace信息,如下图是与本程序相关的:

XCode调试技巧之EXC_BAD_ACCESS中BUG解决

根据这些信息大家就可以找到问题出现在[BadAccessViewController viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.