2012-06-11 29 views
4

我正在使用testflight來測試我的應用,並且發生崩潰時纔會在應用專爲ad-hoc構建並通過測試飛行分發時發生。有關崩潰報告的細節是:僅在未調試時iOS應用崩潰

Date/Time:  2012-06-11 09:00:34.638 +0800 
OS Version:  iPhone OS 5.1.1 (9B206) 
Report Version: 104 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x00000009 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib     0x34e74f78 objc_msgSend + 16 
1 appName       0x0002963e __24-[XYPieChart reloadData]_block_invoke_0168 (XYPieChart.m:321) 
2 libdispatch.dylib    0x30295c52 _dispatch_call_block_and_release + 6 
3 libdispatch.dylib    0x302a0e8a _dispatch_main_queue_callback_4CF$VARIANT$up + 190 
4 CoreFoundation     0x371482a6 __CFRunLoopRun + 1262 
5 CoreFoundation     0x370cb49e CFRunLoopRunSpecific + 294 
6 CoreFoundation     0x370cb366 CFRunLoopRunInMode + 98 
7 GraphicsServices    0x3388a432 GSEventRunModal + 130 
8 UIKit       0x30e77cce UIApplicationMain + 1074 
9 appName       0x00003b20 main (main.m:14) 
10 appName       0x00003ad8 0x1000 + 10968 

和被引用的代碼 - (XYPieChart.m:321)

[CATransaction begin]; 
    [CATransaction setAnimationDuration:_animationSpeed]; 

    [_pieView setUserInteractionEnabled:NO]; 

    __block NSMutableArray *layersToRemove = nil; 
    [CATransaction setCompletionBlock:^{ 

     if (layersToRemove) { 
      [layersToRemove enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
       if (obj) 
        [obj removeFromSuperlayer]; 
      }]; 

      [layersToRemove removeAllObjects]; 
     } 

     for(SliceLayer *layer in _pieView.layer.sublayers) 
     { 
      [layer setZPosition:kDefaultSliceZOrder]; 
     } 

     [_pieView setUserInteractionEnabled:YES]; 
    }]; 

    BOOL isOnStart = ([slicelayers count] == 0 && sliceCount); 
    NSInteger diff = sliceCount - [slicelayers count]; 
    layersToRemove = [NSMutableArray arrayWithArray:slicelayers]; 

    BOOL isOnEnd = ([slicelayers count] && (sliceCount == 0 || sum <= 0)); 
    if(isOnEnd) 
    { 
     for(SliceLayer *layer in _pieView.layer.sublayers){ 
      [self updateLabelForLayer:layer value:0]; 
      [layer createArcAnimationForKey:@"startAngle" 
            fromValue:[NSNumber numberWithDouble:_startPieAngle] 
            toValue:[NSNumber numberWithDouble:_startPieAngle] 
            Delegate:self]; 
      [layer createArcAnimationForKey:@"endAngle" 
            fromValue:[NSNumber numberWithDouble:_startPieAngle] 
            toValue:[NSNumber numberWithDouble:_startPieAngle] 
            Delegate:self]; 
     } 
     [CATransaction commit]; 
     return; 
    } 

我將能夠跟蹤問題,如果我能複製它,當調試,但它似乎只是爲ad-hoc構建時纔會發生。謝謝!

編輯: 使用模擬器,我已經找到了問題的EXC_BAD_ACCESS在該行

[layersToRemove enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
+1

使用配置文件它應該啓用調試元素,並應該崩潰,因爲配置的構建就像它是爲了發佈一樣。 – Pochi

+0

當我將xcode中的方案設置爲ad-hoc時,我可以重現。但我似乎無法用它來測試樂器。 – danielbeard

+0

臨時證書不允許捕獲(即調試器嘗試執行的操作)以防止現場發生惡意軟件。您需要使用您的開發人員證書來構建它並進行試用。 – borrrden

回答

5

我最終解決了這個問題。在我的編譯器設置中,不管怎樣,ARC沒有爲Ad-Hoc構建啓用,導致奇怪的行爲。在我完成之前,分配__block變量是可行的,因爲在非ARC環境中,__block變量不會自動保留。

更改編譯器設置,以便所有構建都使用ARC,並且所有內容都已修復。

+0

有同樣的問題。謝謝你張貼這個。多麼愚蠢的錯誤;當然這也讓我有成千上萬的沮喪顧客感嘆。 – DanM

+1

令人驚歎!這對我也很有幫助。這裏有一個相關的問題,解釋如何解決這個問題: http://stackoverflow.com/questions/7778356/how-to-enable-disable-automatic-reference-counting – shim

8

更改您的Xcode方案,讓您可以測試和調試發佈版本,它使用相同的編譯器優化作爲您的Ad Hoc構建。調試一個調試版本不會。

+3

能否詳細說明一下?如何在發佈版本上啓用調試? – Keith

+0

這是一個很棒的提示。我提交的應用程序崩潰了,並且很難確定何時以及爲什麼需要每次構建adhoc並通過iTunes進行安裝,並且無法真正看到它崩潰的位置。但是,這使我立即糾正並幫助馬上找到問題。不要忘記在之後重新設置。 – badweasel

+0

@Keith嗨,你有沒有找到一種方法來啓用發佈版本的調試? – jerem

7

我有一個類似的問題,並嘗試更改項目構建設置,但它不適用於我。通過更改發行版的編譯器優化級別設置最終解決了我的問題:

在Build Settings中,轉至LLVM編譯器4.2 - 代碼生成部分,查找Optimization Level選項,並將Release設置從Fastest,Smallest [ -Os]爲無[-O0]。

希望這會有所幫助!

+0

如果你想保持優化水平,你也可以將調試優化級別更改爲該版本的設置,然後通過這種方式找到您的錯誤。 – Sean

0

在我的情況下,它是「啓用殭屍對象」設置,防止在調試模式下崩潰。沒有這個設置的Debuggin使得應用程序也在調試器中崩潰,從而很容易找到罪魁禍首。

所以我建議禁用「診斷」菜單中的所有設置,並將優化設置爲-Os並在發佈前進行最終測試。或者像hotpaw2指出的那樣,建立在發佈模式下。但由於證書設置的問題,這對我無效。