it-swarm.com.ru

Как распечатать или увидеть стек вызовов методов в xcode?

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

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

как мы знаем 

`cellForRowAtIndexPath:`

Есть несколько раз, когда этот метод может быть вызван.

как время 

 scrolling table view cells.

 Or table view reload data.

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

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

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

13
Arpit B Parekh

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

debug navigator

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

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

20
Caleb

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

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

Правка: Swift код

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

Вы можете установить точку останова (или приостановить приложение) и из gdb debugger написать «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
11
elp

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

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

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

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

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

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

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.

Узнайте больше здесь - https://www.bignerdranch.com/blog/xcode-breakpoint-wizardry/

1
yoAlex5

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

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