2017-07-30 49 views
5

Mam zgłoszenie awarii (jest już symbolicated przynajmniej mam nadzieję, tak jak uzyskano ten dziennik z XCode Organizatora)XCode crash Report (Już Symbolicated) Brakujące numery wierszy

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 

Jak można go zobaczyć mówi w mojej Klasie Połączenie w linii 0. Co jest niemożliwe, jak można prawdopodobnie przypuszczać. Nie jestem pewien, jak interpretować, co oznacza wyspecjalizowany lub dlaczego jest tam @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) 

Tylko nie wiem, gdzie jest błąd występujący jako linia mówi Fuzja: 0 i nie jestem pewien, co te nagłówki (specjalistyczna/objc) znaczy jeśli oni mówią mi nic.

Oto moja funkcja scalania wewnątrz łączenia. Używam różnych pętli i obliczeń dla krycia i ustalania rzeczy, ale czekam na zero w lokalizacjach.

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

Czy istnieje szereg aktywów, które próbujesz uzyskać dostęp do aktywów w niektórych indeksach? Lub jakiejkolwiek innej tablicy w tym, do którego próbujesz uzyskać dostęp do obiektu, który nie istnieje? – adev

+0

Dodałem kod dla tej klasy, która jest powiązana z tą sytuacją. – impression7vx

+0

Wiele miejsc w twoim kodzie ma to "[0]". Powinieneś tam sprawdzić, czy liczba jest większa od zera, zanim to zrobisz i zaloguj błąd, jeśli liczba wynosi zero. To powinien być powód tego wypadku. – adev

Odpowiedz

1

Jest całkiem jasne, że metoda "Merger.merge" uzyskuje dostęp do nieistniejącego elementu. Debugger pokaże ci, gdzie to jest.

Przypuszczam, że jakiś wątek modyfikuje niektóre tablice za twoimi plecami, tak że indeks, który był ważny w pewnym momencie, staje się nieważny. A "dla zakresu2 w zasięgach", gdy później modyfikujesz "zakresy", proszą o kłopoty.

+0

Dostałem raport awarii z XCodes Organizer od testera i nie mogę odtworzyć problemu. Tak więc, chociaż test punktu przerwania mógłby pomóc, nie mogę odtworzyć problemu. Właśnie dlatego używam raportu o awarii z rejestru awarii z Apple i organizera XCode. Jeśli zauważysz, usunę 1 zakres i zawsze dodaję inny. Robię to, aby zrobić coś jak powiedzieć: (1-10), ale teraz chcę (1-15), więc usuwam (1-10) i dołączam (1-15). – impression7vx

1

Zgaduję, że problem jest spowodowany przez linię 129, biorąc pod uwagę przesunięcie +1444 i dostęp do tablicy. Czy wypróbowałeś film bez dźwięku, na przykład wideo wykonane bez pozwolenia na dźwięk? Napotkałem błąd związany z zawieszeniem, zakładając, że filmy wideo zrobione w mojej aplikacji zawsze miały ścieżki dźwiękowe. Będziesz zaskoczony przez użytkowników, jakie filmy wideo są dodawane do Twojej aplikacji. Miałem nawet użytkownika, który spowodował awarię mojej aplikacji z filmem flv, wybranym z albumu telefonu.

(Nie jestem pewien, czy to zadziała w przypadku Swift) Możliwe jest również zlokalizowanie linii w Xcode za pomocą debuggera. Najpierw uruchom aplikację z tym samym ustawieniem optymalizacji, co wersja wydania. Następnie łamie się różne linie w funkcji, aby sprawdzić kod zespołu. How to see assembly code in xcode 6. Być może trzeba przewinąć do góry, aby dokładnie sprawdzić nazwę funkcji i znaczenie przesunięcia.

_ArrayBuffer._getElementSlowPath jest klasą w prywatnym interfejsie API, oznaczoną przez prefiks podkreślenia. Prawdopodobnie nie znajdziesz żadnych wiarygodnych i/lub oficjalnych źródeł na ten temat.

Niekompletność w dzienniku awarii jest prawdopodobnie spowodowana przez błędy/niedojrzałość Swift (narzędzia za nim). Witaj w jednym z najbardziej popularnych i hiperowskich języków. Nawet w warunkach pracy Swift podaje linię 0 dla wygenerowanego kodu, gdzie kod nie odpowiada żadnej znaczącej części kodu źródłowego. To jednak nie twoja sprawa.

+0

Problem z debugowaniem jest taki, że nie mogę odtworzyć błędu; tylko jeden z testerów. Proces ten jest niesamowicie skomplikowany. – impression7vx

+0

Pamiętaj też, że plik audio, który wyciągam, nie pochodzi z jego audio, pochodzi z naszego wideo. Jest to również gwarantowane wideo. Używamy gotowego wideo, które jest już w aplikacji i idziemy stamtąd. – impression7vx

+0

Usunąłeś cały ślad stosu innych wątków. Problem z wieloma wątkami jest wciąż otwarty. Zakładając, że nie jest to problem wielowątkowy, nie można odtworzyć problemu, co oznacza, że ​​nie znalazłeś jeszcze krytycznego kroku. Film nie może zawierać ścieżek dźwiękowych. Nie jestem pewien, co to jest preset. Czy próbowałeś wystarczająco mocno, by nakarmić swoją aplikację niespodziewanymi filmami? – keithyip