iphone - 在设备上找不到过度发布的对象调试

标签 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。我已经注释了所有其他潜在的 Activity ,并注释了所有显式的发布代码,但找不到发生的那一刻。

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

我正在使用Lion,Xcode 4.1.1和过多的咖啡。

在如此狭窄的 Activity 范围和有限的工具中,我应该采取什么方法来找到已发布的NSString对象?

最佳答案

曾几何时,我有一个复杂的案例来查找已发布的对象,因此我只是从该对象继承到MyObject,并以以下方式覆盖了保留和释放:

这是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

我在这种方法中放置了一个断点,并在我预期崩溃的阶段将其打开。之后,我刚开始一个接一个地进行此 call ,发现了一个问题。它很复杂,但可能会有所帮助,而且我从未在论坛中看到过这种方法。也许它也会帮助您。

关于iphone - 在设备上找不到过度发布的对象调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990627/

相关文章:

ios - 如何在 Xcode 中为不同的目标设置单独的 LaunchScreen Storyboard

ios - iOS 7.1 支持应用程序的 Apple Health 功能

gdb - 如何在 gdb 上的 64 位机器上获取 8 字节指针值?

c++ - GDB(DDD),调试问题

c++ - eclipse Debug模式下的 GDB 找不到 stdlib/rand.c

iphone - 更新数据 UITableView

ios - 如果设备是 iPhone,则禁用某些 View Controller 中的方向

iPhone - 不同的数据存储方式,优缺点

iphone - 使用 NSCalendar——获取下个月的第一个星期二

ios - 为 MPMoviePlayer 添加播放支持