(转发自 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 环境变量,并设为启用。如下图:
2;再次运行后程序crash,如图:
这次可以看到问题是”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信息,如下图是与本程序相关的:
根据这些信息大家就可以找到问题出现在[BadAccessViewController viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.