Как распечатать или увидеть стек вызовов методов в xcode? - PullRequest
13 голосов
/ 01 марта 2012

Я работаю над своим приложением для iPad,

Во время выполнения кода в табличном представлении есть один метод.

как мы знаем

`cellForRowAtIndexPath:`

Этот метод можно вызывать несколько раз.

нравится, пока

 scrolling table view cells.

 Or table view reload data.

У меня сложное кодирование, поэтому я просто хочу увидеть стек вызовов методов ...

То, из какого метода вызывается ячейка для строки по пути индекса.

Я использовал NSLogs и точки останова, но все еще не смог получить.

Ответы [ 6 ]

21 голосов
/ 17 декабря 2014

Вы можете распечатать трассировку стека в NSLog по

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

РЕДАКТИРОВАТЬ: Swift код

println("Stack trace: %@", NSThread.callStackSymbols())
20 голосов
/ 01 марта 2012

Когда вы достигнете точки останова, выберите Навигатор отладки в области навигатора (левая сторона окна):

debug navigator

Навигатор отладки показывает трассировку стека для каждого потока в вашем приложении. По сути, он показывает ту же информацию, которую вы получаете из команды backtrace в gdb, но опускает адреса возврата (которые обычно не очень полезны). Используйте элементы управления в нижней части навигатора, чтобы скрыть или показать все потоки и изменить настройку количества отображаемых кадров стека. У меня есть ползунок, установленный в середине его диапазона на изображении выше, и навигатор отладки пропускает стековые фреймы 2-18, которые все являются вызовами от одного метода фреймворка к другому, т.е. не мои вещи.

Xcode 4 должен быть настроен на автоматическое отображение навигатора отладки во время отладки, но если нет, вы можете настроить его для этого, перейдя в Xcode-> Behaviors-> Edit Behaviors .... Затем выберите Run Приостанавливает элемент из списка и устанавливает его на Показать навигатор Отладка навигатора .

11 голосов
/ 01 марта 2012

Вы можете установить точку останова (или приостановить приложение) и из gdb отладчик написать "backtrace".

Вы должны увидеть стек:

(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
7 голосов
/ 01 марта 2012

Попробуйте установить точку останова на входе для

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

Затем щелкните правой кнопкой мыши точку останова и выберите «Log Stack Trace and Auto Continue» из «Встроенных точек останова»Пункт меню.

Это будет автоматически регистрировать трассировку стека каждый раз, когда эта функция будет введена, и будет продолжаться без необходимости фактически использовать консоль gdb.

Это было для Xcode 3.x Для Xcode 4процедура немного отличается.

  1. Установите точку останова.
  2. Щелкните правой кнопкой мыши по точке останова и выберите «Редактировать точку останова».(Или Command - Option Нажмите на точку останова)
  3. Выберите «Команда отладчика» из всплывающего окна «Действие».
  4. Установите для сообщения значение «bt» (без кавычек).)
  5. В разделе «Параметры» установите флажок «Автоматически продолжать после оценки».
2 голосов
/ 12 сентября 2018

bt, выводит трассировку стека текущего потока (backtrace) на консоль.Эта информация включает в себя номер потока, кадры и т. Д. И выглядит как

* 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
        ...

Если вы отлаживаете многопоточную часть вашего приложения, вы можете использовать команду: bt all, чтобы показать трассировку стекакаждый поток при достижении точки останова.

Вы также можете распечатать ограниченное количество кадров стека, добавив в команду число: bt 10.

или

po Thread.callStackSymbols

Подробнее здесь

0 голосов
/ 21 июня 2018

Просто добавьте синтаксис Swift 4 на тот случай, если кому-то понадобится

print("Stack trace: \(Thread.callStackSymbols)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...