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

<p>я работаю над своим приложением для ipad,</p><p>во время выполнения кода есть один метод в табличном представлении.</p><p>как мы знаем </p><pre><code>`cellforrowatindexpath:` </code></pre><p>есть несколько раз, когда этот метод может быть вызван.</p><p>как время </p><pre><code> scrolling table view cells. or table view reload data. </code></pre><p>у меня сложное кодирование, поэтому я просто хочу увидеть стек вызовов методов ...</p><p>то, из какого метода вызывается ячейка для строки по пути индекса.</p><p>я использовал <code>nslogs</code> и точки останова, но так и не смог получить.</p>

<p>когда вы достигнете точки останова, выберите навигатор отладки в области навигатора (левая сторона окна):</p><p><img src="https://i.stack.imgur.com/zfirg.png" alt="debug navigator"></p><p>навигатор отладки показывает трассировку стека для каждого потока в вашем приложении. он показывает вам, по сути, ту же информацию, которую вы получаете от команды <code>backtrace</code> из gdb, но опускает адреса возврата (которые обычно не очень полезны). используйте элементы управления в нижней части навигатора, чтобы скрыть или показать все потоки и изменить настройку количества отображаемых кадров стека. у меня есть ползунок, установленный в середине его диапазона на изображении выше, и навигатор отладки пропускает стековые фреймы 2-18, которые все являются вызовами от одного метода фреймворка к другому, т.е. не мои вещи.</p><p>xcode 4 должен быть настроен на автоматическое отображение навигатора отладки при отладке, но если это не так, вы можете настроить его для этого, перейдя в xcode-> behaviors-> edit behaviors .... затем выберите элемент run pauses из список и установите его в<strong> показать </strong>навигатор<strong> отладочный навигатор </strong>.</p>

<p>вы можете распечатать трассировку стека в nslog:</p><pre><code>nslog(@"stack trace : %@",[nsthread callstacksymbols]); </code></pre><p>правка: swift код</p><pre><code>println("stack trace: %@", nsthread.callstacksymbols()) </code></pre>

<p>вы можете установить точку останова (или приостановить приложение) и из<strong> gdb </strong>debugger написать «<code>backtrace</code>». </p><p>вы должны увидеть стек:</p><pre><code>(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 </code></pre>

<p>попробуйте установить точку останова на входе для</p><p><code>- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath</code></p><p>затем щелкните правой кнопкой мыши точку останова и выберите «log stack trace и auto continue» в пункте меню «встроенные точки останова».</p><p>это будет автоматически регистрировать трассировку стека каждый раз, когда эта функция будет введена, и продолжит без необходимости фактически использовать консоль gdb.</p><p>это было для xcode 3.x для xcode 4 процедура немного другая.</p><ol> <li>установите точку останова.</li> <li>щелкните правой кнопкой мыши точку останова и выберите «изменить точка останова». (или <code>command</code>-<code>option</code> нажмите на точку останова)</li> <li>выберите «команда отладчика» из всплывающего окна «действие».</li> <li>установите сообщение «bt» (без кавычек.)</li> <li>в разделе «параметры» установите флажок «автоматически продолжать после оценки».</li> </ol>

<p><code>bt</code>, выводит трассировку стека текущего потока (backtrace) на консоль. эта информация включает в себя номер потока, кадры и т.д. и выглядит как</p><pre><code>* 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 ... </code></pre><p>если вы отлаживаете многопоточную часть вашего приложения, вы также можете использовать команду <code>bt all</code>, чтобы показать трассировку стека для каждого потока при достижении точки останова. </p><p>вы также можете распечатать ограниченное количество кадров стека, добавив в команду число, например <code>bt 10</code>.</p><p>узнайте больше здесь - <a href="https://www.bignerdranch.com/blog/xcode-breakpoint-wizardry/">https://www.bignerdranch.com/blog/xcode-breakpoint-wizardry/</a> </p>

<p>просто поместите синтаксис swift 4 на случай, если кому-то понадобится</p><pre><code>print("stack trace: \(thread.callstacksymbols)") </code></pre>