2012-05-22 18 views
11

私は、分析が必要なアプリに焦点を絞ったスポンサーの集まりを持っていますが、これらを分析する方法は正確にはわかりません。精神的にもソフトウェア的にもこれらを素早く解析して、どこにハングアップするのかといった詳細を私に戻すことができる他の開発者を見てきました。これらを適切に分析する方法を理解したいと思っています。震え解析の指示?

どこで拳銃を適切に分析するには?

+0

[Re:Symbolのない有用なサンプリング結果?](https://groups.google.com/d/msg/perfoptimization-dev/QmUB0Nd5asM/5EqAHC144wQJ) - Googleグループの[AppleのPerfOptimization対応の2011投稿] devメーリングリスト](http://lists.apple.com/archives/perfoptimization-dev/2011/Mar/msg00014.html)。 –

+0

私は開発者ではありませんが、私のような人たちには、スピンドンプ分析に関する疑問があることがよくあります。 –

答えて

9

:クラッシュレポートと

  • 、あなたはspindumpsでスタックトレース
  • を取得し、あなたは一緒に時間をかけて複数のスタックトレースを取得します。おそらく以上の同じ関数を呼び出すと、デッドロック
  • 上、

    1. 無限ループ:

あなたがspindumpを調べたいかもしれない2つの場合があります。

最初のケースは、同じ機能を何度も繰り返し呼び出すことによって、スピンポンプから見ることができます。このような状況で使用するのが良いことは、アクティビティモニターです。そこにハングしたプロセスのサンプルを取り込み、いくつかの有用な方法で表示したり、重要でないフレームを隠したりすることができます。

2番目のケースは、同時にロックします。ここで

は少しの例である:これは私に語っ

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

何、__CFRunLoopRunそして、MyAppをメインなどを経て、最終的に機能CFRunLoopRunSpecificに入ったことがある - そこから(2557年)、それが呼ばれます__CFRunLoopServiceMachPortmach_msgと呼ばれ、​​(システムコールを呼び出す)にトラップされました - スタックバックトレースはCFRunLoopRunSpecificに戻りました。__CFRunLoopRunが呼び出され、__CFRunLoopDoObserversなどが呼び出されました。

これはハンギングプロセスのスピンダンプではありません。実行中のプロセスをこの方法でサンプリングし、そのサンプル中にどの関数が呼び出されたかを確認できます。しかし、無限ループで何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も電話をかけていますもちろん、これはサイクルのための単純なことを意味することができますが、サイクルが何らかの理由で無限でない場合は、それを調べることができます。残念なことに、これらのスピンダンプは通常どのような機能を呼び出すかによってかなり長いため、調べるのに時間がかかることがあります

行の先頭にある+記号は、 +記号は新しいスレッドの開始を示します。 ! :記号が一行になっているので、後続のコール、つまりどのコールが同じレベルにあるのかを簡単に確認できます。さらに、|文字も使用できます。

数字は、その特定の通話でアプリが過ごした時間を意味します。数字はサンプル数です。サンプリングされたアプリケーションが数ミリ秒ごとに中断され、各スレッドのスタックフレームが調べられます。アプリがまだ同じ機能にある場合、その機能は+1になります。

+0

各行の数値ヘッダーをどのように解釈しますか? (+、!、:)を表す記号は何ですか?これらをより意味のある構文解析に役立てることができるソフトウェアメカニズムはありませんか?私は主に奇妙なハングを扱っており、これらのハングがどこから来ているのかを特定しようとしています。これは可能な限り親密に理解するのに非常に貴重ですが、現在のところ私は文脈から少し外れています。あなたの答えはあなたの例を考えれば分かります。問題を再現するときに、これらを正しく解釈するための欠けている部分がまだ残っていると感じます。 Hmm – ylluminate

+0

ソフトウェア開発のバックグラウンドのない読者の皆様:無限ループの例ですか、デッドロックですか? –

+0

+記号は単に行の先頭を示します。+記号のない行は新しいスレッドの開始を示します。 !そして:記号は単純に線を作るので、後続の呼び出し、つまりどの呼び出しが同じレベルにあるのかを簡単に見ることができます。さらに、|文字も使用できます。数字は、アプリがその特定の通話で費やした時間(おそらくミリ秒単位)を意味しますが、それは重要ではありません。 –

1

「Spindump」のMacデベロッパーリソースを検索したときにこれが見つかりました。 私は1つを見たことがないが、このテクニカルノートは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のマニュアルページ](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/spindump.8.html)では、ReportCrash(8 )。 –

+0

そして、スピンポンプページには、手動でサンプリングをトリガするユーティリティと、出力については何も記載されていません。 –

関連する問題