crash sur device et debug

macphimacphi Membre
novembre 2017 modifié dans API UIKit #1

Bonjour


 


J'ai compilé mon app pour un iPhone 8 plus, app qui fonctionnait parfaitement sur un 6 plus.


 


Au lancement l'app crash et si je la relance aussitôt elle fonctionne sans problème.


Quand je compile l'app et la lance depuis Xcode tout fonctionne sans crash...


 


Avez-vous une idée de la manière dont je peux tracer/debugger la raison de ce crash ?


 


Merci


 


PS : app utilisant Core Location, Baromètre, NSURLSession, MapView


Réponses

  • Il n'y aurait pas une tentative de lecture de préférences dans les userDefaults à  la première utilisation ? Ou encore une tentative d'utiliser la localisation avant que l'utilisateur ne l'ait autorisé ?


  • CéroceCéroce Membre, Modérateur
    novembre 2017 modifié #3
    Il te faut récupérer le crashlog. Sans ça, on ne peut faire que des hypothèses.
  • macphimacphi Membre
    novembre 2017 modifié #4

    Bon j'ai trouvé ça dans la partie "view device logs", je mets tout de peur d'omettre une ligne importante...


    Tiens d'ailleurs il n'y a pas que la mienne d'app qui plante !  ::)


     


    Zut, post too long...



    Incident Identifier: FFEA82D6-6822-45DF-9A83-D4B7B526D570
    CrashReporter Key: 4fca1ec3a8cb8e8c5b88a00d8c1b779517ffbf1a
    Hardware Model: iPhone10,5
    Process: WatchMetPil [908]
    Path: /private/var/containers/Bundle/Application/1C1A8D51-398F-483F-8169-E8F36766A3DE/WatchMetPil.app/WatchMetPil
    Identifier: com.pilax.WatchMetPil
    Version: 1 (1.97.28)
    Code Type: ARM-64 (Native)
    Role: Foreground
    Parent Process: launchd [1]
    Coalition: com.pilax.WatchMetPil [612]


    Date/Time: 2017-11-05 18:55:07.6029 +0100
    Launch Time: 2017-11-05 15:55:47.7147 +0100
    OS Version: iPhone OS 11.1 (15B93)
    Baseband Version: 1.02.03
    Report Version: 104

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

    Application Specific Information:
    abort() called

    Filtered syslog:
    None found

    Last Exception Backtrace:
    0 CoreFoundation 0x182c25d04 __exceptionPreprocess + 124
    1 libobjc.A.dylib 0x181e74528 objc_exception_throw + 55
    2 CoreFoundation 0x182c331c8 -[NSObject+ 1372616 (NSObject) doesNotRecognizeSelector:] + 139
    3 UIKit 0x18c41b11c -[UIResponder doesNotRecognizeSelector:] + 295
    4 CoreFoundation 0x182c2b6b0 ___forwarding___ + 1379
    5 CoreFoundation 0x182b1101c _CF_forwarding_prep_0 + 91
    6 CoreFoundation 0x182bb80bc __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 19
    7 CoreFoundation 0x182bb765c _CFXRegistrationPost + 419
    8 CoreFoundation 0x182bb73c0 ___CFXNotificationPost_block_invoke + 59
    9 CoreFoundation 0x182c349c4 -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1407
    10 CoreFoundation 0x182aee0c0 _CFXNotificationPost + 379
    11 Foundation 0x18350f498 -[NSNotificationCenter postNotificationName:object:userInfo:] + 67
    12 UIKit 0x18c299b50 -[UIApplication _sendWillEnterForegroundCallbacks] + 227
    13 UIKit 0x18c55ae28 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 1419
    14 UIKit 0x18ccd64b8 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 259
    15 UIKit 0x18ccd635c -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 447
    16 UIKit 0x18ca48294 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 219
    17 UIKit 0x18cbdf0ac _performActionsWithDelayForTransitionContext + 111
    18 UIKit 0x18ca48144 -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 251
    19 UIKit 0x18c82e2d8 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 363
    20 UIKit 0x18c6d0d68 -[UIApplicationSceneClientAgent scene:handleEvent:withCompletion:] + 467
    21 FrontBoardServices 0x1852d220c __80-[FBSSceneImpl updater:didUpdateSettings:withDiff:transitionContext:completion:]_block_invoke.362 + 211
    22 libdispatch.dylib 0x1825a9048 _dispatch_client_callout + 15
    23 libdispatch.dylib 0x1825e4b10 _dispatch_block_invoke_direct$VARIANT$armv81 + 279
    24 FrontBoardServices 0x1853059f4 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 35
    25 FrontBoardServices 0x185305698 -[FBSSerialQueue _performNext] + 403
    26 FrontBoardServices 0x185305c34 -[FBSSerialQueue _performNextFromRunLoopSource] + 55
    27 CoreFoundation 0x182bce2e8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 23
    28 CoreFoundation 0x182bce268 __CFRunLoopDoSource0 + 87
    29 CoreFoundation 0x182bcdaf0 __CFRunLoopDoSources0 + 203
    30 CoreFoundation 0x182bcb6c8 __CFRunLoopRun + 1047
    31 CoreFoundation 0x182aebfb8 CFRunLoopRunSpecific + 435
    32 GraphicsServices 0x184983f84 GSEventRunModal + 99
    33 UIKit 0x18c0c02f4 UIApplicationMain + 207
    34 WatchMetPil 0x1055417dc 0x104ffc000 + 5527516
    35 libdyld.dylib 0x18260e56c start + 3 
  • CéroceCéroce Membre, Modérateur
    J'avoue que j'ai du mal à  le lire. C'est le thread 0 qui plante.
    On voit que UIApplication envoie la notification "willEnterForeground". Ensuite, je ne comprends pas bien pourquoi un UIResponder n'arrive pas à  comprendre un appel de méthode.
  • J'avoue que j'ai du mal à  le lire.


    Tu m'étonnes !


    Merci je vais jeter un coup d'oe“il sur willEnterForeground mais j'ai l'impression que je ne suis pas le cul sorti des ronces...!
  • LeChatNoirLeChatNoir Membre, Modérateur

    Oui, tu construis ton interface dynamiquement ?


     


    C'est là  que les bactéries attaquent :



    2 CoreFoundation 0x182c331c8 -[NSObject+ 1372616 (NSObject) doesNotRecognizeSelector:] + 139
    3 UIKit 0x18c41b11c -[UIResponder doesNotRecognizeSelector:] + 295

  • Tu utilises le NSNotificationCenter ? Je me demande si ce n'est pas lié à  un observer qui n'existe plus. Mais c'est vraiment étrange que cela se produise au premier lancement uniquement.




  •  


    Oui, tu construis ton interface dynamiquement ?


     


    C'est là  que les bactéries attaquent :



    2 CoreFoundation 0x182c331c8 -[NSObject+ 1372616 (NSObject) doesNotRecognizeSelector:] + 139
    3 UIKit 0x18c41b11c -[UIResponder doesNotRecognizeSelector:] + 295



    Non storyboard...


     


    Merci je vais regarder !



  • Tu utilises le NSNotificationCenter ? Je me demande si ce n'est pas lié à  un observer qui n'existe plus. Mais c'est vraiment étrange que cela se produise au premier lancement uniquement.




    Oui NSNotificationCenter, je vais regarder aussi...


     


    Pour info, pas un seul plantage aujourd'hui, pas simple !


    ::)

  • Bon alors le coupable c'est ça :



    NotificationCenter.default.addObserver(self, selector: #selector(UIApplicationDelegate.applicationWillEnterForeground(_:)), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)

    Quand je commente cette ligne plus de plantage aléatoire mais le souci c'est que du coup l'application n'est pas mise à  jour quand elle est relancée...


    >:(


  • Joanna CarterJoanna Carter Membre, Modérateur
    Et cette ligne se trouve où ?
  • au début de :



    override func viewDidLoad() {
  • Et à  quel moment tu enlèves cet observer?


  • Je n'ai pas le code sous les yeux, mais j'ai l'impression que c'est là  que le bât blesse...


    Où suis-je censé enlever l'observer ?

    (Et comment si tu as le nom de la fonction...)


    Merci
  • Joanna CarterJoanna Carter Membre, Modérateur
    Faut chercher pour removeObserver
  • Merci 


     


    A quel endroit dois-je utiliser cette fonction ?


  • LexxisLexxis Membre
    novembre 2017 modifié #18


    Bon alors le coupable c'est ça :



    NotificationCenter.default.addObserver(self, selector: #selector(UIApplicationDelegate.applicationWillEnterForeground(_:)), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)

    Quand je commente cette ligne plus de plantage aléatoire mais le souci c'est que du coup l'application n'est pas mise à  jour quand elle est relancée...


    >:(




     


    applicationWillEnterForeground est définit dans la classe ou tu utilises cette ligne ? (avec @objc en swift 4 apparemment)


  • oui et applicationWillEnterForeground est bien appelée




  • Merci 


     


    A quel endroit dois-je utiliser cette fonction ?




    Le "deinit" de la classe semble l'endroit le plus judicieux j'imagine



  • Merci 


     


    A quel endroit dois-je utiliser cette fonction ?




    Là  où cela parait judicieux.


    En général, dans la méthode " inverse ". Par exemple, un viewDidAppear() pour le addObserver: et viewDidDisappear() pour le removeObserver: semble cohérent.


    Il faut juste faire en sorte que pour chaque addObserver, il y ait un removeObserver. Donc, par exemple, éviter de mettre ça dans une méthode qui serait appelée 50 fois pour un addObserver, mais il n'y aurait qu'un seul appel à  un removeObserver.

  • bon j'abuse...


     


    où est donc le "deinit" d'une classe ViewController ?

  • Je suis désolé mais je n'avance guère...


     


    Mes appels addObserver sont dans la fonction viewDidLoad du controller principal.


     


    Du coup je ne vois pas du tout où placer le removeObserver puisque il faut bien continuer à  observer...?

  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2017 modifié #25
    Pourquoi tu as ajouté un observer pour un événement qui est déjà  observé automatiquement par là  méthode du delegate ?
  • euh...


     


    je regarde de ce côté-là  aussi !




  • Je suis désolé mais je n'avance guère...


     


    Mes appels addObserver sont dans la fonction viewDidLoad du controller principal.


     


    Du coup je ne vois pas du tout où placer le removeObserver puisque il faut bien continuer à  observer...?




     


    Perso je ferais plutôt çà  dans viewWillAppear et viewWillDisappear...

  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2017 modifié #28

    Eh bien. Le problème n'a rien à  voir avec si on a ou on n'a pas appelé removeObserver !!!


     


    Le problème se trouve dans cette ligne :



    NotificationCenter.default.addObserver(self, selector: #selector(UIApplicationDelegate.applicationWillEnterForeground(_:)), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)


    Là , tu as, au moins, deux fautes.


     


    1. tu a mis self comme cible pour recevoir la notification


     


    2. il n'y a pas de méthode applicationWillEnterForeground(_ ;) dans la classe du contrôleur ou tu as mis le code


     


    3. la méthode applicationWillEnterForeground(_ ;) existe déjà  dans l'appDelegate, si tu l'avais implémenté


     


    4. Tu ne peux pas utiliser une méthode d'une classe en dehors de ce qui est la cible.


     


    5. je répète, pourquoi as-tu écrit cette ligne de code, n'importe où, quand la notification est déjà  géré  dans l'appDelegate ?


     


    Si tu voulais vraiment capter cette notification dans le viewController, tu aurais dû écrire :



    class ViewController: UIViewController
    {
    required init?(coder aDecoder: NSCoder)
    {
    super.init(coder: aDecoder)

    NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground(_:)), name: .UIApplicationWillEnterForeground, object: nil)
    }

    deinit
    {
    NotificationCenter.default.removeObserver(self, name: .UIApplicationWillEnterForeground, object: nil)
    }

    @objc func applicationWillEnterForeground(_ application: UIApplication)
    {
    // ...
    }
    }

  • macphimacphi Membre
    novembre 2017 modifié #29

    Bon je n'ai pas attendu que les filles soient couchées et ça fonctionne !


    Merci encore Joanna !


       


     


    Donc j'en ai bien conscience, mon code est pourri et pourtant ça fonctionne comme ça depuis iOS 9 sur un iPhone 6 plus... 


    iOS 11 et iPhone 8 plus sont sûrement plus exigeant...


     



    5. je répète, pourquoi as-tu écrit cette ligne de code, n'importe où, quand la notification est déjà  géré  dans l'appDelegate ?



    Parce que je suis encore un mauvais programmeur...


    Je me souviens avoir tenté des choses avec l'appDelegate sans parvenir à  le faire, donc j'avais cherché autre chose.


Connectez-vous ou Inscrivez-vous pour répondre.