[Résolu] Retrouver une ligne d'exception - Xcode
Voilà ma question est simple :
Est-il possible sans breakpoint de pouvoir retrouver une ligne qui a générer une exception :
J'ai en ce moment une exception qui apparait qq fois voir pas mal de fois sur insertObject et objectAtIndex
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(
0 CoreFoundation 0x000000010d48f3f5 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010d128bb7 objc_exception_throw + 45
2 CoreFoundation 0x000000010d35dd0a -[__NSArrayM insertObject:atIndex:] + 954
3 SpySeries 0x000000010a5b1954 -[ViewController initAndSortFavorites:completion:] + 3092
4 SpySeries 0x000000010a5ae925 -[ViewController viewDidLoad] + 1733
5 UIKit 0x000000010bb0b190 -[UIViewController loadViewIfRequired] + 738
6 UIKit 0x000000010bb0b38e -[UIViewController view] + 27
7 SpySeries 0x000000010a62db79 -[RESideMenu viewDidLoad] + 3945
8 UIKit 0x000000010bb0b190 -[UIViewController loadViewIfRequired] + 738
9 UIKit 0x000000010bb0b38e -[UIViewController view] + 27
10 UIKit 0x000000010ba2adb9 -[UIWindow addRootViewControllerViewIfPossible] + 58
11 UIKit 0x000000010ba2b152 -[UIWindow _setHidden:forced:] + 276
12 UIKit 0x000000010ba3765c -[UIWindow makeKeyAndVisible] + 42
13 UIKit 0x000000010b9e2191 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2628
14 UIKit 0x000000010b9e4e5c -[UIApplication _runWithMainScene:transitionContext:completion:] + 1350
15 UIKit 0x000000010b9e3d22 -[UIApplication workspaceDidEndTransaction:] + 179
16 FrontBoardServices 0x00000001121952a3 __31-[FBSSerialQueue performAsync:]_block_invoke + 16
17 CoreFoundation 0x000000010d3c4abc __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
18 CoreFoundation 0x000000010d3ba805 __CFRunLoopDoBlocks + 341
19 CoreFoundation 0x000000010d3b9fc3 __CFRunLoopRun + 851
20 CoreFoundation 0x000000010d3b9a06 CFRunLoopRunSpecific + 470
21 UIKit 0x000000010b9e3799 -[UIApplication _run] + 413
22 UIKit 0x000000010b9e6550 UIApplicationMain + 1282
23 SpySeries 0x000000010a5dbbf3 main + 115
24 libdyld.dylib 0x000000010e063145 start + 1
25 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Je me tape cette exception et je suis embêté j'ai beaucoup de classe etc ... mais j'aimerai retrouver la ligne en question est-ce possible docteur ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pourquoi sans breakpoint ? C'est quand même le plus simple.
Après, si le crash survient chez des utilisateurs par exemple en tout cas quand le device n'est pas branché à ton mac et à Xcode, et que tu récupères le CrashLog qu'après coup, bah il suffit de symboliser ton CrashLog.
Normalement si tu le charges dans Xcode, Xcode symbolise le crashlog tout seul.
Evidemment, il faut avoir gardé le dSYM qui a été généré avec l'IPA (chaque recompilation génère un dSYM différent). C'est pour cela que pour les livraisons, on passe par "Archive" et pas "Build", pour archiver à la fois l'IPA (prêt à être envoyé pour une livraison sur l'AppStore ou en OTA) et son dSYM (pour pouvoir symboliser les éventuels crashlogs et ainsi retrouver la correspondance adresses mémoires <-> méthodes et lignes)
Comme les autres il faut mettre des breakpoints.
Sinon vu ta capture d'écran, l'exception est générée à l'exécution de la méthode : initAndSortFavorites qui appelé la méthode insertObject... Donc c'est plus facile de retrouver la ligne qui foire sauf si ta méthode fait des centaines de lignes
Dans la vraie vie, c'est toujours plus compliqué.
Sur certains projets, j'ai du jouer à la main avec symbolicatecrash...
D'accord parceque moi je n'arrivais pas à analyser le log. Donc c'est cette fonction qui a un problème. Merci
_____
Ok @toutlemonde mais bon mettre 50 breakpoint et surtout parfois c'est dans le cellforrow et attendre 10 plombes c'est un peu lassant à la fin. Ensuite le crash intervient sur mon simulateur, mon iDevice semble être immunisé lol pour le moment du coup j'essaie de corriger le problème
MAJ : Du coup merci @samir j'ai compris d'ou venait mon problème "rare" ou plutôt introuvable.
Mais je suis d'accord avec vous les breakpoints c'est bien
Je prend exemple sur eclipse qui permet lors d'une custom Exception ou une Exception système de nous envoyer vers une zone de code problématique.
Onglet Breakpoints
+
Add Exception Breakpoint
Smy Ok pour symbolicatecrash je verrais ça plus tard mais merci pour l'info
Céroce le truc que tu me donne au dessus c'est pour quoi faire exactement ? Pareil qu'Eclipse ?
Et j'ai Create et pas de Add ==> je suppose que ça ne change rien
Onglet Breakpoints -> Bouton "+" tout en bas -> "Add Exception breakpoint" (on en a déjà parlé dans plusieurs posts )
Le symbolic breakpoint est génial.
Si tu as un bug, xcode va automatiquement s'arrêter à la ligne où il y a un problème !
Bah il y a pas qu'une seul fonction dans le log disons que je ne savais pas laquel prendre bref.
Okay cool du coup j'opterai ça dans un futur proche
Ah j'ai ma technique à proprement dite : NSLog(). Je l'utilisais souvent en C avec la masse de printf et voir lequel est le dernier à avoir été appelé. Ensuite en Obj-C j'ai essayé de faire en sorte de n'avoir jamais ce type d'exception ...
Tu peux cliquer sur https://www.youtube.com/watch?v=9IRw1d7inbY.
Ou plus généralement sur https://www.youtube.com/results?search_query=debugger+xcode.
ça va te prendre 10 minutes mais après tu auras gagné plusieurs après-midi...