<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>d99@Microsoft</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/d99/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/d99/feed.xml</link>
    <description>Azure AppService, ASP.NET, IIS などの Web 系トラブル シューティングにまつわるアレコレについてお届けします</description>
    <lastBuildDate>Mon, 18 Dec 2017 12:14:44 GMT</lastBuildDate>
    <language>ja</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>[Advent Calendar 2017 Day18] Azure Web Apps パフォーマンスチューニング</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/azure-web-apps-perf</link>
      <pubDate>Mon, 18 Dec 2017 20:56:54 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/?p=565</guid>
      <description><![CDATA[こちらの記事は、Qiita に掲載した Microsoft Azure Tech Advent Calendar 2017...]]></description>
      <content:encoded><![CDATA[<div style="background-color: #fcf8e3;border-color: #faebcc;color: #8a6d3b;border: 1px solid transparent">こちらの記事は、Qiita に掲載した Microsoft Azure Tech Advent Calendar 2017 の企画に基づき、執筆した内容となります。
カレンダーに掲載された記事の一覧は、<a href="https://qiita.com/advent-calendar/2017/microsoft-azure-tech">こちら</a>よりご確認ください。</div>
&nbsp;

こんにちは。
<span>d</span><span>99 </span><span>です。</span>

<span>今回は</span> <span>Azure</span> <span>のアドベントカレンダーという事で、Azure</span> <span>で動く</span> <span>Web</span> <span>アプリケーションのパフォーマンスボトルネックを見つける手順をご紹介します。</span>

&nbsp;
<h3><span>1)</span> <span>Azure</span> <span>で簡単な</span> <span>php</span> <span>コードを動かす</span></h3>
<span>まずは、Azure</span> <span>App</span> <span>Service</span> <span>を作成し、以下のような</span> <span>sleep.php</span> <span>を置きました。パッと見て分かる通り、QueryString</span> <span>に</span> <span>id=3</span> <span>と渡されたら5秒スリープする、というコードです。既に種明かししてますが。</span>

[php]
&amp;lt;?php
if ( $_REQUEST['id'] == 3) {
     sleep(5);
     echo('sleeped');
} else {
     echo('done');
} ?&amp;gt;
[/php]

<span>この程度のファイルを配置するのであれば、kudu</span> <span>コンソール（https://&lt;Web</span> <span>Apps</span> <span>名&gt;.scm.azurewebsites.net/DebugConsole</span> <span>にアクセスし、D:\home\site\wwwroot</span> <span>に移動してから、上の</span> <span>[+]</span> <span>マークから</span> <span>[New</span> <span>file]</span> <span>を選択してファイル作成、鉛筆マークの</span> <span>[Edit]</span> <span>アイコンから直接書いてしまうのが簡単だと思います。</span>

私は、デスクトップにエディタでさらさらっと書いて、下記赤枠のところにポイっとドラッグ・アンド・ドロップしました。

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/147-e1513597861750.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/147-e1513597861750.png" alt="" width="858" height="286" class="alignnone size-full wp-image-575" /></a><a href="https://msdnshared.blob.core.windows.net/media/2017/12/147.png"></a>

&nbsp;
<h3><span>2)</span> <span>クライアントからリクエストを送る</span></h3>
<span>次にクライアントからリクエストを送りまくります。今回は</span> <span>C#</span> <span>の</span> <span>コンソール</span> <span>アプリケーションで以下のような簡単なコードを書いて、毎秒ごとにパラメーター</span> <span>id</span> <span>をずらしながら、60秒間リクエストを送ってみます。</span>

[c language="#"]
while (starttime.AddSeconds(60 * 1000) &amp;gt; DateTime.Now)
{
     System.Net.Http.HttpClient h = new HttpClient();
     uri = new System.Uri(args[0] + &quot;?id=&quot; + (DateTime.Now.Second % 4).ToString());
     var r = h.GetAsync(uri);
     r.Wait();
     Console.WriteLine(r.Result.StatusCode);
     System.Threading.Thread.Sleep(1000);
}
[/c]

&nbsp;
<h3><span>3)</span> <span>ETW</span> <span>を採取する</span></h3>
<span>sleep.php</span> <span>やコンソールアプリケーションがきちんと動く事を確認したら、コンソールアプリケーションを動かしながら</span> <span>ETW</span> <span>トレースを取ってみましょう。</span>

&nbsp;

<span>テスト段階で</span> <span>PHP</span> <span>のホストプロセス、php-cgi.exe</span> <span>は起動していると思うので、kudu</span> <span>の</span> <span>Process</span> <span>Explorer（https://&lt;Web</span> <span>Apps</span> <span>名&gt;.scm.azurewebsites.net/ProcessExplorer/）を表示すると、php-cgi.exe</span> <span>が見えると思います。[Collect</span> <span>IIS</span> <span>Events]</span> <span>にチェックを入れた上で、[Start</span> <span>Profiling]</span> <span>をクリックします。そして、コンソールアプリケーションからリクエストを送りまくりましょう。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/230.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/230-1024x270.png" alt="" width="1024" height="270" class="alignnone wp-image-585 size-large" /></a>

<span>なお、以下のような注意書きが出ますのでご確認頂いた上で、[Yes]</span> <span>をクリックします。この後、[Start</span> <span>…</span><span>] </span><span>が</span> <span>[Stop</span> <span>Profiling]</span> <span>に変わり、色が赤くなりますので、コンソールアプリケーションを一分ほど動作させたら、そちらをクリックして止めます。少し待つと、～.diagsession</span> <span>というファイルがダウンロード出来ますので、ローカルに保存します。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/320.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/320.png" alt="" width="452" height="332" class="alignnone wp-image-587 size-full" /></a>

&nbsp;
<h3><span>4)</span> <span>遅いリクエストを見つける</span></h3>
<span>ETW</span> <span>の解析には、PerfView</span> <span>を使用します。以下からダウンロードして展開します。</span>
<p style="padding-left: 30px">PerfView
<a href="https://www.microsoft.com/en-us/download/details.aspx?id=28567">https://www.microsoft.com/en-us/download/details.aspx?id=28567</a></p>
<span>PerfView</span> <span>の使い方は以下を見てみてください</span> <span>:-)</span>
<p style="padding-left: 30px"><span>PerfView Tutorial</span><span>（英語）
</span><a href="https://channel9.msdn.com/Series/PerfView-Tutorial"><span>https://channel9.msdn.com/Series/PerfView-Tutorial</span></a></p>
<p style="padding-left: 30px"><span>ハードコア デバッギング～</span><span>Windows </span><span>のアプリケーション運用トラブルシューティング実践
</span><a href="https://channel9.msdn.com/events/de-code/2017/MR15">https://channel9.msdn.com/events/de-code/2017/MR15</a></p>
<span>今回の場合は、まず</span> <span>PerfView</span> <span>の左側ツールで</span> <span>.diagsession</span> <span>ファイルが置かれたフォルダまで移動し、当該ファイルをダブルクリックします。少し待つと</span> <span>.etl</span> <span>が展開されますので、その中の</span> <span>[Events]</span> <span>をダブルクリックします。取得された</span> <span>ETW</span> <span>のイベントが全てここで確認出来ます。</span>

<span>左側の</span> <span>[Event</span> <span>Types]</span> <span>で</span> <span>[</span><span>IIS_Trace/IISGeneral/GENERAL_REQUEST_START</span><span>]</span> <span>をクリック、さらに</span> <span>Ctrl</span> <span>を押しながら</span> <span>[</span><span>IIS_Trace/IISGeneral/GENERAL_REQUEST_</span><span>END]</span> <span>をクリックしてから、Enter</span> <span>キーを押します。これが、リクエストの入りと出の一覧なのですが、これだとなんだかわかりませんね。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/417.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/417-1024x506.png" alt="" width="1024" height="506" class="alignnone wp-image-596 size-large" /></a>

<span>右上の</span> <span>[Cols]</span> <span>をクリックし、Ctrl</span> <span>を押しながら、ContextId、DURATIOIN_MSEC、RequestURL、ThreadID</span> <span>をクリックしていき、最後に</span> <span>Enter</span> <span>を押します。すると、DURATION_MSEC</span> <span>つまり経過時間（ミリ秒）が別欄になりますのでわかりやすくなります。ざーっとスクロールしていくと。。。ありました。5,000</span> <span>ミリ秒、つまり</span> <span>5秒</span> <span>かかっているリクエストです。ContextId</span> <span>がリクエストに付けられる一意な</span> <span>ID</span> <span>ですので、少し上の</span> <span>START</span> <span>と見比べると、sleep.php?id=3</span> <span>の処理、という事が分かります。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/516.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/516-1024x358.png" alt="" width="1024" height="358" class="alignnone wp-image-605 size-large" /></a>

<span>さらに追い込みます。その列の</span> <span>ContextId</span> <span>をクリックしてコピー、上部</span> <span>[Text</span> <span>Filter]</span> <span>にペーストします。Cols</span> <span>の右の内容を消した上で、さらに、左側では</span> <span>IIS_Trace</span> <span>で始まるものをすべて、Shift</span> <span>キーを押しながら範囲選択して</span> <span>Enter</span> <span>を押します。ここで出てくるのは、IIS</span> <span>の</span> <span>[失敗した]</span> <span>要求トレース、とほぼ同じものですので、リクエストが入り乱れている場合などは、遅延している</span> <span>URL</span> <span>は何かといった点もここで突き止められます。さて、[Time</span> <span>MSEC]、つまり、ETW</span> <span>を採取開始してからのミリ秒がぽんと飛んでいる箇所があります。ここが問題の場所ですね。今回は</span> <span>PHP</span> <span>なので、php-cgi.exe</span> <span>でこの期間に何をやっていたのかを追いましょう。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/613.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/613-1024x326.png" alt="" width="1024" height="326" class="alignnone wp-image-615 size-large" /></a>

&nbsp;
<h3><span>5)</span> <span>遅いリクエストの遅い処理（ボトルネック）を見つける</span></h3>
<span>PerfView</span> <span>のメインウィンドウに戻り、今度は</span> <span>[Events]</span> <span>ではなくて、[Thread</span> <span>Time</span> <span>(with</span> <span>StartStop</span> <span>Activities)</span> <span>Stacks]</span> <span>をダブルクリックしましょう。プロセスを選ぶウィンドウでは</span> <span>php-cgi</span> <span>をダブルクリックします。全時間範囲を見てもさっぱりなので、まずは時間範囲を絞ります。先程の</span> <span>FASTCGI_START</span> <span>の</span> <span>Time</span><span> MSec </span><span>を上部</span> <span>[Start]</span> <span>に、FASTCGI_END</span> <span>の</span> <span>Time</span><span> Mse</span><span>c</span> <span>を</span> <span>[End]</span> <span>にコピペし、さらに　[GroupPats]</span> <span>を空にして</span> <span>Enter</span> <span>を押します。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/79.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/79-1024x176.png" alt="" width="1024" height="176" class="alignnone wp-image-625 size-large" /></a>

<span>毎ミリ秒のスタックが記録されているので、ここから</span> <span>BROKEN</span> <span>を展開していくのですが、その前にシンボルを合わせておきましょう。</span><span>Kudu </span><span>コンソールで</span> <span>D:\</span> <span>に上がり、"dir</span> <span>/s</span> <span>/b</span> <span>php-cgi.pdb"</span> <span>を検索すると、D:\Program Files (x86)\PHP\v5.6\debug\</span> <span>にある事が分かります。使用している</span> <span>PHP</span> <span>バージョンに合わせて</span> <span>php-cgi.pdb</span> <span>とphp5.pdb</span> <span>などの</span> <span>PHP</span> <span>主要モジュールの</span> <span>シンボルファイルをダウンロードし、適当なフォルダに入れます。Thread</span> <span>Time</span> <span>…</span> <span>のウィンドウ、[File]</span> <span>メニューから</span> <span>[Set</span> <span>Symbol</span> <span>Path]</span> <span>を選択します。表示されたダイアログで</span> <span>[Add</span><span> Microsoft Symbol Server</span><span>]</span> <span>をクリックした上で、.pdb</span> <span>をダウンロードしたフォルダを最初の列に記入します（セミコロンがデリミタになります）。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/88.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/88.png" alt="" width="584" height="240" class="alignnone wp-image-635 size-full" /></a>

<span>では、BROKEN</span> <span>から展開していきましょう。BROKEN</span> <span>は本来、スタック壊れているよ、という意味なのですが、まぁ往々にしてその下も展開できます。もし</span> <span>&lt;モジュール名&gt;?</span> <span>となってしまって関数が出ない場合は、そこを右クリックして、[Lookup</span> <span>Symbols]</span> <span>を選んでください。</span>

<a href="https://msdnshared.blob.core.windows.net/media/2017/12/99.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/12/99-1024x272.png" alt="" width="1024" height="272" class="alignnone size-large wp-image-645" /></a>

<span>もう一目瞭然ですね。p</span><span>hp5</span><span>.dll</span> <span>の</span> <span>zif_sleep()</span> <span>から、Windows</span> <span>の</span> <span>SleepEx()</span> <span>が呼ばれています。ポイントは、右の</span> <span>Inc</span> <span>%、つまり、この7.6</span> <span>秒後から、12.7</span> <span>秒後までの凡そ5秒間、このスレッドでは</span> <span>99%</span> <span>の時間、ずっとスリープしてた、という事を示しています。</span>

&nbsp;

今回は以上となります。

<span>本来はこんなシンプルな問題にはならないと思いますが、このように</span> <span>ETW</span> <span>+</span> <span>PerfView</span> <span>はかなり細かいところまで追い込めます。これが</span> <span>ASP.NET</span> <span>なら、さらに例外のスタックを引っ張り出したりなどもお手のもの。今回はあえて</span> <span>PHP</span> <span>でやってみました（なお、Java</span> <span>はシンボルが無いのであまり細かいところまでは追い込めません。Application</span> <span>Insights</span> <span>などの方がいいかもしれませんね）。</span>

皆様のお役に立てば嬉しいです。

ではまた。
<span>d</span><span>99 </span><span>でした。</span>]]></content:encoded>
    </item>
    <item>
      <title>[お知らせ] de:code に登壇します</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/decode2017</link>
      <pubDate>Wed, 17 May 2017 22:27:03 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/?p=555</guid>
      <description><![CDATA[こんにちは、d99 です。

そういえば blog をまったく更新しておりませんでした。この blog...]]></description>
      <content:encoded><![CDATA[こんにちは、d99 です。

そういえば blog をまったく更新しておりませんでした。この blog のダッシュボードを開きましたら、いささか賞味期限の切れた下書きエントリが並んでおり、先ほど泣く泣く消しました。ASP.NET Web フォームと IE11 とか、ASP.NET セッション状態と Redis とか... POSTするとしても全部リライトですね。いやはや...

さて、今回なぜ久しぶりに blog を書こうと思ったかというと表題の通りです。そして、ネットを徘徊しておりましたら atsushieno さんが以下のように私たちのセッション、「<a href="https://www.microsoft.com/ja-jp/events/decode/2017/sessions.aspx#MR15">ハードコア デバッギング～Windows のアプリケーション運用トラブルシューティング実践</a>」に言及してくださっており、こ、これは！と久しぶりに blog を書こうかなと思った次第です。
<blockquote><a href="http://atsushieno.hatenablog.com/entry/2017/05/10/152204">（お知らせ） Xamarinを支える技術 at de:code2017</a>
わたしの裏番組でやっている<a href="https://www.microsoft.com/ja-jp/events/decode/2017/sessions.aspx#MR15">Windowsアプリケーションの実践的なデバッグ・トラブルシューティング手法などが紹介されるセッション</a>に興味があるわけですが</blockquote>
上記エントリで言及されているように、セッションにはセッションレベルがあり、私たちもレベル500に設定してみました。<a href="http://ascii.jp/elem/000/001/474/1474081/">澤さん</a>にセッション内容をレビューして頂いたのですが、「君たちのセッションは変態による変態のためのセッションですからまぁ頑張ってください」という、激励なのか諦観なのか反応に困るようなコメントを頂いております。hahaha

&nbsp;

問題が二つ。

&nbsp;

まず、我々サポートのエンジニアは日の当たるところにあまり出てきません。
まぁまったくゼロではないんですが、基本的には地下のモルグ<span style="color: #999999">（品川の某フロア）</span>から一日中一歩も出ることなく、次々と運ばれてくるシステムやアプリケーションのご遺体<span style="color: #999999">（ダンプとかトレースとか）</span>を、検死<span style="color: #999999">（解析とかデバッグとか）</span>し続けているという、ハタから見たら何が面白いのか全く分からないであろうことに血道を上げております。

そういえば先日、社内でデバッグ好きが集まるグローバルグループがありまして、そこに一通のメールが流れてきました。

「ヘイ！みんな！このダンプなんだけど、原因がわかんないんだよ、手伝ってよ！（英語」みたいな感じ。次々とレスが付きます。「えー、俺、この製品のシンボル持ってないわー、だれか持ってるー？（英語」「それならここだよー、アクセスできるかーい？（英語」「で、これって現象なんなのー？（私」「高 CPU さー（英語」みたいな。

どうやら XML のパースが繰り返されてるっぽいと、もっと調べるにはダンプだけじゃ無理でこのあたりのトレースが必要だろうと、そんな感じでおおよその目星がついたところで、一人がある疑問を口にします。「ところでこれ、なんの案件なの？」

<em>「いや、俺の Outlook」</em>

。。。普通なら怒りますよね。なんでお前の Outlook（+ 見たことないカスタムアドインたくさん）をみんなでデバッグしてやってんのかと。でもさらにレスが続きます。「あ、マジで？俺も最近重くてさー、発生条件分かるー？」「あ、俺も俺も。このアドインじゃね？」 ... 変な人たちです。トラブルを見たらデバッグしてみたいという欲望に勝てないという。自分のマシンがブルースクリーンになったら揉み手でフルダンプ出るのを待ってるみたいな。私もそんな中でわちゃわちゃとやっております。

話がだいぶ脱線しましたが、そんな私たちですので、たくさんの人の前でスポットライト浴びて話すのは、あんまり慣れておりません。私自身も、最後に大型イベントに登壇したのは 2000年の TechED だったかな、というレベルです。それ以来長～いことモルグに籠ってわちゃわちゃとやっておりましたのでｗ、セッションにご参加頂ける皆様方には、何卒お手柔らかにお願いします。

&nbsp;

もう一つの問題ですが、<a href="https://www.microsoft.com/ja-jp/events/decode/2017/sessions.aspx#MR15">セッションの 紹介</a> をパッと見ておわかりいただけるかと思いますが、4人もの人間が入れ代わり立ち代わりで計50分のお話をします。しかも濃い目のネタを。まー、どう考えても時間が足りない！ですのでとにかくデモでパッと見てイメージできるような構成でお送りしたいと思います。私は順番的には最後なのですが、とにかく時間通りに進むように、私の番になったら残り時間2分、なんてことにならないようにと祈っております... 一部の内容については、後日この blog にも掲載しようかと思っておりますので、お楽しみに。

&nbsp;

私たちサポートエンジニアは、開発や運用、設計といった事自体は専門ではありません。しかし、トラブルシューティングについては、毎日毎日たくさんたくさん頂くお問い合わせで、かなり、鍛えられています。

どうやらこの製品には仕様書があるらしいと見てみると、内容は "I have a dream" レベルの夢物語。。。「実装に即したもんを持ってこい！」と開発に詰め寄ると、そっと差し出されるソースコードレポジトリのパスとプライベートシンボル。。。あーはいはいわかりましたよ、データベースだかWebサーバーだかアプリケーションだかツールだか知りませんが、所詮プロセスでしょプロセス。デバッグ＆リバースエンジニアリングしてやろうじゃないですか！あるものはおもむろにデバッガをアタッチ、あるものはレポジトリから膨大なソースコードを漁り始める。。。

そんな血沸き肉躍るエンターテイメント、、、をセッションでお話するわけではないんですが（上記の内容はあくまでフィクションであり、実際の個人・団体などには関係しません）、私たちの経験から、何か皆様のお役に立つお話が出来ればと思っています。

&nbsp;

なお、私はこの春から、正式に Azure のサポートチームに移り、AppService などの PaaS などなどについてもサポートを担当しています。しばやんさんの下記セッションは個人的にとても楽しみにしています。雲の上にもモルグがあるかはさておき、これからも当 blog をよろしくお願いいたします。
<blockquote><a href="http://blog.shibayan.jp/entry/20170516/1494939398">App Service on Linux の最新アップデートと de:code で久し振りにセッションをする話</a></blockquote>
ではまた。
d99 でした。]]></content:encoded>
    </item>
    <item>
      <title>IE10, IE11 でダウンロードに失敗する事象について</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/ie10-ie11</link>
      <pubDate>Tue, 10 Nov 2015 00:56:13 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2015/11/10/ie10-ie11/</guid>
      <description><![CDATA[こんにちは。d99 です。最近、Web アプリケーションで対象 IE...]]></description>
      <content:encoded><![CDATA[<p>こんにちは。d99 です。<br />最近、Web アプリケーションで対象 IE バージョンの移行を検討されているお客様が多いようで、以下のお問合せが増えてきているため、ご紹介します。</p>
<p>&nbsp;</p>
<h4>事象</h4>
<p>ASP.NET で作成されたファイルダウンロードページで、IE9 まででは問題なくダウンロードできたのに、IE10 以降では「（ファイル名）がダウンロードできませんでした」とエラーになります。</p>
<h4>詳細</h4>
<p>後述の原因に合致する場合、当該ファイルダウンロードページでは Response.Close() が使用されています。これを Response.End() に置き換えるとエラーが発生しなくなります。</p>
<p>Response.Close() は TCP 接続を強制的に切断するメソッドで、クライアントに対して正しい応答を返すためには一般的には使用されません（クライアントからの悪意のある要求に対して応答せずに接続を切断する、といった場合に使用されます）。Response.End() は ASP との互換のために残されているメソッドではありますが、応答の終了というイメージに近い動作を行います（この際、HttpModule 等、処理パイプライン全体に処理を中断したことを通知するため ThreadAbortException が発報されます）。</p>
<p style="padding-left: 30px;">HttpResponse<span>.</span>Close メソッド <span>()</span><br /><a href="https://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.close(v=vs.110).aspx">https://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.close(v=vs.110).aspx</a></p>
<p style="padding-left: 30px;">HttpResponse<span>.</span>End メソッド <span>()</span><br /><a href="https://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.end(v=vs.110).aspx">https://msdn.microsoft.com/ja-jp/library/system.web.httpresponse.end(v=vs.110).aspx</a></p>
<h4>原因</h4>
<p>当該現象は、下記ブログの記事に該当していると考えられます。</p>
<p style="padding-left: 30px;">IEInternals : Content-Length and Transfer-Encoding Validation in theIE10 Download Manager <br /><a class="linkified" href="http://blogs.msdn.com/b/ieinternals/archive/2012/07/16/content-length-and-transfer-encoding-validation-in-ie10-download-manager-couldnt-be-downloaded-retry-cancel.aspx" rel="nofollow noreferrer" target="_blank">http://blogs.msdn.com/b/ieinternals/archive/2012/07/16/content-length-and-transfer-encoding-validation-in-ie10-download-manager-couldnt-be-downloaded-retry-cancel.aspx</a></p>
<p><br />IE9 までは、サーバーからのレスポンスにヘッダー Content-Length が含まれない場合や、"Transfer-Encoding:chunked" が指定されている場合であっても転送データのサイズや終端のチェックを厳密に行っていませんでした。</p>
<p>しかし、IE10 以降のダウンロードマネージャーでは、厳密にチェックを行うよう動作が変更されました。この変更により、レスポンスヘッダーにContent-Length が含まれない場合や、チャンク転送でありながら転送データの終端を示す 0-sized chunk が含まれていない場合にはダウンロードを中断し、情報バーに 「（ファイル名） をダウンロードできませんでした。」を表示します。</p>
<h4>対処</h4>
<p>前述のとおり、Response.Close() は、クライアントとの TCP 接続を強制切断するメソッドになりますので、0-sized chunk は含まれません。しかし、Response.End() であれば、0-sized chunk が含まれますので、有効な対処となります。もし、Response.End() に伴う ThreadAbortException を発生させたくない場合は、HttpApplication.CompleteRequest() をご利用ください。この場合、処理パイプラインを EndRequest まで進めます。</p>
<p style="padding-left: 30px;">HttpApplication<span>.</span>CompleteRequest メソッド <span>()</span><br /><a href="https://msdn.microsoft.com/ja-jp/library/system.web.httpapplication.completerequest(v=vs.110).aspx">https://msdn.microsoft.com/ja-jp/library/system.web.httpapplication.completerequest(v=vs.110).aspx</a></p>
<p>ただし、.aspx 等、応答を返すページハンドラにダウンロードを実装されている場合、HttpApplication.CompleteRequest() ではページコンテンツのレンダリングが避けられません。その場合該当ページの Render と RaisePostBackEvent をオーバーライドし、ダウンロード動作の際には基底クラスの同メソッドを呼び出さない事でこれを避ける事が出来ます。</p>
<p>なお、その他の方法としては、ダウンロード専用のカスタムハンドラを作成するといったものが考えられます。</p>
<p>&nbsp;</p>
<p>以上です。古い IE の方がいい加減だった、という事例ですね :-)</p>
<p>ではまた。 <br />d99でした。&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>[ご注意ください] 12月10日に Windows Update で配信された Visual Studio 2012 対象の更新プログラム KB3002339 をインストールするとシステムのハングアップなどの問題が発生する</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/1210-windows-update-visual-studio-2012-263</link>
      <pubDate>Tue, 09 Dec 2014 23:14:59 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2014/12/09/1210-windows-update-visual-studio-2012-263/</guid>
      <description><![CDATA[※本件は、Visual Studio サポートチームのブログの転載となります。
2014 年 12 月 10 日に公開され、Windows Update で配信された Visual Studio...]]></description>
      <content:encoded><![CDATA[<p>※本件は、Visual Studio サポートチームのブログの転載となります。</p>
<p>2014 年 12 月 10 日に公開され、Windows Update で配信された Visual Studio 2012 対象の KB3002339 の更新プログラムをインストールすると、Windows Update が完了しない、システム再起動時に更新が完了せずシステムがハングアップしてしまうという現象が発生することを確認いたしました。</p>
<p style="padding-left: 30px;">KB3002339<br /><a href="https://support.microsoft.com/kb/3002339/">https://support.microsoft.com/kb/3002339/</a>&nbsp;</p>
<p>本問題の報告を受け、Windows Update の配信は既に停止いたしましたが、Windows Server Update Services (WSUS) を使用して更新プログラムを配信されているお客様におかれましては、本更新プログラムの配信を停止していただけますようお願い申し上げます。</p>
<p>既に本更新プログラムを適用し、ハングアップなどの現象が発生している環境での復旧方法につきましては、現在調査中です。進展があり次第、Visual Studio チーム記事にて情報公開させていただきます。最新の内容は下記 Visual Studio チームブログをご覧ください。</p>
<p style="padding-left: 30px;">Visual Studio サポートチームブログ - [ご注意ください] 12 月 10 日に Windows Update で配信された Visual Studio 2012 対象の更新プログラム KB3002339 をインストールするとシステムのハングアップなどの問題が発生する<br /><a href="http://blogs.msdn.com/b/jpvsblog/archive/2014/12/10/12-10-windows-update-visual-studio-2012-kb3002339.aspx">http://blogs.msdn.com/b/jpvsblog/archive/2014/12/10/12-10-windows-update-visual-studio-2012-kb3002339.aspx</a></p>
<p>お客様には多大なご迷惑をおかけしておりますこと、深くお詫び申し上げます。</p>]]></content:encoded>
    </item>
    <item>
      <title>セキュリティ更新プログラム MS14-059 によって ASP.NET MVC のビルドに問題が生じる</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/ms14-059-asp-net-mvc</link>
      <pubDate>Thu, 23 Oct 2014 01:10:00 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2014/10/23/ms14-059-asp-net-mvc/</guid>
      <description><![CDATA[こんにちは。d99 です。今回は下記 blog の日本語参考訳を掲載します。
Microsoft Asp.Net MVC Security Update MS14-059 broke my...]]></description>
      <content:encoded><![CDATA[<p align="left">こんにちは。d99 です。<br />今回は下記 blog の日本語参考訳を掲載します。</p>
<p style="padding-left: 30px;" align="left">Microsoft Asp.Net MVC Security Update MS14-059 broke my build!<br /><a href="http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx">http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx</a></p>
<p align="left">------</p>
<p align="left">先日マイクロソフトは新しいセキュリティ更新プログラム（MS14-059）をリリースしました。本更新プログラムは、Microsoft Update を使用するよう構成された環境に対して自動的に適用されます。該当のセキュリティ更新プログラムに関する情報はこちらです： <span style="text-decoration: underline;"><a href="https://technet.microsoft.com/ja-jp/library/security/ms14-059">https://technet.microsoft.com/ja-jp/library/security/ms14-059</a></span></p>
<p align="left">残念ながら、本更新プログラムの適用によって、ASP.NET MVC3, 4 を使用した Web アプリケーションプロジェクトで、ビルドに失敗するようになります。失敗する際のエラーは以下の通りです（MVC4 の場合）。</p>
<p style="padding-left: 30px;" align="left">アセンブリが見つかりませんでした"System.Web.Mvc,Version=4.0.0.0、Culture=neurtral,<br />PublicKeyToken=31bf3856ad364e35、processorArchitecture=MSIL</p>
<p align="left">このエラーは、該当のプロジェクトがグローバルアセンブリキャッシュ（GAC）にあるアセンブリを参照する際に発生します。セキュリティ更新プログラムによって System.Web.Mvc.dll のアセンブリ バージョンがインクリメントされたために、プロジェクトの System.Web.Mvc.dll への参照が解決できなくなりました。</p>
<p align="left">本問題を解決するためには次のいずれかの対処を実施します。</p>
<ol>
<li>(推奨) NuGET ギャラリーから Microsoft.ASPNET.MVC パッケージをインストールします（これによって当該アプリケーションの web.config に bindingRedirect要素が書き込まれます）。NuGet パッケージ マネージャーを操作するか、または Visual Studio の NuGet コンソールから以下のコマンドを実行します。<br /><br />&gt;Install-Package Microsoft.AspNet.Mvc -Version&nbsp;&lt;バージョン&gt; -Project &lt;プロジェクト名&gt;<br />※ MVC 4 のバージョンは 4.0.40804.0、MVC 3 のバージョンは 3.0.50813.1 となります<br />&nbsp;</li>
<li>手動で System.Web.MVC.dll への参照を更新します（この際、GAC 内の dll を参照しないようご注意ください）。参照を一旦削除し、Visual Studio で [参照の追加] &ndash; [アセンブリ] -&gt;[拡張] にて Sysytem.Web.Mvc を選択します。バージョンが 4.0.0.1 となっている事をご確認ください。</li>
</ol>
<p align="left">どちらの場合でも、[参照設定] で System.Web.mvc.dll の [ローカル コピー] プロパティが true に設定されている事を確認してください。これによって、アプリケーションをデプロイできるよう、アセンブリがbin フォルダーに格納されます。なお、NuGet には [ローカルコピー] のプロパティをリセットしてしまうという問題があります。ご注意ください: <a href="https://nuget.codeplex.com/workitem/4344" target="_top">https://nuget.codeplex.com/workitem/4344</a></p>
<p align="left">Visual Studio 2012 以前の MVC プロジェクトテンプレートでは、System.Web.MVC.dll アセンブリを GAC またはアセンブリ参照のフォルダーのいずれかから参照していました。最新の MVC テンプレートは、NuGet パッケージのインストールによってアセンブリへの参照を追加しています。これが、対処策 1. が推奨の理由です。現在 NuGet ギャラリーの使用は一般的かと存じます。</p>
<p align="left">なお、Visual Studio 2010 を使用して ASP.NET MVC3 プロジェクトを作成した場合も、同様の現象が発生する場合があります。これは該当のセキュリティ更新プログラムに関する情報にも以下の通り記載されています：</p>
<p style="padding-left: 30px;" align="left"><strong>MVC 3.0 RTM </strong><strong>がシステムにインストールされている状態で、更新プログラムをシステムにインストールしたところ、</strong><strong>Visual Studio 2010 </strong><strong>で新しいプロジェクトを作成できなくなりました。この問題を解決する方法を教えてください。</strong><strong>&nbsp;<br /></strong>Visual Studio 2010 用の ASP.NET MVC 3.0 テンプレートは、参照アセンブリ フォルダーにインストールされているアセンブリに依存します。MVC 3.0 用アセンブリの更新されたバージョンがインクリメントされるので、テンプレートが機能しなくなります。この問題を解決するには、Visual Studio 2010 用の MVC 3.0.1 ツール更新をインストールします。&nbsp;</p>
<p align="left">なぜアセンブリのバージョンをインクリメントしたかですが、これは既にサーバーに配置されているサードパーティ製 Web アプリケーションをセキュリティの脅威から守るためです。この場合、脆弱性のあるアセンブリはGAC に格納されている場合があり、そのアプリケーションでもセキュリティで保護されたアセンブリを実行させるためには、アセンブリのバージョンをインクリメントし、GAC に配置されたアセンブリも更新する必要がありました。</p>
<p align="left">また、一部の ASP.NET MVC5 プロジェクトでも、本事象に関連した影響を受ける可能性があります。Visual Studio にて Web アプリケーションを実行した際に、次のようなエラーが発生する場合があります。</p>
<p style="padding-left: 30px;" align="left"><em>コンパイラ</em><em> </em><em>エラー</em><em> </em><em>メッセージ</em><em>: CS0234: </em><em>型または名前空間名</em><em> 'Ajax' </em><em>は名前空間 </em><em>'System.Web.Mvc' </em><em>に存在しません。アセンブリ参照が不足しています。</em></p>
<p align="left">これは、System.Web.Mvc.dll アセンブリの参照設定で [ローカル コピー] が前述の NuGet の問題にてリセットされている可能性が高いです。</p>
<p align="left">この場合、アセンブリがアプリケーションと共に配置されません。Visual Studio では、GAC にインストールされているアセンブリに対しては [ローカル コピー] を既定で false に設定します。次の MSDN ドキュメントを参照してください：</p>
<p style="padding-left: 30px;" align="left"><a href="http://msdn.microsoft.com/ja-jp/library/vstudio/vslangproj.reference.copylocal.aspx">http://msdn.microsoft.com/ja-jp/library/vstudio/vslangproj.reference.copylocal.aspx</a><br /><a href="http://msdn.microsoft.com/ja-jp/library/ez524kew%28VS.80%29.aspx">http://msdn.microsoft.com/ja-jp/library/ez524kew%28VS.80%29.aspx</a></p>
<p align="left">この問題を修正するには、手動で [ローカル コピー] を true に変更してください。</p>
<p align="left">最後に、ASP.NET MVC 4 アプリケーションが次のようなエラーを表示する場合があります。</p>
<p style="padding-left: 30px;" align="left"><em>ファイルまたはアセンブリを読み込めませんでした</em><em> 'Newtonsoft.Json</em><em>、バージョン</em><em> 4.5.0.0 Culture=Neutral</em><em>、</em><em>PublicKeyToken=30ad4fe6b2a6aeed' </em><em>またはその依存関係の</em><em> 1 </em><em>つ。</em></p>
<p align="left">これは、セキュリティ更新プログラムによって更新されたバージョン固有の問題ではなく、ASP.NET MVC アセンブリが GAC にインストールされている場合に発生します。その場合、Newtonsoft.Json.dll アセンブリを解決することができません。アプリケーションのアセンブリ探索パス(bin フォルダーまたはそれと同等のフォルダー) にアセンブリをコピーする事で本問題を解決できます。Newtonsoft.Json 4.5.6 を NuGet ギャラリーからインストールできます。</p>
<p align="left">------</p>
<p>以上、参考になれば幸いです。</p>
<p>ではまた。<br />d99でした。</p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET の IE10 対応について</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/asp-net-ie10</link>
      <pubDate>Fri, 02 Aug 2013 06:21:00 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2013/08/02/asp-net-ie10/</guid>
      <description><![CDATA[こんにちは。d99 です。&nbsp;&nbsp; 今回は下記の件を取り上げます。

問題 ASP.NET 4.0 までのバージョンでは、ユーザーエージェント解析に問題があり、Internet...]]></description>
      <content:encoded><![CDATA[<p>こんにちは。d99 です。&nbsp;&nbsp; <br />今回は下記の件を取り上げます。</p>
<blockquote>
<p><span style="text-decoration: underline;"><strong>問題</strong> <br /></span>ASP.NET 4.0 までのバージョンでは、ユーザーエージェント解析に問題があり、Internet Explorer 10 の判定に失敗します。その結果、IE10 に対してだけ JavaScript が出力されずクライアントスクリプトが正常に動作しなかったり、CSS が出力されずレイアウトが崩れたり、といった問題が発生します。</p>
<blockquote>
<p>ASP.NET が Internet Explorer 10 の検出に失敗する <br /><a title="http://msdn.microsoft.com/ja-jp/library/ie/hh869299(v=vs.85).aspx" href="http://msdn.microsoft.com/ja-jp/library/ie/hh869299(v=vs.85).aspx">http://msdn.microsoft.com/ja-jp/library/ie/hh869299(v=vs.85).aspx</a></p>
</blockquote>
<p><span style="text-decoration: underline;"><strong>原因</strong> <br /></span>ASP.NET のバグです。</p>
<p><span style="text-decoration: underline;"><strong>対処</strong> <br /></span>緊急修正モジュールのご用意があります。</p>
<blockquote>
<p>ASP.NET 4.0 用 <br /><a title="http://support.microsoft.com/kb/2600088" href="http://support.microsoft.com/kb/2600088">http://support.microsoft.com/kb/2600088</a></p>
<p>ASP.NET 2.0、3.0 3.5 用 <br /><a title="http://support.microsoft.com/kb/2600100" href="http://support.microsoft.com/kb/2600100">http://support.microsoft.com/kb/2600100</a> <br /><a title="http://support.microsoft.com/kb/2608565" href="http://support.microsoft.com/kb/2608565">http://support.microsoft.com/kb/2608565</a></p>
</blockquote>
<p><span style="text-decoration: underline;"><strong>備考</strong> <br /></span>このバグは、所謂 WebFrom にだけ影響し、ASP.NET MVC や ASP.NET WebPages （Razor） には影響しません。</p>
</blockquote>
<p>&nbsp;</p>
<p>今回は上記の問題の、緊急修正モジュール以外の対処についてご紹介します。</p>
<p>この問題については以下の4つの対処方法があります。</p>
<ol>
<li>緊急修正モジュール（hotfix）を適用する</li>
<li>セキュリティパッチ（MS11-100）を適用する</li>
<li>手動でシステムのブラウザ定義を書き換える</li>
<li>アプリケーションに IE10 対応のブラウザ定義を加える </li>
</ol>
<p><strong><span style="text-decoration: underline;">1. は、</span></strong>既にご紹介した通りです。緊急修正モジュールは ASP.NET のコアモジュールである System.Web.dll 等のバージョンを更新し、ブラウザ定義ファイル ie.browser 等も IE10 に対応した新しいものに更新します。 </p>
<p><strong><span style="text-decoration: underline;">2. は、</span></strong>セキュリティパッチに IE10 対応の修正が含まれています。そのため Windows Update で適用されており、問題が発生しなくなっているかもしれません。ただ、これは 1. とは少し異なった修正のため注意が必要です。これについて解説します。</p>
<p>ASP.NET のブラウザ定義ファイルは %windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers などの、.NET Framework インストールフォルダの CONFIG/Browsers サブフォルダにあります。</p>
<p>しかし、ASP.NET は既定ではこのファイル自体を使ってはいません。</p>
<p>ASP.NET はブラウザ判定ルーチンを System.Web.dll の中に持っており、既定ではそれを使っています。上記パスのブラウザ定義ファイルは既定のブラウザ判定ルーチンの内容を示したもので、これをテキストエディタで書き換えただけではそれが反映されません。</p>
<p>反映するためには、aspnet_regbrowsers.exe というツールを使って、上記フォルダの .browser ファイルから判定ルーチンを含む dll を自動生成し、それを GAC にインストールして、既定の判定ルーチンを置き換える必要があります。実際には 「aspnet_regbrowsers.exe&nbsp; /i」 というコマンドでそれらを全て自動で行いますが、その際に裏で行われているのはそういった動作です。</p>
<blockquote>
<p>ASP.NET ブラウザ登録ツール (Aspnet_regbrowsers.exe) <br /><a title="http://msdn.microsoft.com/ja-jp/library/ms229858(v=vs.80).aspx" href="http://msdn.microsoft.com/ja-jp/library/ms229858(v=vs.80).aspx">http://msdn.microsoft.com/ja-jp/library/ms229858(v=vs.80).aspx</a></p>
</blockquote>
<p>1. の緊急修正モジュールは、System.Web.dll を更新するので、既定の判定ルーチンが置き換わります。さらにシステムのブラウザ定義ファイル、ie.browser ファイルを更新します。そのため、適用後に aspnet_regbrowsers /i しても修正は維持されます。</p>
<p>しかし、2. の MS11-100 は Sysytem.Web.dll を更新して既定のルーチンは置き換えますが、<span style="text-decoration: underline;">ブラウザ定義ファイルは IE10 対応に更新されていません</span>。そのため、aspnet_regbrowsers.exe コマンドを実行して既定の判定ルーチンを置き換えてしまっていたり、後に置き換えてしまったりすると、更新されていない ie.browser ファイルによって既定の判定ルーチンが上書きされてしまい、修正が機能しなくなってしまうため注意が必要です。</p>
<p>既定のルーチンを置き換えてしまった場合は、aspnet_regbrowsers.exe /u コマンドで既定の状態 （Sysytem.Web.dll 内のルーチンを使う状態） に戻せます。 </p>
<p><strong><span style="text-decoration: underline;">3. は、</span></strong>手動でシステムのブラウザ定義ファイルを置き換える方法です。別のテスト環境等に緊急修正モジュールを適用し、それによって更新された ie.browser ファイルを手に入れます。それを用いて、ターゲット環境の ie.browser を書き換え、aspnet_regbrowsers.exe /i コマンドで定義を更新します。</p>
<p>どうしてもバイナリバージョンを更新したくない、かつ、該当環境で動くアプリケーション全てで IE10 の誤判定問題を解決したい、という場合にはこちらの方法になります。比較的運用管理者の方が好まれる方法かもしれません。 </p>
<p><strong><span style="text-decoration: underline;">4. は、</span></strong>開発者の方向けの対処です。前出のシステムのブラウザ定義ファイル（NET Framework インストールフォルダの CONFIG/Browsers サブフォルダにあるもの）は、更新した上に aspnet_regbrowsers.exe /i するという手間がかかります。しかし、あるアプリケーションでだけブラウザ定義を追加・変更したいのであれば、アプリケーションルート直下に App_Browsers というフォルダを作り、そこにブラウザ定義ファイルを用意する事が出来ます。</p>
<p>ただし、この時使用するブラウザ定義ファイルは、3. のものとは内容が異なります。</p>
<p>ブラウザ定義ファイルは、ツリー状に判定ルーチンが構成されており、アプリケーション毎のブラウザ判定では、システムの持っているルーチンにノードを追加するイメージでしか更新できません。つまり、システムのブラウザ判定が優先され、それで判定できなかった場合、またはそれで判定された結果をさらに細分化するような事しかできません。</p>
<p>従って、アプリ用の IE10 対応ブラウザ定義ファイルを入手する必要があります。これは NuGet で公開されています。</p>
<blockquote>
<p>ASP.NET 4.0 用 （ASP.NET Browser Capabilities Update with IE10 and FF5 fixes for .NET 4） <br /><a title="http://www.nuget.org/packages/App_BrowsersUpdate" href="http://www.nuget.org/packages/App_BrowsersUpdate">http://www.nuget.org/packages/App_BrowsersUpdate</a></p>
<p>ASP.NET 2.0、3.0、3.5 用 （ASP.NET Browser Capabilities Update with IE10 fix for .NET 2.0） <br /><a title="http://www.nuget.org/packages/App_BrowsersUpdate.net20" href="http://www.nuget.org/packages/App_BrowsersUpdate.net20">http://www.nuget.org/packages/App_BrowsersUpdate.net20</a></p>
</blockquote>
<p>NuGet をコマンドで叩いてもいいですが、もし Visual Studio 2010 以降をお使いであれば、Package Manager を使用してアプリケーションに追加する事が出来ます。下記は Visual Studio 2010 の Package Manager 導入手順ですが、Visual Studio 2012 では [NuGet パッケージの管理] メニューから "IE10" というキーワードで検索すると、上記がヒットすると思います。</p>
<blockquote>
<p>.NETで開発モジュール導入が楽々に！ NuGet入門 <br /><a title="http://www.atmarkit.co.jp/fdotnet/chushin/nuget_01/nuget_01_01.html" href="http://www.atmarkit.co.jp/fdotnet/chushin/nuget_01/nuget_01_01.html">http://www.atmarkit.co.jp/fdotnet/chushin/nuget_01/nuget_01_01.html</a></p>
</blockquote>
<p>これをアプリケーションに導入しておけば、ターゲット環境に緊急修正が入っているかどうか、セキュリティパッチが入っているかどうか、という事に関わらずアプリケーションで IE10 の誤判定問題に対応する事が出来ます。</p>
<p>&nbsp;</p>
<p>以上、ご参考になれば幸いです。次回は日本ではややマイナー感のある、ASP.NET WebPages 2 について取り上げる予定です。</p>
<p>ではまた。 <br />d99でした。</p>]]></content:encoded>
    </item>
    <item>
      <title>また Windows Azure の記事を書きました</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/windows-azure</link>
      <pubDate>Tue, 08 Jan 2013 18:54:48 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2013/01/08/windows-azure/</guid>
      <description><![CDATA[あけましておめでとうございます d99 です。   以前も「Windows Azure サポートの現場から」に記事を書いた事を告知しましたが、また私の番がやってきました :-)     Windows...]]></description>
      <content:encoded><![CDATA[<p>あけましておめでとうございます d99 です。   <br />以前も「Windows Azure サポートの現場から」に<a href="http://blogs.msdn.com/b/d99/archive/2012/07/12/10329165.aspx">記事を書いた事を告知</a>しましたが、また私の番がやってきました :-)</p>  <blockquote>   <p>Windows Azure サポートの現場から &gt; Web ロールで動作するアプリケーションのパフォーマンス チューニング     <br /><a href="http://msdn.microsoft.com/ja-jp/windowsazure/jj841097">http://msdn.microsoft.com/ja-jp/windowsazure/jj841097</a></p> </blockquote>  <p> 今回も内容としては Azure 特有のハナシではありません。いつもいつもこんなのでいいのかなとも思いますが、意外とご好評頂いています。</p>  <blockquote>   <p>     <br /><strong><u>問題のシナリオ         <br /></u></strong>運用中の Windows Azure 上で動作する Web アプリケーションにパフォーマンスの問題が見つかったとします。通常は 1 秒以内で応答が得られるのですが、時折 5 秒以上かかる事があります。</p>    <p>現時点ではユーザーからの申告や監視システム等からのアラートからのみ現象が把握されており、どういった URL でどの程度の遅延が生じているか正確には把握できていません。また、該当の Web アプリケーションは Windows Azure の複数インスタンス上で動作しており、どれか特定のインスタンスでのみ発生している問題かどうかも分かっていません。</p>    <p>まずはパフォーマンス問題の発生箇所と、その状況を明らかにしたい、というのが今回のシナリオです。</p> </blockquote>  <p>「パフォーマンスが悪い」というお問い合わせは少なくないのですが、ボトルネックだけでなく現象の発生している URL も特定されていないという状況でご連絡頂く場合があります。エンドユーザー様からのクレームで発覚し、とにかく何でも良いので手はないかとお困りなんだろうなぁと思って対応させて頂くのですが、もちろん設定一つで爆速というものは無く、ボトルネックはどこかを探していくお手伝いをさせて頂く事になります。</p>  <p>そういった絞り込みってどうやればいいの？というそもそもの疑問を頂戴する事もあるので、今回の記事ではログをクエリーする方法をご紹介させて頂きました。</p>  <p>ではまた。今年もよろしくお願いいたします。   <br />d99 でした。    </p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET デッドロック検知機能について (4)</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/asp-net-4</link>
      <pubDate>Fri, 02 Nov 2012 05:10:39 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2012/11/02/asp-net-4/</guid>
      <description><![CDATA[こんにちは。   d99 です。いよいよこのシリーズも最後の回です。  今回は前回の方法で採取したダンプファイルを解析してみましょう。ASP.NET...]]></description>
      <content:encoded><![CDATA[<p>こんにちは。   <br />d99 です。いよいよこのシリーズも最後の回です。</p>  <p>今回は<a href="http://blogs.msdn.com/b/d99/archive/2012/07/17/10330455.aspx">前回の方法</a>で採取したダンプファイルを解析してみましょう。ASP.NET の簡単なダンプ解析方法をご紹介します。細かいところが分からなくても「だいたいのイメージ」が分かって頂けるといいかなと思います。</p>  <p>ダンプ解析には、採取時にインストールした Debugging Tools for Windows に含まれる windbg というデバッガを使用します。[スタート] - [すべてのプログラム] - [Debugging Tools for Windows (x86)] - [WinDbg] を起動し、c:\dump にある .dmp ファイルをドラッグアンドドロップします。Worspace に関するダイアログには一旦 [No] と答えておいてください。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/87/62/metablogapi/7041.image_4FD8EDBB.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-87-62-metablogapi/7041.image_5F00_4FD8EDBB.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/87/62/metablogapi/1667.image_thumb_4DBBEEF2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-87-62-metablogapi/1667.image_5F00_thumb_5F00_4DBBEEF2.png" width="244" height="192" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/87/62/metablogapi/3225.image_5AB5CF03.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-87-62-metablogapi/3225.image_5F00_5AB5CF03.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/87/62/metablogapi/4073.image_thumb_5D7B83F6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-87-62-metablogapi/4073.image_5F00_thumb_5F00_5D7B83F6.png" width="244" height="195" /></a></p>  <p>今回の場合、現象はハングアップですので、動作が止まっているスレッドを探し出すことになります。一般的な方法としては、まず各スレッドのスタックトレース、つまり関数の呼び出し履歴を表示し、この中から止まっているスレッドを探します。まずは .NET 用のデバッガエクステンションを読み込みます。以下のコマンドを入力して Enter します。</p>  <blockquote>   <p>.loadby sos mscorwks</p> </blockquote>  <p>その上で、全スレッドのスタックトレースを表示するコマンドは ~*k、マネージドのみの全スタックトレースは ~*e !clrstack で表示できます。しかしやってみても（シンボルを設定していない事もあり）あまり良く分からない内容が大量に出てきます。</p>  <p>実は、スタックトレースを見るだけでこのスレッドがハングアップしているのか、それとも単に作業を割り当てられるのを待っているなどの問題のない状態なのかを判断するには、それなりの経験が必要です。ダンプが採取できるタイミングというのは各スレッドが一瞬でも止まることができるタイミングなので、基本的にすべてのスレッドはなんらかの理由で止まっています。問題はその停止が動作の流れの中の一時的なものなのか、それとも異常なものなのかを見極める事です。それを間違うと何の問題もないスレッドをハングアップの原因とみなしてしまう事になります。</p>  <p>では、何か良いヒントはないのでしょうか。実は、ASP.NET の比較的シンプルな Web ページであれば、簡単な判別方法があります。先ほど読み込んだ sos デバッガエクステンションのコマンド、!threads でLockCount が 1以上 になっているスレッドは、非常にざっくりと言うと、ASP.NET ページ処理で作業中の可能性が高いスレッドです。</p>  <blockquote>   <p><font face="Consolas">0:028&gt; !threads       <br />ThreadCount: 10        <br />UnstartedThread: 0        <br />BackgroundThread: 10        <br />PendingThread: 0        <br />DeadThread: 0        <br />Hosted Runtime: no        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PreEmptive&#160;&#160; GC Alloc&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">Lock</font>        <br />&#160;&#160;&#160;&#160;&#160;&#160; ID OSID ThreadOBJ&#160;&#160;&#160; State&#160;&#160;&#160;&#160; GC&#160;&#160;&#160;&#160;&#160;&#160; Context&#160;&#160;&#160;&#160;&#160;&#160; Domain&#160;&#160; <font color="#ff0000">Count</font> APT Exception        <br />&#160; 15&#160;&#160;&#160; 1&#160; 8e8 000dd3a0&#160;&#160; 3808220 Enabled&#160; 02b19d68:02b1b008 000fdf28&#160;&#160;&#160;&#160; <font color="#ff0000">1</font> MTA (Threadpool Worker)        <br />&#160; 19&#160;&#160;&#160; 2&#160; ad0 000e33d0&#160;&#160;&#160;&#160;&#160; b220 Enabled&#160; 00000000:00000000 000d7098&#160;&#160;&#160;&#160; 0 MTA (Finalizer)        <br />&#160; 20&#160;&#160;&#160; 3&#160; 404 000fa500&#160;&#160;&#160; 80a220 Enabled&#160; 00000000:00000000 000d7098&#160;&#160;&#160;&#160; 0 MTA (Threadpool Completion Port)        <br />&#160; 21&#160;&#160;&#160; 4&#160; ebc 000fd7e8&#160;&#160;&#160;&#160;&#160; 1220 Enabled&#160; 00000000:00000000 000d7098&#160;&#160;&#160;&#160; 0 Ukn        <br />&#160; 22&#160;&#160;&#160; 5&#160; 730 0012d768&#160;&#160; 380b220 Enabled&#160; 06b5f1b4:06b60fe8 000fdf28&#160;&#160;&#160;&#160; <font color="#ff0000">2</font> MTA (Threadpool Worker)        <br />&#160; 23&#160;&#160;&#160; 6&#160; eec 0012f960&#160;&#160; 380b220 Enabled&#160; 06b63cf8:06b64fe8 000fdf28&#160;&#160;&#160;&#160; <font color="#ff0000">1</font> MTA (Threadpool Worker)        <br />&#160; 24&#160;&#160;&#160; 7&#160;&#160; a4 00137188&#160;&#160; 380b220 Enabled&#160; 06b66df0:06b66fe8 000fdf28&#160;&#160;&#160;&#160; <font color="#ff0000">1</font> MTA (Threadpool Worker)        <br />&#160; 25&#160;&#160;&#160; 8&#160; 6a8 00138230&#160;&#160; 380b220 Enabled&#160; 02b1ce10:02b1d008 000fdf28&#160;&#160;&#160;&#160; <font color="#ff0000">1</font> MTA (Threadpool Worker)        <br />&#160; 26&#160;&#160;&#160; 9&#160; d2c 00138da0&#160;&#160; 180b220 Enabled&#160; 02ae3b20:02ae4fe8 000d7098&#160;&#160;&#160;&#160; 0 MTA (Threadpool Worker)        <br />&#160; 13&#160;&#160;&#160; a&#160; 960 00139b50&#160;&#160; 880a220 Enabled&#160; 00000000:00000000 000d7098&#160;&#160;&#160;&#160; 0 MTA (Threadpool Completion Port)</font>      <br /></p> </blockquote>  <p>また<a href="http://blogs.msdn.com/b/d99/archive/2010/03/31/9988006.aspx">以前ご紹介した</a> psscor2 には !aspxpages というコマンドもあります。ダウンロードした EXE を実行すると、指定したフォルダに ZIP ファイルが解凍されますので、これをさらに解凍し、その中に含まれる psscor2.dll を Debugging Tools for Windows のフォルダに移動します。.load コマンドで読み込み、!aspxpapegs コマンドを実行してみましょう。</p>  <blockquote>   <p><font face="Consolas">0:028&gt; .load psscor2       <br />        <br />0:028&gt; !aspxpages        <br />PDB symbol for mscorwks.dll not loaded        <br />Going to dump the HttpContexts found in the heap.        <br />Loading the heap objects into our cache.        <br />HttpContext&#160;&#160;&#160; Timeout&#160; Completed&#160;&#160;&#160;&#160; Running&#160; ThreadId ReturnCode&#160;&#160; Verb RequestPath+QueryString        <br />0x02ab28f0&#160;&#160;&#160; 19200 Sec&#160;&#160;&#160;&#160;&#160;&#160;&#160; no&#160;&#160;&#160;&#160;&#160;&#160; 142 Sec&#160;&#160;&#160;&#160;&#160; 25&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160; POST /DeadlockTest/test.aspx         <br />...        <br />x02af8438&#160;&#160;&#160; 19200 Sec&#160;&#160;&#160;&#160;&#160;&#160;&#160; no&#160;&#160;&#160;&#160;&#160;&#160;&#160; 44 Sec&#160;&#160;&#160;&#160;&#160; 15&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160; POST /DeadlockTest/test.aspx         <br />0x06ae6484&#160;&#160;&#160; 19200 Sec&#160;&#160;&#160;&#160;&#160;&#160; yes&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; XXX&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160; POST /DeadlockTest/test.aspx         <br /><font color="#ff0000">0x06ae8990&#160;&#160;&#160; 19200 Sec&#160;&#160;&#160;&#160;&#160;&#160;&#160; no&#160;&#160;&#160;&#160;&#160;&#160; 144 Sec&#160;&#160;&#160;&#160;&#160; 22&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160; POST /DeadlockTest/test.aspx          <br /></font>0x06aee8f0&#160;&#160;&#160; 19200 Sec&#160;&#160;&#160;&#160;&#160;&#160;&#160; no&#160;&#160;&#160;&#160;&#160;&#160; 143 Sec&#160;&#160;&#160;&#160;&#160; 23&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160; POST /DeadlockTest/test.aspx         <br />0x06af48f0&#160;&#160;&#160; 19200 Sec&#160;&#160;&#160;&#160;&#160;&#160;&#160; no&#160;&#160;&#160;&#160;&#160;&#160; 143 Sec&#160;&#160;&#160;&#160;&#160; 24&#160;&#160;&#160;&#160;&#160;&#160;&#160; 200&#160;&#160; POST /DeadlockTest/test.aspx         <br />Total 70 HttpContext objects</font></p> </blockquote>  <p>こちらはもっと分かりやすいですね。このコマンドではリクエスト処理中のスレッドを列挙します。ThreadId が XXX のものは単純に言うと処理が終わってしまったものですので（一部例外もあります）、無視してください。これはヒープから HttpContext のクラスインスタンスを列挙し、そのプロパティから状態を出しているため、またガベージコレクトされていない HttpContext クラスインスタンスも表示されてしまうためです。</p>  <blockquote>   <p>HttpContext クラス     <br /><a title="http://msdn.microsoft.com/ja-jp/library/system.web.httpcontext(v=VS.80).aspx" href="http://msdn.microsoft.com/ja-jp/library/system.web.httpcontext(v=VS.80).aspx">http://msdn.microsoft.com/ja-jp/library/system.web.httpcontext(v=VS.80).aspx</a></p> </blockquote>  <p>今回の場合、Running 列の一番大きいものの、ThreadId は 22 ですので、このスレッドのスタックトレースを表示しましょう。~22s というコマンドで 22番 スレッドに移り、!clrstack コマンドで Visual Studio を使って C# でデバッグしている感覚（呼出し履歴ウィンドウの表示）に近い出力を出します。これが .NET の呼び出し履歴、いわゆるマネージドスタックトレースになります。</p>  <blockquote>   <p><font face="Consolas">0:028&gt; ~22s       <br />eax=00000000 ebx=00000000 ecx=000003fc edx=069d0000 esi=00000000 edi=109cf120        <br />eip=7c97845c esp=109cf0e0 ebp=109cf148 iopl=0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; nv up ei pl nz na po nc        <br />cs=001b&#160; ss=0023&#160; ds=0023&#160; es=0023&#160; fs=003b&#160; gs=0000&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; efl=00000202        <br />ntdll!KiFastSystemCallRet:        <br />7c97845c c3&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ret        <br />        <br />0:022&gt; !clrstack        <br />OS Thread Id: 0x730 (22)        <br />ESP&#160;&#160;&#160;&#160;&#160;&#160; EIP&#160;&#160;&#160;&#160; <br />109cf230 7c97845c [HelperMethodFrame: 109cf230] System.Threading.Thread.SleepInternal(Int32)        <br />109cf284 0eba9345 System.Threading.Thread.Sleep(Int32)        <br /><font color="#ff0000">109cf288 106407da ASP.test_aspx.Button1_Click(System.Object, System.EventArgs)*** WARNING: Unable to verify checksum for App_Web__mrqmt6b.dll         <br /> c:\Inetpub\wwwroot\DeadlockTest\test.aspx:10</font>        <br />109cf2d0 6679f618 System.Web.UI.WebControls.Button.OnClick(System.EventArgs)        <br />109cf2e8 6679f43b System.Web.UI.WebControls.Button.RaisePostBackEvent(System.String)        <br />109cf300 6679f6bb System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(System.String)        <br />109cf308 6609842e System.Web.UI.Page.RaisePostBackEvent(System.Web.UI.IPostBackEventHandler, System.String)        <br />109cf314 66098385 System.Web.UI.Page.RaisePostBackEvent(System.Collections.Specialized.NameValueCollection)        <br />109cf328 660aa65e System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)        <br />109cf480 660a9ee4 System.Web.UI.Page.ProcessRequest(Boolean, Boolean)        <br />109cf4b8 660a9e11 System.Web.UI.Page.ProcessRequest()        <br />109cf4f0 660a9da6 System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext)        <br />109cf4fc 660a9d82 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)        <br />109cf510 106401b6 ASP.test_aspx.ProcessRequest(System.Web.HttpContext)        <br />109cf520 660b0256 System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()        <br />109cf554 6608332c System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)        <br />109cf594 6608eb83 System.Web.HttpApplication+ApplicationStepManager.ResumeSteps(System.Exception)        <br />109cf5e4 660828ac System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext, System.AsyncCallback, System.Object)        <br />109cf600 66085e1c System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest)        <br />109cf634 66085ac3 System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest)        <br />109cf644 66084c5c System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32)        <br />109cf858 79faca45 [ContextTransitionFrame: 109cf858]         <br />109cf88c 79faca45 [GCFrame: 109cf88c]         <br />109cf9e8 79faca45 [ComMethodFrame: 109cf9e8]</font> </p> </blockquote>  <p>呼出し履歴ウィンドウと同様に、関数の呼び出しは下から上です。最終的には一番上の関数を実行中です。ただし停止の原因が一番上にあるとは限りません。例えば、System.Threading.Thread.Sleep() メソッドが一番上にあっていたとしても Sleep() 自体が悪いのではなく、なぜ Sleep() が呼び出されたのか、これはどのくらいスリープしているのかという事が重要です。</p>  <p>ただ今回の場合、意図的にスリープしているのですから、旅はひとまずここまでです。このスタックトレースのおおまかな形を覚えておくと役に立つかもしれません。これは「あるページでスリープさせた時のスタックトレース」であるとともに、「ASP.NET ページ処理までの関数呼び出し履歴」でもあります。前述のように、ダンプファイルから各スレッドがどういった作業中なのかを判断するにはこういった、「あるコードが実行されるまでの流れ」を知っておくと、スタックをパッと見て判別できるようになります。なので、私は初めて触るプログラミングプラットホームでは、まずコードで長期間スリープさせ、デバッガをアタッチしてスタックをみてみるといった事をよくやります。</p>  <p>閑話休題、デッドロックについてはいったんここで区切ります。今後もまたちょっとしたダンプの取り方・見方をちょくちょく紹介していきますので、お楽しみに。</p>  <p>ではまた。   <br />d99でした。</p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET デッドロック 検知機能について (3)</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/asp-net-3</link>
      <pubDate>Mon, 16 Jul 2012 23:11:00 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2012/07/16/asp-net-3/</guid>
      <description><![CDATA[こんにちは d99 です。 またもや間が空いてしまいましたが、このネタの続きを。これを完結させませんと先には進めませんので。
前回 「デッドロックが検出されました」...]]></description>
      <content:encoded><![CDATA[<p>こんにちは d99 です。 <br />またもや間が空いてしまいましたが、このネタの続きを。これを完結させませんと先には進めませんので。</p>
<p>前回 「デッドロックが検出されました」 というイベントログをわざと発生させる設定とサンプルプログラムをご紹介しました。</p>
<blockquote>
<p>ASP.NET デッドロック 検知機能について (2) <br /><a title="http://blogs.msdn.com/b/d99/archive/2012/02/29/10274250.aspx" href="http://blogs.msdn.com/b/d99/archive/2012/02/29/10274250.aspx">http://blogs.msdn.com/b/d99/archive/2012/02/29/10274250.aspx</a></p>
</blockquote>
<p>今回は、このプログラムを使ってデッドロック検知時にダンプファイルを自動採取してみます。</p>
<p>前回の通り、サーバー環境は、Windows Server 2003、IIS 6.0 + .NET Framework 2.0 を使用します。前回のサンプルを <a href="http://localhost/DeadlockTest/test.aspx">http://localhost/DeadlockTest/test.aspx</a> に配置したとします。前回記載の手順でデッドロック検知のイベントをわざと起こせる事も確認済みです。では、まずダンプファイル採取の設定を行いましょう。</p>
<p><strong>※ 下記手順は、Windows Server 2008 以降では使用できません。これは、IIS と ASP.NET 統合の影響によって、ASP.NET がそもそもデッドロック検出イベントを発生させなくなったためです。2008 以降でどうすれば良いかについては、後日ご紹介する予定です。</strong></p>
<p>ダンプファイル採取の設定手順はサポート技術情報でご用意しています。</p>
<blockquote>
<p>IIS 6.0 で ASP.NET がデッドロックになった場合のダンプ ファイルの生成方法 <br /><a title="http://support.microsoft.com/kb/828222/ja" href="http://support.microsoft.com/kb/828222/ja">http://support.microsoft.com/kb/828222/ja</a></p>
</blockquote>
<p>Debugging Tools for Windows をインストール（別の環境にインストールし、フォルダごとコピーでも構いません）、バッチファイルやダンプ出力フォルダを用意して、IIS の設定をコマンドラインから変更するだけです。Debugging Tools for Windows は以下から過去のバージョンのものを（バージョン 6.11）をご利用ください。</p>
<blockquote>
<p>32 ビット版 Debugging Tools for Windows <br /><a href="http://msdn.microsoft.com/ja-jp/windows/hardware/gg463016">http://msdn.microsoft.com/ja-jp/windows/hardware/gg463016</a></p>
<p>ASP.NET 運用デバッグ入門 1) デバッガのインストール <br /><a title="http://blogs.msdn.com/b/d99/archive/2008/04/01/8347420.aspx" href="http://blogs.msdn.com/b/d99/archive/2008/04/01/8347420.aspx">http://blogs.msdn.com/b/d99/archive/2008/04/01/8347420.aspx</a></p>
</blockquote>
<p>※ 最新版の Debugging Tools for WIndows でもコマンド自体には変更はありません。ただし、最新版は単体ダウンロードでのご用意がなく SDK や DDK に含まれているため、開発機等へ一旦インストールしてからコピーしていて頂くシナリオが多いのかなと思います。</p>
<p>なお、サポート技術情報記載の action.cmd はこのままでも良いですが、少しいじっておくと便利な場合があります。</p>
<blockquote>
<p>@if "%_echo%"=="" echo off <br />setlocal <br />&nbsp;&nbsp;&nbsp; set TIMESTAMP=%DATE:~-9%_%TIME% <br />set TIMESTAMP=%TIMESTAMP:/=_% <br />set TIMESTAMP=%TIMESTAMP::=_% <br />set TIMESTAMP=%TIMESTAMP:.=_% <br />set TIMESTAMP=%TIMESTAMP: =_% <br />set FILENAME=<span style="background-color: #cccccc;">c:\dump</span>\crash_%TIMESTAMP%.dmp <br />set LOG=<span style="background-color: #cccccc;">c:\du</span><span style="background-color: #cccccc;">mp\log_%TIMESTAMP%</span>.txt <br />set COMMAND="<span style="background-color: #cccccc;">C:\Program Files\Debugging Tools for Windows (x86)</span>\cdb.exe" -c ".dump /o <span style="background-color: #ffff00;">/ma</span> %FILENAME%;q" -p %1</p>
<p>echo %COMMAND% &gt; %LOG% <br />%COMMAND% <span style="background-color: #ffff00;">&gt;&gt; %LOG% 2&gt;&amp;1</span></p>
<p>endlocal </p>
</blockquote>
<p>グレーの部分はパスを変更しただけです。黄色の部分ですが、まず cdb.exe のオプションを /mhf から /ma に変えています。これは /ma の方が多少多くの情報が取れるためです。また、再度の %COMMAND% にオプションを追加しているのは、バッチファイルに間違いなどが合った場合もエラーが log.txt に記録できるようにしているだけです。</p>
<p>サポート技術情報の設定をほどこした上で、前回の再現手順を行います。パフォーマンスモニタで観測すると以下のようになります（下記環境は 2CPU で、同時実行数の上限が5になるように machine.config を調整しています）。</p>
<blockquote>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/87/62/metablogapi/4670.perfmon_529FC3BA.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-87-62-metablogapi/4670.perfmon_5F00_529FC3BA.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="perfmon" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/87/62/metablogapi/3107.perfmon_thumb_5C188230.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-87-62-metablogapi/3107.perfmon_5F00_thumb_5F00_5C188230.jpg" alt="perfmon" width="644" height="431" border="0" /></a></p>
</blockquote>
<p>IIS はオーバーラップリサイクル（次のプロセスを起動してから、古いプロセスを終了させる）を行うので、デッドロック検知が働いて、新しい w3wp.exe が起動すると見た目上同時実行数が増えたように見えますが、このタイミングでデッドロック検知のイベントログが記録されているかと思います。そして、指定したフォルダに .dmp ファイルと、.txt が出力されます。</p>
<p>さて、次回はこのダンプファイルを素材に、ASP.NET の中身がどのように見えるか、確認してみましょう。</p>
<p>ではまた。 <br />d99 でした。</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure の記事を書きました</title>
      <link>https://docs.microsoft.com/archive/blogs/d99/windows-azure-2</link>
      <pubDate>Thu, 12 Jul 2012 02:24:00 GMT</pubDate>
      <dc:creator><![CDATA[d-99]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/d99/2012/07/12/windows-azure-2/</guid>
      <description><![CDATA[こんにちは d99 です。 実は私は Windows Azure のサポートチームにも所属していたりするのですが、その関係で Windows Azure...]]></description>
      <content:encoded><![CDATA[<p>こんにちは d99 です。 <br />実は私は Windows Azure のサポートチームにも所属していたりするのですが、その関係で Windows Azure に関連して記事を書きました。</p>
<blockquote>
<p><a href="http://msdn.microsoft.com/ja-jp/windowsazure/hh705140">Windows Azure サポートの現場から</a> &gt; リモート デスクトップを利用したデバッグ (その 2) <br /><a title="http://msdn.microsoft.com/ja-jp/windowsazure/jj219279" href="http://msdn.microsoft.com/ja-jp/windowsazure/jj219279">http://msdn.microsoft.com/ja-jp/windowsazure/jj219279</a></p>
</blockquote>
<p>もしよろしければご賞味ください :-) 内容としては Azure 特有のハナシではありません。むしろ普通の Web アプリケーションで有用かなと思います。上記の記事では OutputDebugString() API を紹介しています。</p>
<p>他にそういったデバッグで使い易い API 関数と言えば、DebugBreak() API でしょうか。この関数は、要はアタッチしているデバッガを止めるというもので、以前ご紹介した windbg.exe などのデバッガで任意のタイミングでブレークさせる、というものです。DebugBreak() API のプラットフォーム呼び出し定義は以下のようになります。</p>
<blockquote>
<p>[DllImport("kernel32.dll")] <br />static extern void DebugBreak();</p>
</blockquote>
<p>さて、これに対応したマネージドメソッドはないのでしょうか？ 実は System.Diagnostics.Debugger.Break() メソッドがそれに当たるのですが、これが NET Framework 2.0 と 4.0 で動きが少し異なります。.NET Framework 2.0 の Debugger.Break() は、Visual Studio しか止まりません。しかし、.NET Framework 4.0 の Debugger.Break() は結果的に DebugBreak() API を呼び出しますのでネイティブデバッガでも止まります。</p>
<p>まとめると、windbg.exe 等のネイティブデバッガで止めたいなら、.NET Framework 2.0 なら DebugBreak() API をプラットフォーム呼び出し。.NET Framework 4.0 なら System.Diagnostics.Debugger.Break() マネージドメソッド、という事になります。私の同僚には、未だにデバッグブレークといえばなんとかして int 3 を直接書こうとするものもいますがｗ、4.0 であれば Debugger.Break() を使って頂ければと思います。</p>
<p>また、OutputDebugString() API も、System.Diagnostics.Debug.Print() だけでなく、System.Diagnostics.Debugger.Log()&nbsp; もあります。引数が多いので Windows Azure の記事では紹介しませんでしたが、こちらもデバッガ上にログを出力しますし、Debug.Print() と違ってデバッグビルドかどうかに関わらずログを出力します（デバッガー自体の設定には依存します）。</p>
<p>基本的にはマネージドメソッドを使いつつ、うまく Windows API で補完すると素敵なデバッグライフをお送り頂けるのではないかと :-)</p>
<p>ではまた。 <br />d99 でした。</p>]]></content:encoded>
    </item>
  </channel>
</rss>