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

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <UIKit/UIKit.h>
#import "Dependency.h"

@protocol WorldDataSource
@optional
- (NSString*)worldName;
@required
- (BOOL)allowsToLive;
@end

@property (nonatomic, readonly) NSString *title;
- (IBAction) show;
@end

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

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

[代码]c#/cpp/oc代码:

1
message sent to deallocated instance 0x6d564f0

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

在新的XCode里,调试器默认使用LLDB,我就讲一下如何在LLDB状态下定位到由于内存操作不当引起的Crash
首先我有一段会发生崩溃的代码:
[代码]c#/cpp/oc代码:

1
2
3
4
5
NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];
if(themePath)
self.backgroundIV.image = [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:@"mask_1.png"]];

[themePath release];

[] [title] [url] [link text]
1
2
3
4
5
6
7

NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];
if(themePath)
self.backgroundIV.image = [UIImage imageWithContentsOfFile:[themePath stringByAppendingPathComponent:@"mask_1.png"]];

[themePath release];

学过内存管理的人都应该知道在这里themePath并没有被retain,所以如果写了release,那么必然会发生崩溃情况。首先我们需要对开发的环境变量进行设置

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

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

现在,我们得到了两个主要的信息:
进程ID:50127
崩溃地址:0x6d564f0
我们打开终端,输入以下命令:
[代码]c#/cpp/oc代码:

sudo malloc_history 50127 0x6d564f0

结果显示为:

这样我们用能定位到这行代码
[代码]c#/cpp/oc代码:

1
NSString *themePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:themePathTmp];

对themePath进行排查,就找到了崩溃的罪魁祸首
[代码]c#/cpp/oc代码:

1
2
System.out.println("hello hexo!");
[themePath release];
文章目录
  1. 1. 如何在LLDB下排查message sent to deallocated instance问题