运行(?)XCTestCase后崩溃.cxx_destruct

时间:2014-06-24 09:35:29

标签: ios objective-c core-data exc-bad-access xctest

我刚刚向一个库添加了一个新的TestCase,现在我的测试突然崩溃了一个奇怪的堆栈跟踪:

* thread #1: tid = 0x2e4275, 0x007a80b2 libobjc.A.dylib`objc_msgSend + 14, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x202989c2)


*   frame #0: 0x007a80b2 libobjc.A.dylib`objc_msgSend + 14
    frame #1: 0x05fc88ac CoreData`-[_CDSnapshot dealloc] + 92
    frame #2: 0x05fc6fed CoreData`-[_CDSnapshot release] + 77
    frame #3: 0x05fd1c34 CoreData`-[NSManagedObject(_NSInternalMethods) _clearRawPropertiesWithHint:] + 356
    frame #4: 0x05fd1a3b CoreData`-[NSFaultHandler turnObject:intoFaultWithContext:] + 411
    frame #5: 0x06006d1b CoreData`-[NSManagedObjectContext(_NSInternalAdditions) _disposeObjects:count:notifyParent:] + 395
    frame #6: 0x06006392 CoreData`-[NSManagedObjectContext(_NSInternalAdditions) _dispose:] + 578
    frame #7: 0x06005e5f CoreData`-[NSManagedObjectContext _dealloc__] + 319
    frame #8: 0x06005cf6 CoreData`-[NSManagedObjectContext dealloc] + 70
    frame #9: 0x05fc8ced CoreData`-[NSManagedObjectContext release] + 77
    frame #10: 0x007a8e97 libobjc.A.dylib`objc_release + 71
    frame #11: 0x007a8e3e libobjc.A.dylib`objc_storeStrong + 39
    frame #12: 0x02e7a58d MyLibTests`-[M2BCoreDataManager .cxx_destruct](self=0x0287c0d0, _cmd=0x007ae6b7) + 221 at M2BCoreDataManager.m:19
    frame #13: 0x007972d4 libobjc.A.dylib`object_cxxDestructFromClass(objc_object*, objc_class*) + 128
    frame #14: 0x0079724f libobjc.A.dylib`object_cxxDestruct + 20
    frame #15: 0x007a227a libobjc.A.dylib`objc_destructInstance + 48
    frame #16: 0x007a22ab libobjc.A.dylib`object_dispose + 20
    frame #17: 0x007a9692 libobjc.A.dylib`objc_object::sidetable_release(bool) + 268
    frame #18: 0x007a8e81 libobjc.A.dylib`objc_release + 49
    frame #19: 0x007a9ce7 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 537
    frame #20: 0x20103dbe XCTest`-[XCTestCase performTest:] + 178
    frame #21: 0x20104c48 XCTest`-[XCTest run] + 82
    frame #22: 0x201033e8 XCTest`-[XCTestSuite performTest:] + 139
    frame #23: 0x20104c48 XCTest`-[XCTest run] + 82
    frame #24: 0x201033e8 XCTest`-[XCTestSuite performTest:] + 139
    frame #25: 0x20104c48 XCTest`-[XCTest run] + 82
    frame #26: 0x201033e8 XCTest`-[XCTestSuite performTest:] + 139
    frame #27: 0x20104c48 XCTest`-[XCTest run] + 82
    frame #28: 0x201066ba XCTest`+[XCTestProbe runTests:] + 183
    frame #29: 0x007aa743 libobjc.A.dylib`+[NSObject performSelector:withObject:] + 70
    frame #30: 0x0000233e xctest`___lldb_unnamed_function9$$xctest + 195
    frame #31: 0x00002590 xctest`___lldb_unnamed_function11$$xctest + 246
    frame #32: 0x00002671 xctest`___lldb_unnamed_function12$$xctest + 52
    frame #33: 0x00002007 xctest`___lldb_unnamed_function2$$xctest + 45

与我的代码相关的唯一一行是第12帧。

M2BCoreDataManager是我在所有测试用例中用来设置CoreData堆栈的简单助手类的超类。

在进行更改之前,我有4个不同的类测试将JSON解析为我的CoreData模型对象。其中每个都创建了一个M2BCoreDataManager子类的实例,以使用库的CoreData模型文件和测试用例的特殊存储位置来设置CoreDataStack。

在崩溃发生之前我所做的就是为另一个模型类添加第5个测试用例,并复制(并稍微修改)其中一个测试用例。 我做了一件事:我删除了Derived Data文件夹,因为Xcode使用旧版本的CoreData模型进行测试,并将模型文件添加到测试目标。不确定这是否与它有关。

我认为崩溃与测试用例tearDown有关,因为我从新测试中得到测试失败,因此测试似乎已经运行,但它仍然崩溃。

崩溃听起来好像与过度发布有关,所以我尝试在库运行方案配置中启用NSZombie,但我不确定在运行测试时是否有效。至少它没有改变任何东西。我不知道还有什么可以尝试或问题的原因是什么。

我的每个与核心数据相关的测试案例都是这样的:

@interface GREmailJSONInitialization : XCTestCase

@property (strong) GRCoreDataModelTestsHelper *coreDataHelper;

@end

@implementation GREmailJSONInitialization

- (void)setUp
{
    self.coreDataHelper = [[GRCoreDataModelTestsHelper alloc] initWithTestStoreName:@"NoteInitializationTest"];

    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown
{
    // Put teardown code here. This method is called after the invocation of each test method in the class.

    NSError *cleanUpError = nil;
    BOOL cleanUp = [[NSFileManager defaultManager] removeItemAtURL:self.coreDataHelper.testStoreURL error:&cleanUpError];
    if (!cleanUp)
    {
        XCTFail(@"Could not clean up temporary store due to error: %@", cleanUpError);
    }
    self.coreDataHelper = nil;

    [super tearDown];
}

GRCoreDataModelTestHelper是M2BCoreDataManager的子类。它所做的就是指定一个模型URL和一个在设置CoreData堆栈时使用的商店URL。

我所做的就是在设置上创建GRCoreDataModelTestHelper并删除tearDown上的PersistentStore文件,同时通过将属性设置为nil来删除GRCoreDataModelTestHelper。我在那里设置了一个断点,self.coreDataHelper = nil;不会导致崩溃,它已成功执行。

任何想法可能是什么原因或指示还有什么可以追查问题?

编辑:所以问题本身就消失了,但我不知道发生了什么或者我改变了什么......

0 个答案:

没有答案