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

Ric*_*Ric 1 iphone gdb watchpoint ios 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对象?

Nik*_*nov 5

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

这是DebugString.h文件:

#import <Foundation/Foundation.h>

@interface DebugString : NSString

@end
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

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

  • @ric:我扩展了这个答案来展示你如何把这两个方法放到一个类中,我称之为DebugString.现在,无论您认为哪个NSString存在问题,请将其声明从NSString*更改为DebugString*.它将完全相同,除了所有保留和释放也将通过这两种方法,您可以在它们上设置断点并查看调用堆栈以查看谁调用它.希望这可以帮助.尼基塔希望你不介意我编辑你的答案. (2认同)