在设备上找不到过度释放的对象调试

时间:2011-08-09 01:56:27

标签: iphone ios gdb watchpoint xcode4.1

我有一个相当大的应用程序,它可以在模拟器中运行,但会在iPhone设备上创建一个过度释放的对象场景。 NSzombies似乎是要走的路,除了在模拟器上没有过度释放对象并且NSZombies在设备上不起作用。通过几小时的记录,我似乎能够在我运行之间将其固定到某个地方 -

[locManager startUpdatingLocation]和 -

的开头

(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

这解释了为什么它在模拟器上运行,我检测不到位置能力而且不运行该位置代码。

当我在[locManager startUpdatingLocation]之前和之后进行NSLog内联时,我的NSString对象被分配并存在。但是当应用程序执行并且它命中了locationManager时:NSLog显示NSString被释放,消失了。这个字符串对象与位置处理或功能完全无关。不相关的NSString。我已经注释掉了所有其他潜在的活动,并注释掉了所有显式发布代码,但却找不到它发生的那一刻。

我更沮丧的是lldb似乎不支持观察点并且gdb支持它们但是这个版本似乎不起作用! gdb将设置硬件观察点,然后Xcode表示它正在运行,但30分钟后仍然没有视觉活动或中断。

我在Lion,Xcode 4.1.1和太多咖啡。

我应该采用什么方法在如此狭窄的活动和有限工具中找到这个发布的NSString对象?

2 个答案:

答案 0 :(得分:5)

曾几何时我有一个复杂的案例来查找已发布的对象,所以我只是从这个对象继承到MyObject并以下列方式覆盖了retain和release:

这是DebugString.h文件:

#import <Foundation/Foundation.h>

@interface DebugString : NSString

@end

这是DebugString.m文件:

#import "DebugString.h"

@implementation DebugString

- (id) retain {
    NSLog(@"%i", [self retainCount]);
    return [super retain];
}

- (void) release {
    NSLog(@"%i", [self retainCount]);
    [super release];
}

@end

我在这个方法中加了一个断点,并在我预期崩溃的阶段打开它们。后来我开始逐个完成这个调用,发现了一个问题。这很复杂,但它可能会有所帮助,我从未在论坛中看到过这种方法。也许它也会帮助你。

答案 1 :(得分:0)

在模拟器中运行时手动调用位置“didUpdate” - 启动位置管理器后,至少两次调用超时约5秒。这应该触发与手机上相同的错误,然后你可以使用NSZombies。

此外,模拟器应该能够运行位置代码,我认为在4.2中已经破坏但4.1中没有。