2017-07-30 3 views
5

J'ai un rapport d'accident (il est déjà symbolicated au moins je l'espère que j'ai obtenu ce journal de XCode Organisateur)XCode Crash Report (déjà Symbolicated) manquant numéros de ligne

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 

Comme vous pouvez le voir dit dans ma fusion de classe à la ligne 0. Ce qui est impossible, comme vous pouvez probablement le supposer. Je ne suis pas sûr de savoir comment interpréter les moyens spécialisés ou pourquoi le @objc est là.

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) 

pas sûr où l'erreur se produit comme la ligne dit Fusion: 0 et je ne suis pas sûr de ce que ces en-têtes (spécialisés/ObjC) signifient si elles me disent quoi que ce soit.

Voici ma fonction de fusion dans Merger. J'utilise une variété de boucles et de calculs pour l'opacité et déterminer les choses, mais je vérifie zéro pour les emplacements.

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

Existe-t-il un ensemble d'actifs que vous essayez d'accéder à un actif à un index? Ou tout autre tableau dans lequel vous essayez d'accéder à un objet qui n'est pas là? – adev

+0

J'ai ajouté mon code pour cette classe affiliée à cette situation – impression7vx

+0

Beaucoup de places dans votre code ont ce '[0]'. Vous devriez vérifier si count est supérieur à zéro avant de le faire et enregistrer une erreur si count est zéro. Cela devrait être la raison de ce crash. – adev

Répondre

1

Il est assez clair que la méthode "Merger.merge" accède à un élément inexistant. Le débogueur vous montrera où c'est.

Je suppose que certains thread modifient un tableau derrière votre dos afin qu'un index qui était valide à un moment donné ne soit plus valide. Et "pour range2 in ranges" lorsque vous modifiez plus tard "ranges" demande des problèmes.

+0

J'ai reçu le rapport d'erreur de XCodes Organizer d'un testeur et je n'arrive pas à reproduire le problème. Donc, alors qu'un test de point d'arrêt aiderait, je ne peux pas reproduire le problème. C'est pourquoi j'utilise le rapport de plantage d'un journal de plantage d'Apple et de l'organiseur de XCode. Si vous remarquez, j'enlève 1 range et en ajoute toujours une autre. Je fais ceci pour faire quelque chose comme dire: (1-10) mais maintenant je veux (1-15) donc je supprime (1-10) et ajoute le (1-15). – impression7vx

1

Je suppose que le problème est causé par la ligne 129, compte tenu du décalage +1444 et de l'accès au tableau. Avez-vous essayé une vidéo sans audio, comme une vidéo prise sans autorisation audio? J'ai rencontré un crash hors limites en supposant que les vidéos prises dans mon application avaient toujours des pistes audio. Vous serez surpris par les utilisateurs de la vidéo qu'ils alimentent dans votre application. J'ai même eu un utilisateur écrasant mon application avec une vidéo flv, sélectionnée à partir de leur album téléphonique.

(Je ne suis pas sûr que cela fonctionnera pour Swift) Il est également possible de localiser la ligne dans Xcode en utilisant le débogueur. Tout d'abord, vous exécutez l'application avec le même paramètre d'optimisation que la version finale. Ensuite, vous cassez différentes lignes dans la fonction pour vérifier le code d'assemblage. How to see assembly code in xcode 6. Vous devrez peut-être faire défiler vers le haut pour vérifier le nom de la fonction et la signification du décalage.

_ArrayBuffer._getElementSlowPath est une classe de l'API privée, indiquée par le préfixe de soulignement. Vous ne trouverez probablement aucune source crédible et/ou officielle à ce sujet. L'incomplétude de votre journal de panne est probablement due à des bogues/immaturité de Swift (les outils qui la sous-tendent). Bienvenue dans l'une des langues les plus tendance et hyped. Même dans des conditions de travail, Swift donne la ligne 0 pour le code généré où le code ne correspond à aucune partie significative du code source. Ce n'est pas votre cas cependant.

+0

Le problème avec le débogage est que je n'arrive pas à reproduire l'erreur; seulement un des testeurs. Rendre ce processus incroyablement compliqué – impression7vx

+0

Notez également que le fichier audio que je tire ne provient pas de l'audio, il provient de notre vidéo. C'est aussi une vidéo garantie. Nous utilisons une vidéo prédéfinie qui est déjà dans l'application et allons à partir de là. – impression7vx

+0

Vous avez supprimé toute trace de pile d'autres threads. Le problème multi-thread est toujours ouvert. En supposant que ce n'est pas un problème multi-thread, impossible de reproduire le problème, ce qui signifie que vous n'avez pas encore trouvé l'étape critique. Une vidéo ne peut avoir aucune piste audio. Je ne suis pas sûr de ce qu'est un préréglage. Avez-vous essayé assez dur pour nourrir votre application avec des vidéos inattendues? – keithyip