objective-c - Xcode5 如何调试 快速定位出错行
怪我咯
怪我咯 2017-04-22 09:00:08
0
3
752

、、、objectivec
2014-07-21 18:02:38.259 Sections[2962:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'must pass a class of kind UITableViewCell'
*** First throw call stack:
(
0 CoreFoundation 0x017375e4 exceptionPreprocess + 180
1 libobjc.A.dylib 0x014ba8b6 objc_exception_throw + 44
2 CoreFoundation 0x017373bb +[NSException raise:format:] + 139
3 UIKit 0x00314e08 -[UITableView registerClass:forCellReuseIdentifier:] + 247
4 Sections 0x000030eb -[BIDViewController searchDisplayController:didLoadSearchResultsTableView:] + 171
5 UIKit 0x005cc0b4 -[UISearchDisplayController searchResultsTableView] + 446
6 UIKit 0x005cd5f4 -[UISearchDisplayController _containerView] + 1031
7 UIKit 0x005c7563 -[UISearchDisplayController setActive:animated:] + 9462
8 UIKit 0x005cad4f -[UISearchDisplayController searchBarTextDidBeginEditing:] + 298
9 UIKit 0x004f52c9 -[UISearchBar(UISearchBarStatic) _searchFieldBeginEditing] + 113
10 libobjc.A.dylib 0x014cc81f -[NSObject performSelector:withObject:] + 70
11 UIKit 0x0022ec8c -[UIApplication sendAction:to:from:forEvent:] + 108
12 UIKit 0x0022ec18 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
13 UIKit 0x003266d9 -[UIControl sendAction:to:forEvent:] + 66
14 UIKit 0x00326a9c -[UIControl _sendActionsForEvents:withEvent:] + 577
15 UIKit 0x0091254e -[UITextField willAttachFieldEditor:] + 685
16 UIKit 0x0032c4d5 -[UIFieldEditor becomeFieldEditorForView:] + 927
17 UIKit 0x00909643 -[UITextField _becomeFirstResponder] + 160
18 UIKit 0x004f841a -[UISearchBarTextField _becomeFirstResponder] + 98
19 UIKit 0x00386585 -[UIResponder becomeFirstResponder] + 400
20 UIKit 0x00289d0b -[UIView(Hierarchy) becomeFirstResponder] + 114
21 UIKit 0x009090e3 -[UITextField becomeFirstResponder] + 51
22 UIKit 0x005ae651 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 135
23 UIKit 0x005b0ba2 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) oneFingerTap:] + 2640
24 UIKit 0x005a4f8c _UIGestureRecognizerSendActions + 230
25 UIKit 0x005a3c00 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 383
26 UIKit 0x005a566d -[UIGestureRecognizer _delayedUpdateGesture] + 60
27 UIKit 0x005a8bcd ___UIGestureRecognizerUpdate_block_invoke + 57
28 UIKit 0x005a8b4e _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 317
29 UIKit 0x0059f248 _UIGestureRecognizerUpdate + 199
30 UIKit 0x0026bd4a -[UIWindow _sendGesturesForEvent:] + 1291
31 UIKit 0x0026cc6a -[UIWindow sendEvent:] + 1030
32 UIKit 0x00240a36 -[UIApplication sendEvent:] + 242
33 UIKit 0x0022ad9f _UIApplicationHandleEventQueue + 11421
34 CoreFoundation 0x016c08af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION
+ 15
35 CoreFoundation 0x016c023b __CFRunLoopDoSources0 + 235
36 CoreFoundation 0x016dd30e __CFRunLoopRun + 910
37 CoreFoundation 0x016dcb33 CFRunLoopRunSpecific + 467
38 CoreFoundation 0x016dc94b CFRunLoopRunInMode + 123
39 GraphicsServices 0x036d89d7 GSEventRunModal + 192
40 GraphicsServices 0x036d87fe GSEventRun + 104
41 UIKit 0x0022d94b UIApplicationMain + 1225
42 Sections 0x0000399d main + 141
43 libdyld.dylib 0x01d75701 start + 1
44 ??? 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
、、、
如上所示,错误提示,使用的是XCODE5 无法根据错误提示找到出错行,网上有的方法试过不可以。希望知道的同学告知下。谢谢!

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(3)
Ty80

Ajoutez un point d'arrêt d'exception (Ajouter un point d'arrêt d'exception) dans le navigateur de point d'arrêt de Xcode, puis définissez la condition du point d'arrêt sur Exception: Object-C, afin qu'il puisse être interrompu avant que l'exception ne soit levée, et que vous puissiez voir la pile d'appels à ce moment-là.

Notez qu'il est préférable d'ouvrir ce point d'arrêt lorsque le code problématique est sur le point d'être exécuté, sinon il continuera à être perturbé par diverses exceptions.

洪涛

Votre projet s'appelle Sections, n'est-ce pas ?
C'est ici que votre exception est levée :
4 Sections 0x000030eb -[BIDViewController searchDisplayController:didLoadSearchResultsTableView:] + 171
Le décalage de code de la méthode searchDisplayController de la classe BIDViewController est de 171 (presque les 170 caractères de cette méthode, presque les lignes 2 et 3. N'oubliez pas que 171 n'est pas un numéro de ligne ou quelque chose du genre).

À propos de l'analyse des exceptions iOS, c'est vraiment un casse-tête au début, car elle n'indique pas directement au développeur où l'exception est levée, et parfois il n'y a même pas de pile d'exceptions, et même s'il y a une pile d'exceptions, elle Il n'est pas facile de comprendre de quoi il s'agit. La signification, en particulier le numéro de décalage du code, est extrêmement trompeuse. Il existe généralement de nombreuses méthodes de débogage, et il faudrait une nuit entière pour toutes les aborder. Le point d'arrêt d'exception répondu par Huan Du en est un, et bien sûr il y a la méthode de visualisation d'impression d'assertion de journal, la définition de point d'arrêt symbolique, l'outil de débogage LLDB . Personnellement, je préfère toujours la méthode d'analyse de pile publiée dans votre question. Fondamentalement, le problème peut être déterminé en fonction du nom de la classe, du nom de la méthode et du décalage du code.

Concernant le rapport de stack, présentez brièvement la signification de son contenu :
Par exemple :
4 sections 0x000030eb -[BIDViewController searchDisplayController:didLoadSearchResultsTableView:] + 171
Il comprend un total de 5 parties : 4/Sections/0x000030eb/-[BIDVi...ew:]/171
Partie 1 : La pile génère le numéro de séquence. Plus le numéro de séquence est grand, plus il est précoce. le code est appelé
Partie 2 : Le framework (bibliothèque/projet) auquel appartient la méthode appelée. Par exemple, Sections est votre projet
; Partie 3 : L'adresse mémoire de la méthode appelante, qui est 0x000030eb
Partie 4 : Appeler le nom de la méthode, c'est très important, c'est-à-dire -[BIDViewController searchDisplayController:didLoadSearchResultsTableView:]
Partie 5 : Le décalage du code après l'appel de la méthode après compilation. Là encore, ce n'est pas le numéro de ligne, mais le décalage du code compilé, mais c'est fondamentalement le même que le nombre de caractères. Vous pouvez utiliser certains outils de texte pour compter votre. méthodes. Le décalage des caractères est une estimation approximative de la mauvaise ligne, et l'erreur générale est comprise entre 3 et 5 lignes.

Voici une petite astuce pour empêcher xcode de ne pas imprimer les journaux de pile :
Ajoutez @try@catch sur la méthode main dans main.m, comme ceci :

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char* argv[])
{
    @try {
        @autoreleasepool
        {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    @catch (NSException* exception)
    {
        Log(@"Exception=%@\nStack Trace:%@", exception, [exception callStackSymbols]);
    }
}

Mais n'oubliez pas de supprimer le package try catch avant de publier l'application, cher ~~~

大家讲道理

[UITableView registerClass:forCellReuseIdentifier:] Quelque chose s'est mal passé ici !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal