FaqProfilerAttachingToRunningAppJa
実行中のアプリケーションに接続して、アプリケーション全体のパフォーマンス解析を実行したいのですが、「プロファイラをアプリケーションに接続したあとに起動したスレッドのプロファイル結果しか、収集できません。」と言われてしまいます。なぜでしょうか。
これは、アプリケーションにすでに存在し、かつ、実行中のスレッドが、接続時には「匿名」の状態であるためです。たとえば、あるスレッドの呼び出しスタックがa()->b()->c()だったとします。アプリケーションがこれらすべてのメソッドをいつ呼び出したのか、または、これらのメソッドが以前に何かを呼び出したのか、ということは、その時点ではわかりません。そのため、通常は、CPU プロファイリングの結果として得られる呼び出しツリーを、構築することができません。整合性のある結果を得るためには、ツールは新しいスレッドが起動するのを待つ必要があるのです。
とはいえ、すでに実行中であるスレッドであっても、理論的には、単純にそのプロファイル結果を得ることは可能です。この結果には、プロファイラをアプリケーションに接続する前に起動された呼び出しのタイミングは含まれていません。そのため、プロファイル結果としては不完全なものになりますが、それでも役立つのではないかと考えられます。この機能は、将来のマイルストーンリリースの拡張機能のひとつとして実装する予定です。
~
