您的位置:首页 > 移动开发 > IOS开发

如何在LLDB下排查message sent to deallocated instance问题

2015-09-28 16:34 751 查看

非常好的文章,转载自:http://www.devdiv.com/lldb_message_sent_to_deallocated_instance_-blog-50901-50856.html

在XCode的以前版本中,如果遇到了

1
message
sent to deallocated instance 0x6d564f0
我们可以使用info malloc-history 0x6d564f0来查看调用堆栈来查看崩溃发生的地方,这种方法这里不作阐述,大家自行百度。

在新的XCode里,调试器默认使用LLDB,我就讲一下如何在LLDB状态下定位到由于内存操作不当引起的Crash

首先我有一段会发生崩溃的代码:

1
NSString
*themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];
2
if
(themePath)
3
  
self.backgroundIV.image
= [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:
@"mask_1.png"
]];
4
  
 
5
[themePath
release];
学过内存管理的人都应该知道在这里themePath并没有被retain,所以如果写了release,那么必然会发生崩溃情况。首先我们需要对开发的环境变量进行设置



运行代码,出现下面的崩溃现象



下面我们打开“活动监视器”,找到我们对应的PID,我们的Target为HPThemeManager,只要找到HPThemeManager对应的PID就可以(HPThemeManager是在论坛里下载的,本来正在看代码,就直接拿他来作试验了)



现在,我们得到了两个主要的信息:

进程ID:50127

崩溃地址:0x6d564f0

我们打开终端,输入以下命令:

1
sudo
malloc_history 50127 0x6d564f0
结果显示为:



这样我们用能定位到这行代码

1
NSString
*themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];
对themePath进行排查,就找到了崩溃的罪魁祸首

1
[themePath
release];

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  调试 内存 代码 ios xcode