yll*_*ate 14 macos xcode objective-c
我有一个专注于需要分析的应用程序的spindump集合,但我不确定如何分析这些.我见过一些其他的开发人员能够快速解析这些问题,无论是精神上还是软件,并回到我身边,详细了解挂起的地方等等,我希望能够理解如何正确分析这些.
人们去哪里正确分析轴?
Cha*_*roe 13
通常:
在两种情况下,您可能需要检查一个spindump:
第一种情况可以通过多次调用同一函数从spindump中看到.在这种情况下使用的好处是活动监视器 - 在那里获取挂起进程的样本,您可以通过几种有用的方式查看它,隐藏不重要的帧等.
第二种情况可以通过同时等待锁的不同线程来查看.
这是一个小例子:
+ 2663 start (in MyApp) + 52 [0x100001bb4]
+ 2663 main (in MyApp) + 39 [0x100001be7] main.m:65
+ 2663 NSApplicationMain (in AppKit) + 869 [0x7fff8ea27cb6]
+ 2663 -[NSApplication run] (in AppKit) + 517 [0x7fff8ea83283]
+ 2663 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] (in AppKit) + 128 [0x7fff8ea8bed2]
+ 2663 _DPSNextEvent (in AppKit) + 685 [0x7fff8ea8c613]
+ 2663 BlockUntilNextEventMatchingListInMode (in HIToolbox) + 62 [0x7fff8dd53cd3]
+ 2663 ReceiveNextEventCommon (in HIToolbox) + 356 [0x7fff8dd53e42]
+ 2663 RunCurrentEventLoopInMode (in HIToolbox) + 209 [0x7fff8dd540a4]
+ 2663 CFRunLoopRunSpecific (in CoreFoundation) + 290 [0x7fff95dec6b2]
+ 2557 __CFRunLoopRun (in CoreFoundation) + 1078 [0x7fff95decee6]
+ ! 2556 __CFRunLoopServiceMachPort (in CoreFoundation) + 195 [0x7fff95de7803]
+ ! : 2556 mach_msg (in libsystem_kernel.dylib) + 70 [0x7fff93630c42]
+ ! : 2556 mach_msg_trap (in libsystem_kernel.dylib) + 10 [0x7fff93631686]
+ ! 1 __CFRunLoopServiceMachPort (in CoreFoundation) + 199 [0x7fff95de7807]
+ 97 __CFRunLoopRun (in CoreFoundation) + 728 [0x7fff95decd88]
+ ! 97 __CFRunLoopDoObservers (in CoreFoundation) + 369 [0x7fff95e11921]
+ ! 97 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ (in CoreFoundation) + 23 [0x7fff95e119b7]
+ ! 97 __83-[NSWindow _postWindowNeedsDisplayOrLayoutOrUpdateConstraintsUnlessPostingDisabled]_block_invoke_01208 (in AppKit) + 46 [0x7fff8f05a971]
+ ! 90 _handleWindowNeedsDisplayOrLayoutOrUpdateConstraints (in AppKit) + 738 [0x7fff8ea8f2ac]
+ ! : 89 -[NSView displayIfNeeded] (in AppKit) + 1830 [0x7fff8ea8fd73]
Run Code Online (Sandbox Code Playgroud)
这告诉我的是,MyApp已经通过main等等,最后进入了一个函数CFRunLoopRunSpecific,然后__CFRunLoopRun- 从那里(2557)它调用__CFRunLoopServiceMachPort,调用mach_msg并进入陷阱mach_msg_trap(调用系统调用) - 当它返回时,堆栈跟踪返回CFRunLoopRunSpecific,__CFRunLoopRun调用的地方,然后调用__CFRunLoopDoObservers,依此类推.
请注意,这不是任何挂起过程的spindump - 您可以通过这种方式对任何正在运行的进程进行采样,并查看在该示例期间调用的函数.然而,无限循环会反复调用某些函数 - 反复出现相同的调用树.当然,这可能意味着一个简单的循环,但是如果for循环不是出于某种原因无限的话,那就是你可以检查的地方.不幸的是,这些自旋转储通常很长,取决于您调用的函数,因此可能需要一些时间来检查
行开头的+号只表示行的开头 - 没有+号的行表示新线程的开头.的!和:符号形成一条线,因此您更容易看到后续调用 - 即哪些调用处于同一级别.此外,| 字符也可以使用.
数字表示应用程序在该特定呼叫中花费的时间 - 它们在样本数量中.采样工作使得采样的应用程序每隔几毫秒暂停一次,并检查每个线程的堆栈帧.如果应用程序仍然使用相同的功能,则该功能将获得+1.
| 归档时间: |
|
| 查看次数: |
5116 次 |
| 最近记录: |