2012-09-05 4 views
5

TestFlight 특별 배포판에서만 발생하는 이상한 충돌이 있습니다. 나는 크래시를 일으키는 원인을 알고있다. (간단한 while 루프, 아래 참조), 시뮬레이터 나 iPhone 또는 iPad (개발 프로파일 포함)에서 크래시가 발생하지 않는 이유를 이해할 수 없다.iOS TestFlight Device에서 SIGSEGV 충돌이 발생했습니다.

저는 충돌을 추적하기 위해 끊임없이 임시 빌드를 배포하고 있지만 마침내 포기했습니다. 이 버그를보다 효과적으로 추적하려면 어떻게해야합니까?

다음은 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 

그리고 여기 트리거되는 코드이다 (그러나 시뮬레이터/아이폰에서 잘되는) :이 봐했다

 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()를 삽입하여 진행 상황을 확인하거나 단계별로 진행할 수 있습니까? –

+0

@ott 항상 NSRange를 초기화합니다. rangeCutOffPosition = NSMakeRange (0, 0); 그래서 NSNotFound가 될 수 없습니다. 그러나 일부 다른 범위를 확인하기 전에이 메서드를 몇 가지 있고 NSNotFound 반환 할 수 있습니다. 그러나 이것이 어떻게 문제가 될 수 있습니까? –

+0

@ott 위 코드 컨텍스트를 좀 더 제공했습니다. 당신의 도움을 주셔서 감사합니다! –

답변

0

최신 sdk 1.2.4이이 문제를 해결합니다!