iOS TestFlight 设备上的 SIGSEGV 崩溃

5

我遇到了一个奇怪的崩溃问题,只有在TestFlight ad hoc分发时才会出现。我知道是什么导致了崩溃(一个简单的while循环,见下文),但我不明白为什么模拟器和iPhone或iPad(使用开发配置文件)上没有崩溃。

我一直在分发adhoc版本以跟踪崩溃,但最终放弃了。如何更高效地跟踪这个bug?

以下是TestFlight崩溃报告:

    Exception reason

SIGSEGV

Stacktrace

PRIMARY THREAD THREAD 0

0 Meernotes 0x0019649a testflight_backtrace + 158
1 Meernotes 0x001970c4 TFSignalHandler + 244
2 libsystem_c.dylib 0x32d9d7ec _sigtramp + 48
3 libobjc.A.dylib 0x37d34eac _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 224
4 libobjc.A.dylib 0x37d34eac _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 224
5 libobjc.A.dylib 0x37d34dc8 _objc_autoreleasePoolPop + 12
6 CoreFoundation 0x358e1cfe _CFAutoreleasePoolPop + 18
7 UIKit 0x333d5c92 _wrapRunLoopWithAutoreleasePoolHandler + 42
8 CoreFoundation 0x35965b1a __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
9 CoreFoundation 0x35963d56 __CFRunLoopDoObservers + 258
10 CoreFoundation 0x359640b0 __CFRunLoopRun + 760
11 CoreFoundation 0x358e74a4 CFRunLoopRunSpecific + 300
12 CoreFoundation 0x358e736c CFRunLoopRunInMode + 104
13 GraphicsServices 0x37583438 GSEventRunModal + 136
14 UIKit 0x333f3cd4 UIApplicationMain + 1080
15 Meernotes 0x000850da main (main.m:16)
16 Meernotes 0x0008508f start + 39

这里是触发它的代码(但在模拟器/ iPhone 上运行正常):

        while (textStillFits) {

        textToBeKeptBeforeCutting = textToBeKept;
        textToBeMovedBeforeCutting = textToBeMoved;

        rangeCutOffPosition = [settings determineFirstCutOffRangeOfString:textToBeMoved];
        textToBeKeptTemp = [textToBeMoved substringToIndex:rangeCutOffPosition.location];
        textToBeMovedTemp = [textToBeMoved substringFromIndex:rangeCutOffPosition.location];
        textToBeMoved = textToBeMovedTemp;
        textToBeKept = [NSString stringWithFormat:@"%@%@", textToBeKept, textToBeKeptTemp];
        NSUInteger l = [settings linesOfText:textToBeKept];
        if (l > maxLines) {
            textStillFits = NO;
            textToBeKept = textToBeKeptBeforeCutting;
            textToBeMoved = textToBeMovedBeforeCutting;
            // brakes here!
        }else {
            textStillFits = YES;
        }
    }

我查看了这个链接,但并没有帮助:ad hoc iphone sigsegv crash

提供更多背景信息,正如@ott提到的,NSNotFound可能会导致此问题:

    -(NSRange)determineFirstCutOffRangeOfString:(NSString *)s {

    NSRange rangeSpace = [s rangeOfString:@" " options:NSCaseInsensitiveSearch];
    NSRange rangeReturn = [s rangeOfString:@"\n" options:NSCaseInsensitiveSearch];
    if (rangeSpace.location == NSNotFound && rangeReturn.location == NSNotFound) {
        rangeSpace = NSMakeRange(1, 0); // don't take 0,0 as this will lead to endless loop
        rangeReturn = NSMakeRange(1, 0);
        NSLog(@"NEITHER SPACE NOR RETURN FOUND");
    }

    NSRange rangeCutOffPosition = NSMakeRange(0, 0);
    if (rangeSpace.location < rangeReturn.location) {
        // i.e. if the space char is the lowest char where you can cut off
        rangeCutOffPosition = NSMakeRange(rangeSpace.location+1,0); // +1, i.e. always cut off AFTER the space
    }  else {
        // i.e. if the return char is the lowest char where you can cut off
        rangeCutOffPosition = NSMakeRange(rangeReturn.location+1,0); // +1, i.e. always cut off AFTER the return
    }

    return rangeCutOffPosition;
}

1
rangeCutOffPosition 会变成 NotFound 吗?设备通常更加挑剔,而模拟器则只是忽略它。你能插入一些 NSLog() 来查看发生了什么,或者逐步执行它吗? - ott--
@ott 我总是初始化NSRange rangeCutOffPosition = NSMakeRange(0, 0),以便它不能是NSNotFound。但是,在此之前,我有一些方法来检查其他范围,这可能会返回NSNotFound。但这会成为一个问题吗? - n.evermind
@ott 我在上面提供了更多的代码上下文。感谢您的帮助! - n.evermind
这是使用ARC还是手动引用计数? - Isaac
1个回答

0

他们最新的SDK 1.2.4修复了这个问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接