イベントログに EventLogWebEventProvider のエラーが記録される現象について (2)

こんにちは d99 です。 前回に引き続き、以下のエラーについて取りあげます。 イベントの種類: エラー イベントソース: ASP.NET 2.0.50727.0 イベントカテゴリ: Web イベント イベント ID: 1301 System.Web.HttpException: EventLogWebEventProvider プロバイダでは、エラー コード 0x80070057 でイベントをログに記録できませんでした。 前回、このエラーは「エラーを記録するのに失敗したエラー」だと書きました。このエラーの直接的な原因については前回の記事を参照してください。今回はさらにその原因がなぜ起きたのか、という三段論法の二段目にあたるお話です 🙂 前回の末尾でこれはほぼ ViewState のエラーが原因だと書きました。実は、他の一般的なプログラム上の例外等では、イベントログに記録される内容はスタックバックトレース(関数呼び出し履歴)などで、それほど長くはなりません。しかし、ViewState のエラーが起きた場合だけは、ASP.NET はエラーとなった ViewState を可能な限りイベントログに記録しようとします。その際にイベントログ文字列長上限に合わせて記録文字列を切り詰めてしまうため、この例外になり得ます。 ViewState とは ASP.NET Web フォームの状態を保存するための隠しフィールドです。ASP.NET でグリッドなどにデータを表示する簡単なページを作ってブラウザで表示し、HTML ソースを確認すると <input type=”hidden” name=”__VIEWSTATE” value=”…”> という input タグが確認できます。ご存じの通り、ASP.NET はこの値を用いてページ状態を維持しています。ViewState 自体については以下の記事などが分かりやすいかと思います。 .NET TIPS [ASP.NET]ビューステートに保存されるものは? http://www.atmarkit.co.jp/fdotnet/dotnettips/041viewstate/viewstate.html .NETエンタープライズ Webアプリケーション開発技術大全 – Webアプリケーションの状態管理 http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp03/entwebapp03_02.html…

1

イベントログに EventLogWebEventProvider のエラーが記録される現象について (1)

こんにちは d99 です。 今日は、最近良くお問い合わせを頂く現象について紹介させてください。 アプリケーションイベントログに以下のエラーが記録される場合があります。イベントソース、イベント ID、そしてイベントメッセージの “EventLogWebEventProvider” と “0x80070057” が合致するのであれば、この現象です。 イベントの種類: エラー イベントソース: ASP.NET 2.0.50727.0 イベントカテゴリ: Web イベント イベント ID: 1301 System.Web.HttpException: EventLogWebEventProvider プロバイダでは、エラー コード 0x80070057 でイベントをログに記録できませんでした。 このイベントは端的に言いますと、「エラーを記録するのに失敗した」 という事を示しています。 ASP.NET 2.0 では、Web アプリケーションで未処理の例外が発生した際に、アプリケーションイベントログにイベントソースを ASP.NET <バージョン番号> としてその例外の詳細を記録するという機能が搭載されており、ヘルスモニタリング機能と呼ばれています。ヘルスモニタリング機能については以前下記で紹介させて頂きました。 ASP.NET 障害解析 最初の一歩 http://technet.microsoft.com/ja-jp/ee862421.aspx 上記のエラーは、このヘルスモニタリング機能が、アプリケーションで発生したエラーをイベントログ記録しようとしたのですが、それに失敗した、という事を示しています。従ってイベントログに記録されているのは、本来のエラーではありません。 イベントログに記録できなかった理由は、Windows Vista/2008 以降で、イベントログへイベントを記録するための API、ReportEvent() 関数の動作が変わり、記録できる最大文字列長が少し短くなってしまったためです。ASP.NET は以前の Windows OS 向けの長さ(32k)に切り詰めて記録しようとし、新しい OS では 32k では長すぎるためにエラーになっています。ASP.NET が最新の…


ASP.NET デッドロック 検知機能について (2)

こんにちは d99 です。 だいぶ間が空いてしまいましたが、続きを。お待たせしてしまってすみません。 前回、イベントソースが W3-SVC で 「デッドロックが検出されました」 というイベントログが記録された時、IIS では何が起きているのか、を解説しました。 ASP.NET デッドロック 検知機能について (1) http://blogs.msdn.com/b/d99/archive/2009/03/10/9468749.aspx 今回は、わざとデッドロック検知を動作させるコツについて記載します。 サーバー環境は、Windows Server 2003、IIS 6.0 を使用します。これは 2008 以降では ASP.NET を統合した影響で、ASP.NET でのデッドロック検知動作に変更が行われたためです。.NET Framework は 2.0 を使ってください。なお、以下にはシステム全体に影響を及ぼす設定もあるため、必ずテスト環境等で行うようにしてください。 今回はまず簡単な方法をご紹介します。machine.config を含めた設定も変更し、出来る限りサクッと現象を起こせるような方法です。端的に言うと、デッドロック検知が起きるまでスリープさせてしまおう、というわけです。まず、以下のような test.aspx を配置し、ASP.NET 2.0 でアプリケーションとして動くよう設定します。 <%@ Page Language=”C#” AutoEventWireup=”true” EnableSessionState=”False” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <script runat=”server”>     protected void…


ASP.NET デッドロック 検知機能について (1)

こんにちは d99 です。 今回は、トラブルシューティング ネタを取り上げます。今回のネタは、お問い合わせ頂く事も多い デッドロック です。 デッドロックといっても、実際には 「以下のイベントログが記録されたんだけどどうすればいいの?」 というものがほとんどですね。   IIS 5.x (Windows 2000, XP) の場合 種類 : エラー ソース : ASP.NET <バージョン> 分類 : なし イベント ID : 1003 日付 : yyyy/MM/dd 時刻 : HH:mm:ss ユーザー : N/A コンピュータ : <コンピュータ名> 説明 : デッドロック状態である可能性があるため、aspnet_wp.exe (PID: xxx) が繰り返されました。この 180 秒間に保留中の要求に対して応答は何も送信されていません。 IIS 6.0 (Windows Server…


Aspnet_regiis.exe って何してるの?

こんにちは。d99 です。図つきでなくて申し訳ないのですが。。。:-) [トラブルシュート][ASP.NET]Temporary ASP.NET Files’ への書き込みアクセスが与えられていません。の対処方法http://blogs.wankuma.com/ogiogi/archive/2008/03/11/127161.aspx aspnet_regiis って、いろいろ裏でなんかしてますよ・・・・詳しくご存じの方は、ぜひ図つきの解説をトラックバックしていただけるとww(ぼそ) ASP.NET 登録ツール(aspnet_regiis.exe)を -i オプションで実行すると、イベントログの [アプリケーション] に以下のようなログが残ります。  ソース:ASP.NET 2.0.50727.0 イベント ID:1019 ASP.NET (バージョン 2.0.50727.0) の登録を完了します。登録ログの詳細は、C:\DOCUME~1\<ユーザー名>\LOCALS~1\Temp\ASPNETSetup.log で確認できます。  ソース:ASP.NET 1.1.4322.0 イベント ID:1019 ASP.NET (バージョン 1.1.4322.0) の登録を完了します。登録ログの詳細は、C:\Users\<ユーザー名>\AppData\Local\Temp\ASPNETSetup.log で確認できます。 前者は Windows Server 2003 に ASP.NET 2.0 をインストールした場合、後者は Windows Server 2008 に ASP.NET 1.1 をインストールした場合です。OS のメジャーバージョンが異なるため、ユーザーの Temp パスが違っていますね。Windows Server 2003 では 8 3 形式になってしまっていますが、フルパスは c:\Documents and Settings\<ユーザー名>\Local…


システムトラブルのパターン

こんにちは、d99 です。 随分間があいてしまいました。今回はシステムトラブルにはどんなパターンがあるか、について考えてみたいと思います。 運用段階にあるシステムに発生するトラブルは、その見え方によっていくつか典型的なパターンがあり、その内のいくつかには原因追及の手順がある程度確立されているように思います。まずは(追及手順はひとまず置いておいて)、どんなパターンがあるかを考えつつまとめてみました。 – クラッシュ(crash) “落ちる” という現象、つまり異常終了してしまうというトラブルです。 Windows オペレーティングシステム自体の異常終了は、ブルースクリーンが該当します。システム自体ではなくアプリケーションが異常終了すると、一般保護違反といったエラーダイアログが出たり、エラー報告しますかと聞かれたり、ワトソン博士がお出ましになったり :-)、開発環境がインストールされていればデバッグするかといったダイアログが表示されたりします。サービスプロセスの場合はダイアログが出せないため、イベントログになんらかのログが残る事(残るように実装されている事)が多いと思います。 アプリケーション自身がうまくハンドリングできなかったとしても、基本的にはシステムがプロセスの異常終了をログオンユーザーに伝えようとします。まれになんの痕跡も残さず終了してしまう事もありますが、それはシステムが用意している異常終了時の処理がなんらの理由で実行できなかったか(できないほど深刻な異常だった、もしくはデバッガなどの介入を防ぐようにアプリケーションが作られていた、など)、異常終了に見えても実際には正常終了だったか、後は電源ケーブルが抜けたか 🙂 くらいしか考えられません。 – ハング (hang) “止まる” という現象、応答がなくなるというトラブルです。ハングには2種類あり、それぞれコールドハング(cold hang)とビジーハング(busy hang)と呼ばれます。 コールドハングは、内部でデッドロック(Aの処理がBの処理完了を待っているが、Bの処理もAを待っているといった状態)などが発生し、処理はまったく行っていないが応答を停止している状態です。 これに対してビジーハングは、その名の通り CPU がガンガン回っているだけで応答が返ってこない状態です。無限ループしている事もありますし、他の処理が忙しくて応答を返せないといった状態もあります。 – 例外(exception)もしくは意図しない動作 クラッシュするわけでもなく、ハングするわけでもない、しかし例外が発生したり、意図しない結果となるという場合は “それ以外” に分類してみました 🙂 。”トラブル” とは基本的に “意図しない現象の発生” かと思いますのでこういった分類名をつけました。 ここでは3つの分類を挙げてみました。 運用中に突然発生したトラブルにあたる時は、まずはこのどれか、正確には前者二つがどこかで起きていないか、を私は疑います。これは小さなデスクトップアプリケーションでも、何台ものマシンで構成されたクラスタシステムでも同様です。これは前者二つであれば “いつもの手順” が使えるからなのですが、それについてはまた回を改めてまとめてみたいと思います。 d99 でした。