troushoo

WPR/WPA を用いてUI ハングの原因を調査


概要

UI ハングの原因を、Microsoft がフリーで公開しているWPR (Windows Performance Recorder) / WPA (Windows Performance Analyzer) を用いて調査する方法を紹介します。

内容

WPR / WPA のインストール
WPR / WPA は、Windows SDK に含まれております。
インストール時の「Select the features you want to install」の際に「Windows Performance Toolkit」にチェックを入れてください。


WPR / WPA を用いたUI バングの原因の調査
以下、2つのセクションに分けて、トラブルシューティング方法を紹介します。
1. WPR を用いて情報収集
2. WPA を用いて、収集した情報の解析

1. WPR を用いて情報収集
1.1. スタートメニューより「Windows Kits」→「Windows Performance Recorder」を起動します。


1.2. 以下の3つにチェックをいれて「Start」をクリックし、情報の収集を開始します。
a. First level triage
b. CPU usage
c. Desktop composition activity



1.3. UI ハングの状態を再現させます。


1.4. UI ハングの状態が解消されるのを待ちます。
ハングの状態が解消されるのを待たないと、今回紹介する方法は使用できません。


1.5. WPR の「Save」をクリックします。


1.6. 「Save」をクリックし、情報を保存します。


2. WPA を用いて、収集した情報の解析
2.1. 1.6. で保存したetl ファイルをダブルクリックし、WPA を起動します。


2.2. 「Trace」→「Load Symbols」を実行し、シンボルをロードします。


2.3. 「UI Delays」をダブルクリックします。
すると、UI がハングしていたプロセス (MyUIHang.exe) のスレッドID がわかります。ここでは「6,360」です。


2.4. 「Computation」を展開し「CPU Usage (Precise)」をダブルクリックします。


2.5. わかりやすさのため、UI ハングが起こったプロセスを右クリックし「Filter To Selection」を実行し、外套のプロセスのみ表示させるようにします。



2.6. なぜ、UI ハングが起こっていたのかを調べます。
「Readying Process」の「Readying Thread ID」が、「New Thread ID」の待ち状態を解除したスレッドとなります。
すなわち、「New Thread ID」は、「Readying Process」の「Readying Thread ID」の終了を待っていたことを意味します。

ハングしていたUI スレッドのID は、2.3. でわかっているので、そのスレッドID に対する「Readying Process」「Readying Thread ID」を見れば、なぜUI がハングしていたのかがわかります。ただし、複数表示されていることがわかります。


2.7. UI スレッドのハングにつながった処理を絞り込むため、表のタイトルを右クリックし「New Thread Stack」にチェックを入れます。
「New Thread Stack」は、ここでは、UI ハング時のコールスタックになります。


2.8. 今回はボタンクリック時にUI ハングになったので「New Thread Stack」選択時にCtrl + F をし「Click」で検索してみます。



2.9. UI ハングにつながったのコールスタックが見つかります。
「Waits (us) Max」の列を見ることで、このコールスタックにより、最長約 11.8 秒待っていたこともわかります。


2.10. 外套のコールスタックを展開していきます。
すると「Readying Process」が表示され、UI ハングを引き起こしたプロセス名がわかります。ここではFiddler でした。


2.11. 「Ready Thread Stack」の列を追加すると、待ち状態を解除したコールスタックがわかります。
ここでは、Fiddler のReturnResponse() が確認でき、レスポンス処理時に時間がかかっていたと想像ができます。


2.12. 今回用いたコードは以下です。
ボタンをクリックすると、HTTP のリクエストを行い、レスポンスを待つコードです。

private void button1_Click(object sender, EventArgs e)
{
    WebRequest request = WebRequest.Create("http://yahoo.co.jp");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
}

このHTTP のリクエストのレスポンス時に、Fiddler を用いてアプリにレスポンスを返さないようにしました。
(具体的な方法は次回のブログに記述します。)


情報元
Defrag Tools #156 - Critical Path Analysis with Windows Performance Analyzer (英語)

関連記事
WPR/WPA を用いた、アプリが何を待っているかを調べる方法
Windows 10 でOS 標準のツールとなったWPR.exe (Windows Performance Recorder)


  1. 2016/03/23(水) 23:46:12|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<Fiddler を用いて、Web サイトから応答がない状態を作り出す方法 | ホーム | Windows でプロセスをサスペンド/レジュームさせる2つの方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/281-844011a6
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (23)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する