2012-05-22 3 views
11

나는 분석 할 필요가있는 앱에 중점을 둔 스핀들 수집을하고 있지만 이것들을 분석하는 방법을 정확하게 모르겠습니다. 나는 이들을 정신적으로 또는 소프트웨어로 빠르게 파싱 할 수있는 다른 개발자를 보았고, 중단되는 부분에 대한 세부 정보를 가지고 나와 다시 올 수 있었다. 그리고 나는 이것을 적절히 분석하는 방법을 이해하기를 바라고있다.스핀들 펌프 분석 지침?

어디에서 스핀들을 올바르게 분석 할 수 있습니까?

+0

[Re : 기호가없는 유용한 샘플링 결과?] (https://groups.google.com/d/msg/perfoptimization-dev/QmUB0Nd5asM/5EqAHC144wQJ) - [Apple의 PerfOptimization- dev 메일 링리스트] (http://lists.apple.com/archives/perfoptimization-dev/2011/Mar/msg00014.html). –

+0

저는 개발자가 아니지만 자주 저와 같은 사람들이 스핀들 펌프 분석에 궁금해하는 것을 보았습니다 - 따라서 최근의 현상금. –

답변

9

: 충돌 보고서를

  • , 당신은 당신이 함께 일정 기간 동안 여러 스택 트레이스를 얻을 spindumps와 스택 추적
  • 를 얻을. 아마를 통해 동일한 기능을 호출하고 교착 상태
  • 이상,

    1. 무한 루프 :

당신이 spindump를 검사 할 수있는 두 가지 경우가 있습니다.

첫 번째 경우는 같은 기능을 여러 번 반복 호출하여 스핀들 펌프에서 볼 수 있습니다. 그러한 상황에서 사용할 좋은 점은 활동 모니터입니다. 거기에 걸려있는 프로세스 샘플을 가져 와서 몇 가지 유용한 방법으로 중요하지 않은 프레임을 숨길 수 있습니다.

두 번째 대소 문자는 대기중인 다른 스레드에서 볼 수 있습니다 동시에 자물쇠. 여기

약간의 예입니다 : 어떤이는 나에게 말한다하는 MyApp를 등, 주요 거쳐 최종적으로 __CFRunLoopRun 다음, 함수 CFRunLoopRunSpecific으로 들어간 것입니다

+ 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] 

- 거기에서 (2557)이라는 __CFRunLoopServiceMachPortmach_msg을 호출하고 mach_msg_trap (시스템 호출)에서 트랩을 얻었습니다. 돌아 왔을 때 스택 추적은 CFRunLoopRunSpecific으로 돌아 왔고 __CFRunLoopRun이 호출되어 __CFRunLoopDoObservers 등이 호출되었습니다.

이것은 정지 프로세스의 스핀들이 아닙니다. 실행중인 프로세스를이 방법으로 샘플링하고 해당 샘플에서 호출 된 함수를 볼 수 있습니다. 그러나 무한 루프는 반복적으로 어떤 함수에 반복적으로 호출 할 것이며 동일한 호출 트리가 계속해서 반복 될 것입니다. 물론 이것은 사이클에 대한 간단한 것을 의미 할 수 있습니다. 그러나 그 사이클이 어떤 이유로 무한한 것이 아니라면, 여러분이 조사 할 수있는 곳입니다.불행히도 이러한 스핀 덤프는 호출하는 기능에 따라 상당히 길기 때문에 검사하는 데 약간의 시간이 걸릴 수 있습니다.

행의 시작 부분에있는 + 표시는 단순히 행의 시작을 나타냅니다. + 기호는 새 스레드의 시작을 나타냅니다. 그! 및 : 표지판은 줄을 긋기 때문에 후속 통화 (예 : 어떤 통화가 같은 수준인지)를보다 쉽게 ​​확인할 수 있습니다. 또한, | 문자도 사용할 수 있습니다.

숫자는 해당 특정 통화에서 앱이 소비 한 시간을 나타내며 샘플 개수입니다. 샘플링은 샘플링 된 앱이 몇 밀리 초마다 일시 중지되고 스택 프레임이 각 스레드를 검사합니다. 앱이 여전히 동일한 기능을 수행하면 +1 기능을 사용합니다.

+0

각 행의 숫자 헤더를 어떻게 해석합니까? (+,!, :)을 나타내는 기호는 무엇입니까? 이 소프트웨어를 통해 전달할 수있는 소프트웨어 메커니즘이 없으므로 이러한 의미있는 분석이 가능합니다. 나는 주로 이상한 응답을 처리하고 있으며 이러한 응답이 어디에서 오는 것인지를 파악하려고 시도하고있다. 이것은 가능한 한 친밀한 것으로 이해하는 것이 매우 중요하지만 현재는 약간의 시간차가 있기 때문에 약간의 맥락에서 벗어납니다. 당신의 답은 당신의 모범을 바탕으로 합리적입니다. 문제가 다시 발생했을 때 제대로 해석하지 못한 부분이 있습니다. Hmm – ylluminate

+0

소프트웨어 개발 배경이없는 독자 : 제발, 무한 루프 또는 교착 상태의 예가 무엇입니까? –

+0

+ 기호는 단순히 줄의 시작을 나타냅니다. + 기호가없는 줄은 새 줄의 시작을 나타냅니다. 그! 및 : 부호는 단순히 선을 만듦으로써 후속 통화 (예 : 어떤 통화가 같은 수준인지)를보다 쉽게 ​​볼 수 있습니다. 또한, | 문자도 사용할 수 있습니다. 숫자는 응용 프로그램이 특정 호출에서 보낸 시간을 의미합니다. 밀리 초 단위 일 수도 있지만 중요한 것은 아닙니다. –

1

Mac 개발자 리소스에서 '스핀들 펌프'를 검색 할 때 발견되었습니다. 은 내가 하나를 본 적이 있지만,이 기술은 ReportCrash (8) 매뉴얼 페이지는 충돌 로그를 읽는 방법을 보여 것 같습니다에 언급 :

https://developer.apple.com/library/mac/#technotes/tn2004/tn2123.html

그리고 ReportCrash (8) Spindump 함 (8), 사과드립니다. https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/ReportCrash.8.html

하지만 이것은 분명 도움이되지 않습니다. 나는 그것을 여기에 그냥 둘 것이다.

누군가가 도움이 되었기를 바랍니다. 일반적으로

+0

크래시에는 유용하지만 스핀들 펌프에는 유용하지 않습니다. Apple의 [spindump (8) OS X Manual Page] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/spindump.8.html)은 ReportCrash (8). –

+0

그리고 스핀들 펌프 페이지는 샘플링을 수동으로 트리거하는 유틸리티만을 설명하고 출력에 대해서는 설명하지 않습니다. –