web-dev-qa-db-fra.com

Comment imprimer ou voir la pile d'appels de méthodes dans xcode?

Je travaille sur mon application iPad,

Lors de l'exécution du code, il existe une méthode dans la vue tableau.

comme nous le savons

`cellForRowAtIndexPath:`

Cette méthode peut être appelée plusieurs fois.

comme tout

 scrolling table view cells.

 Or table view reload data.

J'ai un codage complexe, donc je veux juste voir la pile d'appels de méthode ...

Celle à partir de laquelle la méthode appelle la cellule pour la ligne au chemin d’index.

J'ai utilisé NSLogs et des points d'arrêt, mais je ne pouvais toujours pas obtenir.

13
Arpit B Parekh

Lorsque vous atteignez un point d'arrêt, sélectionnez le navigateur Débogage dans la zone de navigation (côté gauche de la fenêtre):

debug navigator

Le navigateur de débogage vous montre une trace de pile pour chaque thread de votre application. Il vous montre essentiellement les mêmes informations que vous obtenez de la commande backtrace de gdb, mais omet les adresses de retour (qui ne sont normalement pas très utiles). Utilisez les commandes situées au bas du navigateur pour masquer ou afficher tous les threads et pour modifier le nombre de cadres de pile affichés. Le curseur situé au milieu de la plage dans l'image ci-dessus et le navigateur de débogage omet les cadres de pile 2-18, qui sont tous des appels d'une méthode d'infrastructure à une autre, c.-à-d.

Xcode 4 doit être configuré pour afficher le navigateur de débogage automatiquement lorsque vous déboguez. Sinon, vous pouvez le configurer en allant dans Xcode-> Comportements-> Modifier les comportements .... Ensuite, sélectionnez l'élément Exécuter les pauses. la liste et réglez-la sur Show navigator Debug Navigator .

20
Caleb

Vous pouvez imprimer la trace de la pile dans le NSLog en

NSLog(@"Stack trace : %@",[NSThread callStackSymbols]);

EDIT: code rapide

println("Stack trace: %@", NSThread.callStackSymbols())
19
Nishant

Vous pouvez définir un point d'arrêt (ou une application suspendue) et à partir de gdb debugger, écrivez "backtrace". 

Vous devriez voir la pile:

(gdb) backtrace
#0  0x9022f7fe in mach_msg_trap ()
#1  0x9022ecdc in mach_msg ()
#2  0x022a310a in __CFRunLoopServiceMachPort ()
#3  0x02206550 in __CFRunLoopRun ()
#4  0x02205d84 in CFRunLoopRunSpecific ()
#5  0x02205c9b in CFRunLoopRunInMode ()
#6  0x024617d8 in GSEventRunModal ()
#7  0x0246188a in GSEventRun ()
#8  0x00c0ca16 in UIApplicationMain ()
#9  0x0000270d in main (argc=1, argv=0xbfeff550) at /Users/.........m:14
11
elp

Essayez de définir un point d'arrêt à l'entrée de

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Cliquez ensuite avec le bouton droit de la souris sur le point d'arrêt et sélectionnez "Enregistrer la trace de la pile et continuer automatiquement" dans le menu "Points d'arrêt intégrés".

Ceci enregistrera automatiquement la trace de la pile à chaque fois que cette fonction est entrée et continuera sans avoir à utiliser réellement la console gdb.

C'était pour Xcode 3.x Pour Xcode 4, la procédure est un peu différente.

  1. Définissez votre point d'arrêt.
  2. Cliquez avec le bouton droit de la souris sur le point d'arrêt et sélectionnez "Modifier Point d'arrêt". (Ou Command-Option Cliquez sur le point d'arrêt)
  3. Sélectionnez "Commande du débogueur" dans le menu "Action".
  4. Définissez le message sur "bt" (sans les guillemets.)
  5. Sous "Options", cochez la case "Continuer automatiquement après évaluation".
7
Mark

bt, affiche la trace de la pile du fil actuel (trace) sur la console. Ces informations incluent le numéro de fil, les cadres, etc.

* thread #1: tid = 0x3cccc1, 0x00003076 MyStuff`-[BNRMasterViewController viewDidLoad](self=0x08988fa0, _cmd=0x009bad27) + 102 at BNRMasterViewController.m:35, queue = 'com.Apple.main-thread, stop reason = breakpoint 1.1
        frame #0: 0x00003076 MyStuff`-[BNRMasterViewController viewDidLoad](self=0x08988fa0, _cmd=0x009bad27) + 102 at BNRMasterViewController.m:35
        frame #1: 0x003409a8 UIKit`-[UIViewController loadViewIfRequired] + 696
        frame #2: 0x00340c44 UIKit`-[UIViewController view] + 35
        frame #3: 0x0036b339 UIKit`-[UINavigationController rotatingSnapshotViewForWindow:] + 52
        frame #4: 0x00694910 UIKit`-[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] + 420
        frame #5: 0x00270ea2 UIKit`-[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 1495
        frame #6: 0x002708c6 UIKit`-[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 82
        frame #7: 0x00270798 UIKit`-[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 117
        frame #8: 0x00270820 UIKit`-[UIWindow _setRotatableViewOrientation:duration:force:] + 67
        frame #9: 0x0026f8ba UIKit`__57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke + 120
        ...

Si vous déboguez une partie multithread de votre application, vous pouvez également utiliser la commande bt all pour afficher le suivi de la pile pour chaque thread lorsque le point d'arrêt est atteint. 

Vous pouvez également imprimer un nombre limité de cadres de pile en ajoutant un nombre à la commande, tel que bt 10.

Lisez plus ici - https://www.bignerdranch.com/blog/xcode-breakpoint-wizardry/

1
yoAlex5

Il suffit de mettre la syntaxe de Swift 4 au cas où quelqu'un aurait besoin

print("Stack trace: \(Thread.callStackSymbols)")
0
Karthick Ramesh