2017-07-30 55 views
5

我有一個碰撞報告(它已經symbolicated至少我希望如此,因爲我在Xcode主辦單位獲得此日誌)的XCode崩潰報告(已經Symbolicated)缺少行號

Incident Identifier: F4324555-0916-4E32-82EF-3272917367BB 
Beta Identifier:  80811904-A512-48A1-9593-D386703A62F0 
Hardware Model:  iPhone7,2 
Process:    SelfieSuperStarz [596] 
Path:    /private/var/containers/Bundle/Application/BFA0D82B-274B-400B-8F84-52A1D7369C51/SelfieSuperStarz.app/SelfieSuperStarz 
Identifier:   com.PuckerUp.PuckerUp 
Version:    21 (1.31) 
Beta:    YES 
Code Type:   ARM-64 (Native) 
Role:    Foreground 
Parent Process:  launchd [1] 
Coalition:   com.PuckerUp.PuckerUp [434] 


Date/Time:   2017-07-29 20:06:11.7394 -0400 
Launch Time:   2017-07-29 19:34:39.7433 -0400 
OS Version:   iPhone OS 10.3.2 (14F89) 
Report Version:  104 

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Exception Note: EXC_CORPSE_NOTIFY 
Triggered by Thread: 0 

Last Exception Backtrace: 
0 CoreFoundation     0x18bebafe0 __exceptionPreprocess + 124 (NSException.m:165) 
1 libobjc.A.dylib     0x18a91c538 objc_exception_throw + 56 (objc-exception.mm:521) 
2 CoreFoundation     0x18be26eb4 -[__NSArray0 objectAtIndex:] + 108 (CFArray.c:69) 
3 SelfieSuperStarz    0x10007b708 specialized _ArrayBuffer._getElementSlowPath(Int) -> AnyObject + 116 
4 SelfieSuperStarz    0x10007ea40 specialized Merger.merge(completion :() ->(), assets : [Asset]) ->() + 1444 (Merger.swift:0) 
5 SelfieSuperStarz    0x100071f3c specialized AssetView.finish(UIButton) ->() + 520 (Merger.swift:0) 
6 SelfieSuperStarz    0x1000712d0 @objc AssetView.finish(UIButton) ->() + 40 (AssetView.swift:0) 
7 UIKit       0x192021010 -[UIApplication sendAction:to:from:forEvent:] + 96 (UIApplication.m:4580) 
8 UIKit       0x192020f90 -[UIControl sendAction:to:forEvent:] + 80 (UIControl.m:609) 
9 UIKit       0x19200b504 -[UIControl _sendActionsForEvents:withEvent:] + 440 (UIControl.m:694) 
10 UIKit       0x192020874 -[UIControl touchesEnded:withEvent:] + 576 (UIControl.m:446) 
11 UIKit       0x192020390 -[UIWindow _sendTouchesForEvent:] + 2480 (UIWindow.m:2122) 
12 UIKit       0x19201b728 -[UIWindow sendEvent:] + 3192 (UIWindow.m:2292) 
13 UIKit       0x191fec33c -[UIApplication sendEvent:] + 340 (UIApplication.m:10778) 
14 UIKit       0x1927e6014 __dispatchPreprocessedEventFromEventQueue + 2400 (UIEventDispatcher.m:1448) 
15 UIKit       0x1927e0770 __handleEventQueue + 4268 (UIEventDispatcher.m:1671) 
16 UIKit       0x1927e0b9c __handleHIDEventFetcherDrain + 148 (UIEventDispatcher.m:1706) 
17 CoreFoundation     0x18be6942c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 (CFRunLoop.c:1943) 
18 CoreFoundation     0x18be68d9c __CFRunLoopDoSources0 + 540 (CFRunLoop.c:1989) 
19 CoreFoundation     0x18be669a8 __CFRunLoopRun + 744 (CFRunLoop.c:2821) 
20 CoreFoundation     0x18bd96da4 CFRunLoopRunSpecific + 424 (CFRunLoop.c:3113) 
21 GraphicsServices    0x18d800074 GSEventRunModal + 100 (GSEvent.c:2245) 
22 UIKit       0x192051058 UIApplicationMain + 208 (UIApplication.m:4089) 
23 SelfieSuperStarz    0x10002e990 main + 56 (AppDelegate.swift:16) 
24 libdyld.dylib     0x18ada559c start + 4 

正如你可以看到它在我的班級合併中,在第0行說道。這是不可能的,正如你可以假設的那樣。我不知道如何解釋什麼專業手段或爲什麼@objc在那裏。

3 SelfieSuperStarz    0x10007b708 specialized _ArrayBuffer._getElementSlowPath(Int) -> AnyObject + 116 
4 SelfieSuperStarz    0x10007ea40 specialized Merger.merge(completion :() ->(), assets : [Asset]) ->() + 1444 (Merger.swift:0) 
5 SelfieSuperStarz    0x100071f3c specialized AssetView.finish(UIButton) ->() + 520 (Merger.swift:0) 
6 SelfieSuperStarz    0x1000712d0 @objc AssetView.finish(UIButton) ->() + 40 (AssetView.swift:0) 

只是不知道在那裏發生了誤差,作爲行說合並:0,我不知道這些頭(專業/ objc)的意思是,如果他們告訴我任何事情。

這是我在合併中的合併功能。我使用各種循環和計算不透明度並確定事物,但我在位置檢查零。

func merge(completion:@escaping() -> Void, assets:[Asset]) { 

    self.setupAI() 

    let assets = assets.sorted(by: { $0.layer.zPosition < $1.layer.zPosition }) 
    if let firstAsset = controller.firstAsset { 

     let mixComposition = AVMutableComposition() 

     let firstTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, 
                    preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 

     do { 
      try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, self.controller.realDuration), 
              of: firstAsset.tracks(withMediaType: AVMediaTypeVideo)[0], 
              at: kCMTimeZero) 
     } catch _ { 
      print("Failed to load first track") 
     } 

     let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 

     var myTracks:[AVMutableCompositionTrack] = [] 
     var ranges:[ClosedRange<CMTime>] = [] 

     for asset in assets { 

      let secondTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, 
                      preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) 
      secondTrack.preferredTransform = asset.asset.preferredTransform 
      do { 
       try secondTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, asset.endTime-asset.beginTime), 
               of: asset.asset.tracks(withMediaType: AVMediaTypeVideo)[0], 
               at: CMTime(seconds: CMTimeGetSeconds(asset.beginTime), preferredTimescale: 600000)) 
      } catch _ { 
       print("Failed to load second track") 
      } 
      if(ranges.count == 0) { 
       ranges.append(asset.beginTime...asset.endTime) 
      } 
      else { 
       var none = true 
       for range in ranges { 
        let start = range.contains(asset.beginTime) 
        let end = range.contains(asset.endTime) 
        var connection = false 
        var nothing = false 

        //This range is completely encompassed (begin and end inside) 
        if(start && end) { 
         //Don't add to the rnge 
         none = false 
         nothing = true 
        } 

        //Begin is in range (right side) 
        else if(start && !end) { 
         connection = true 
         none = false 
        } 

        //End is in range (left side) 
        else if(!start && end) { 
         connection = true 
         none = false 
        } 

        var connected = false 
        //It connects 2 different timess 
        if(connection) { 
         for range2 in ranges { 
          if(range != range2) { 
           if(start && range2.contains(asset.endTime)) { 
            let index = ranges.index(of: range) 
            if(index != nil) { 
             ranges.remove(at: index!) 
             ranges.append(range.lowerBound...range2.upperBound) 
             connected = true 
             break 
            } 
           } 
           else if(end && range2.contains(asset.beginTime)) { 
            let index = ranges.index(of: range) 
            if(index != nil) { 
             ranges.remove(at: index!) 
             ranges.append(range.lowerBound...range2.upperBound) 
             connected = true 
             break 
            } 
           } 
          } 
         } 
        } 
        if(!connected && !none && !nothing) { 
         if(start) { 
          let index = ranges.index(of: range) 
          if(index != nil) { 
           ranges.remove(at: index!) 
           ranges.append(range.lowerBound...asset.endTime) 
          } 
         } 
         else if(end) { 
          let index = ranges.index(of: range) 
          if(index != nil) { 
           ranges.remove(at: index!) 
           ranges.append(asset.beginTime...asset.endTime) 
          } 
         } 
        } 
       } 
       if(none) { 
        ranges.append(asset.beginTime...asset.endTime) 
       } 
      } 
      myTracks.append(secondTrack) 
     } 

     for range in ranges { 
      print(CMTimeGetSeconds(range.lowerBound), CMTimeGetSeconds(range.upperBound)) 
     } 
     for assets in self.controller.assets { 
      print(CMTimeGetSeconds(assets.beginTime), CMTimeGetSeconds(assets.endTime)) 
     } 

     if let loadedAudioAsset = self.controller.audioAsset { 
      let audioTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: 0) 
      do { 
       try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, self.controller.realDuration), 
               of: loadedAudioAsset.tracks(withMediaType: AVMediaTypeAudio)[0] , 
               at: kCMTimeZero) 
      } catch _ { 
       print("Failed to load Audio track") 
      } 
     } 

     let mainInstruction = AVMutableVideoCompositionInstruction() 
     mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, self.controller.realDuration) 

     // 2.2 
     let firstInstruction = self.videoCompositionInstructionForTrack(firstTrack, firstAsset) 
     var instructions:[AVMutableVideoCompositionLayerInstruction] = [] 
     var counter:Int = 0 
     for tracks in myTracks { 
      let secondInstruction = self.videoCompositionInstructionForTrack(tracks, assets[counter].asset, type:true) 
      let index = myTracks.index(of: tracks) 

      //This should never be nil, but if it is, it might cause opacity's to go out of whack for that specific track. Only reason I can think of why I am crashing in this method. 
      if(index != nil) { 
       if(index! < assets.count-1) { 
        for i in (counter+1...assets.count-1) { 
         if(assets[counter].endTime > assets[i].endTime) { 
          secondInstruction.setOpacity(1.0, at: assets[i].endTime) 
          secondInstruction.setOpacity(0.0, at: assets[counter].endTime) 
          print("Bigger") 
          break 
         } 
        } 
       } 
       if(index! > 0) { 
        for i in (0...counter).reversed() { 
         if(assets[counter].endTime < assets[i].endTime) { 
          secondInstruction.setOpacity(0.0, at: assets[counter].endTime) 
          print("Smaller") 
          break 
         } 
        } 
       } 
       if(counter < myTracks.count-1) { 
        if(assets[counter].layer.zPosition <= assets[counter+1].layer.zPosition) { 
         secondInstruction.setOpacity(0.0, at: assets[counter+1].beginTime) 
        } 
        else { 
         secondInstruction.setOpacity(0.0, at: assets[counter].endTime) 
        } 
       } 
       instructions.append(secondInstruction) 
       counter += 1 
      } 
     } 

     for range in ranges { 
      firstInstruction.setOpacity(0.0, at: range.lowerBound) 
      firstInstruction.setOpacity(1.0, at: range.upperBound) 
     } 

     // 2.3 
     mainInstruction.layerInstructions = [firstInstruction] + instructions 

     let imageLayer = CALayer() 
     let image = UIImage(named: "Watermark") 
     imageLayer.contents = image!.cgImage 

     let ratio = (firstAsset.tracks(withMediaType: AVMediaTypeVideo)[0].naturalSize.width/image!.size.width)/2 
     let rect = CGRect(x: image!.size.width*ratio, y: 0, width: image!.size.width*ratio, height: image!.size.height*ratio) 
     imageLayer.frame = rect 
     imageLayer.backgroundColor = UIColor.clear.cgColor 
     imageLayer.opacity = 0.75 

     let videoLayer = CALayer() 
     videoLayer.frame = CGRect(x: 0, y: 0, width: firstAsset.tracks(withMediaType: AVMediaTypeVideo)[0].naturalSize.width, height: firstAsset.tracks(withMediaType: AVMediaTypeVideo)[0].naturalSize.height) 

     let parentlayer = CALayer() 
     parentlayer.frame = CGRect(x: 0, y: 0, width: image!.size.width*ratio, height: image!.size.height*ratio) 
     parentlayer.addSublayer(videoLayer) 
     parentlayer.addSublayer(imageLayer) 

     let mainComposition = AVMutableVideoComposition() 
     mainComposition.instructions = [mainInstruction] 
     mainComposition.frameDuration = CMTimeMake(1, 30) 
     mainComposition.renderSize = self.controller.firstAsset!.tracks(withMediaType: AVMediaTypeVideo)[0].naturalSize 
     mainComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, in: parentlayer) 
+0

您嘗試訪問某個索引處的資產是否有一組資產?或者你試圖訪問哪個對象的任何其他數組不存在? – adev

+0

我添加了這個類的代碼,與這種情況有關 – impression7vx

+0

你的代碼中的很多地方都有這個'[0]'。在執行之前,您應該檢查count是否大於零,如果count爲零,則記錄錯誤。這應該是造成這次事故的原因。 – adev

回答

1

很明顯,「Merger.merge」方法訪問一個不存在的元素。調試器會告訴你它在哪裏。

我猜想有些線程正在修改背後的某個數組,使得在某個點有效的索引變得無效。而當你修改「範圍」時,「範圍2的範圍」正在尋求麻煩。

+0

我從測試人員那裏得到了XCodes Organizer的崩潰報告,我無法重現該問題。所以,雖然斷點測試會有所幫助,但我無法重現該問題。這就是爲什麼我使用來自Apple和XCode Organizer的崩潰日誌中的崩潰報告。如果你注意到,我刪除1個範圍,並總是添加另一個範圍。我這樣做,就像說:(1-10),但現在我想(1-15),所以我刪除(1-10)並追加(1-15)。 – impression7vx

1

我猜測問題是由第129行引起的,考慮到+1444偏移量和數組訪問。您是否嘗試過沒有音頻的視頻,例如未經音頻許可拍攝的視頻?我通過假設在我的應用程序中拍攝的視頻始終有音軌,從而遇到了一次出界崩潰。用戶會爲您的應用輸入哪些視頻而感到驚訝。我甚至有一個用戶使用他們的手機專輯中選擇的flv視頻崩潰了我的應用。

(我不確定這是否適用於Swift) 也可以使用調試器在Xcode中找到該行。首先,您使用與發佈版本相同的優化設置來運行該應用程序。然後在函數中分解不同的行來檢查彙編代碼。 How to see assembly code in xcode 6。您可能需要滾動到頂部以仔細檢查函數名稱和偏移量的含義。

_ArrayBuffer._getElementSlowPath是私有API中的一個類,由下劃線前綴指示。你可能找不到任何可信和/或官方的消息來源。

崩潰日誌中的不完整可能是由Swift(它背後的工具)的錯誤/不成熟造成的。歡迎來到其中一個最趨勢和誇張的語言。即使在工作條件下,Swift也會爲生成的代碼提供第0行,其代碼與源代碼的任何有意義的部分都不相對應。這不是你的情況。

+0

調試的問題是我似乎無法重現錯誤;只有一個測試人員。使這個過程非常複雜 – impression7vx

+0

另外請注意,我所拉的音頻文件不是來自他們的音頻,而是來自我們的視頻。這也是一個有保證的視頻。我們使用已經在應用中的預設視頻並從那裏開始。 – impression7vx

+0

您刪除了其他線程的所有堆棧跟蹤。多線程問題仍然是開放的。假設它不是多線程問題,無法重現問題,意味着您還沒有找到關鍵步驟。視頻可以沒有音軌。我不確定預設是什麼。您是否努力嘗試爲意外的視頻提供應用程序? – keithyip