ライセンス | SaaSおよびオンプレミス |
製品 | AssessとProtectの両方、もしくは単体 |
製品カテゴリ | .NET Coreエージェント |
サブカテゴリ | トラブルシューティング |
本項の内容
Contrastエージェントを導入したことで、何らかの問題(Webサーバのプロセスのクラッシュ、特定のページがエラーになるなど)が発生する場合があります。Contrastが原因で、クラッシュやエラーが発生した場合は、このページの右上にあるチケット発行をクリックして、弊社サポートまで問題やエラーをご報告ください。このような問題の解決や再現には、詳細なログが必要となりますので、可能な限り以下の手順に従ってエージェントのログやその他の関連情報を収集してください。
手順
エージェントログのディレクトリ
次のいずれかの方法で、ログレベルをTRACEに設定することにより、Contrastの詳細なログを記録できます。
注:ログのデフォルトパスはYAML設定では変更できません。デフォルトパスは以下の通り:
Linux:/var/tmp/contrast/dotnet-core/logs
Windows:%ProgramData%\Contrast\dotnet-core\logs
- contrast_security.yaml file:(詳細は、Contrastドキュメントを参照)
agent:
logger:
level: TRACE
- 環境変数:(詳細は、Contrastドキュメントを参照)
CONTRAST_CORECLR_LOGS_DIRECTORY='/path/to/logs'
CONTRAST__AGENT__LOGGER__LEVEL=TRACE
これらの設定オプションによって、ContrastのログがTRACEモードになり、指定したログファイルまたはデフォルトの場所にすべての出力が記録されます。
また、.NETの環境に関する情報も必要となりますので、次のコマンドで返される情報もご提供ください。
dotnet --info
不具合のタイプ
Contrastエージェントによる不具合で、ログやその他の情報が必要なものとしては、主に以下のようなタイプがあります。
- エージェントがロードできない
- プロセスがクラッシュ
- 未処理の例外/ページエラー/500エラー
Linuxベースのオペレーティングシステムの場合:
エージェントのロードに失敗する
エージェントのロードに失敗する場合、ログは作成されません。以下のコマンドは、エージェントがプロセスでロードできない理由を調査するのに役立ちます。
以下の例では、`dotnet SampleApp.dll`を実行し、すべてのカーネルコールをstrace_output.txtファイルに出力します。
strace -o strace_output.txt dotnet SampleApp.dll
プロセスがクラッシュする
Contrastエージェントによりプロセスがクラッシュする場合、次の環境変数を設定することで、クラッシュ時にダンプが生成されます。
export COMPlus_DbgEnableMiniDump=1
export COMPlus_DbgMiniDumpType=2
dotnet SampleApp.dll
この設定によって生成されるダンプは、/tmp/coredump.[pid]
となります。
ページクラッシュ/500エラー
プロセスは正常に動作していても、ページからエラーが返されたり、ページの読み込みに失敗している場合は、ダンプを取ることができます。「createdump」コマンドの場所は、インストールした.NET Coreのバージョンによって異なりますが、通常は、/usr/share/dotnet/shared/Microsoft.NETCore.App/[バージョン番号]/
にあります。
ps -ax | grep [process name]
createdump -h [pid]
ダンプの書き込み先のファイルは、デフォルトで/tmp/coredump.[pid]
になります。
createdumpの例
bob@ubuntudesktop:~$ ps -ax | grep dotnet
9186 pts/0 SLl+ 0:00 dotnet run
9241 pts/0 SLl+ 0:01 /usr/share/dotnet/dotnet /home/bob/.nuget/packages/microsoft.aspnetcore.razor.design/2.1.1/tools/rzc.dll server -p razor-issues-2406
9258 pts/0 SLl+ 0:06 dotnet exec /home/bob/Desktop/SampleApp/bin/Debug/netcoreapp2.2/SampleApp.dll
この例の場合、アプリケーションを実行している実際のプロセスである、`dotnet exec`のプロセスIDを指定してダンプを取得します。
bob@ubuntudesktop:~$ /usr/share/dotnet/shared/Microsoft.NETCore.App/2.2.6/createdump -h 9258
Writing full dump to file /tmp/coredump.9258
Written 12285857792 bytes (2999477 pages) to core file
Windowsベースのオペレーティングシステムの場合:
エージェントのロードに失敗する
まず、.NET Coreアプリがどのように実行されているかを確認します。
- IISのインプロセスホスティング
- IISのアウトプロセスホスティング
- スタンドアロンのプロセス
アプリケーションがIISサーバでホストされている場合、web.configを確認します。“aspNetCore”タグの“hostingModel”要素に指定されている値で、インプロセスかアウトプロセスであるかが分かります。
次に、Windowのprocdump.exeを使用します(詳細はこちらを参照) 。
procdump.exe -ma <process id>
アプリケーションがIISでホストされており、インプロセスモードで実行されている場合は、w3wp.exeプロセスの情報が必要になります。 それ以外の場合は、アプリケーションを実行しているdotnet.exeのプロセスをダンプします。プロセスを特定するには、SysInternals Process Explorerを使用するのが最適です。 dotnet.exeまたはw3wp.exeのプロセスを探し、プロセスの環境変数を確認します。 Contrastエージェントと関連するCORECLR変数を探してください。
procdump.exe -ma w3wp.exe
procdump.exe -ma dotnet
ページクラッシュ/500エラー
ProcDumpを使用して、プロセスのダンプを生成します(詳細はこちらを参照)。-wで対象プロセスが起動されるまで待つことができます。
最初に、procdumpを実行します
procdump.exe -e -w dotnet
次に、.NET Coreアプリケーションを起動します。
未処理の例外を確認する
前述の方法は、.NET Coreの開発チームが、.NET Coreエージェントによるアプリケーションエラーなどの問題を解決するのにも役立ちます。以下を参考に、.NET Coreエージェントがアプリケーションエラーを発生させているかを判断します。
- Contrastエージェントなしでアプリケーションが正常に動作することを確認した。
- Contrastエージェントを使用した場合に、アプリケーションのページが「クラッシュ(500エラーを返す)」するのを確認した。
- Windowsのイベントログには、「アプリケーションエラー」に関するエラーが記録されていない。
- Windowsのイベントログに、「ASP.NET」の警告がある。警告は、以下のような内容である:
Source: ASP.NET 4.0.30319.0 Date: 10/9/2017 9:22:46 AM Event ID: 1309 Task Category: Web Event Level: Warning Keywords: Classic User: N/A Computer: FOO.COMPUTER.COM Description: Event code: 3005 Event message: An unhandled exception has occurred. Event time: 09/10/2017 9:22:46 AM Event time (UTC): 09/10/2017 2:22:46 PM Event ID: f706787c1f1247e6a87b777a90413c3d Event sequence: 9 Event occurrence: 1 Event detail code: 0 Application information: Application domain: /LM/W3SVC/1/ROOT/FOO-1-131520325424796488 Trust level: Full Application Virtual Path: /Foo Application Path: E:\MCMSFiles\inetpub\wwwroot\Foo\ Machine name: FOO Process information: Process ID: 176840 Process name: w3wp.exe Account name: System Exception information: Exception type: ArgumentOutOfRangeException Exception message: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index at System.Collections.ArrayList.get_Item(Int32 index) at System.Web.UI.WebControls.DataListItemCollection.get_Item(Int32 index) at Fabrikam.SetTabCount(Int32 index, NullableInt32 summaryCount) in C:\Foo\Fabrikam.aspx.cs:line 1686 at Fabrikam.GetSummaryCounts() in C:\Foo\Fabrikam.aspx.cs:line 1468 at Fabrikam.OnPreRender(EventArgs e) in C:\Foo\Fabrikam.aspx.cs:line 549 at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) Request information: Request URL: https://www.foo-staging.com/Foo/Fabrikam.aspx Request path: /Foo/Fabrikam.aspx User host address: 1.2.3.4 User: msteeber Is authenticated: True Authentication Type: Thread account name: System Thread information: Thread ID: 19 Thread account name: System Is impersonating: False Stack trace: at System.Collections.ArrayList.get_Item(Int32 index) at System.Web.UI.WebControls.DataListItemCollection.get_Item(Int32 index) at Fabrikam.SetTabCount(Int32 index, NullableInt32 summaryCount) in C:\Foo\Fabrikam.aspx.cs:line 1686 at Fabrikam.GetSummaryCounts() in C:\Foo\Fabrikam.aspx.cs:line 1468 at Fabrikam.OnPreRender(EventArgs e) in C:\Foo\Fabrikam.aspx.cs:line 549 at System.Web.UI.Control.PreRenderRecursiveInternal() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
プロセスはクラッシュしていないので、ProcDumpでプロセスのダンプは取得できません。代わりに、次の手順を実行してプロセスのダンプを手動で取得する必要があります。
-
必要なワーカープロセスのプロセスIDを調べます。
-
IISマネージャ > ワーカープロセスをダブルクリックし、「アプリケーション プール名」で必要な名前を見つけたら、「プロセス ID」の値をメモします。
-
-
管理者のコマンドプロンプトで、上記の手順で取得したプロセスIDで
NNNNN
を置き換えて以下を実行します。C:\>procdump -ma NNNNN
エージェントログ、Windowsのイベント、プロセスのダンプも収集して、不具合の報告に添付してください。
プロセスのクラッシュに関する情報を収集する
以下の手順で、Contrastに送信する情報を収集してください。
- クラッシュのダンプをキャプチャするように、ProcDumpユーティリティを設定します。
- エージェントのあるWindowsサーバに、MicrosoftのドキュメントサイトからProcDumpの現行バージョンをダウンロードします。
- 管理者のコマンドプロンプトから以下を実行します:
md c:\dumps procdump.exe -ma -i c:\dumps
- 最新の.NET Coreエージェントをインストールします。
- Contrastで実行中のアプリケーションを停止します。
- Contrastエージェントのログオプションを追加します。
- スタート -> メモ帳 -> 右クリックメニューで、管理者として実行
- ファイル -> 開くを選択し、%ProgramData%\Contrast\dotnet-core\contrast_security.yaml を開きます。
- YAMLファイルに以下の設定を追加すると、詳細なログが有効になり、CLRでJITコンパイルされたすべてのメソッドのログが記録されます:
agent:
logger:
level: TRACE
- Contrastエージェントを有効にしてアプリケーションを起動します。
- アプリケーションを動かし、クラッシュを再現します。
問題が再現されたら、次の項目の情報を収集し、不具合の報告に添付してください:
- エージェントログ:エージェントのログディレクトリ、
%ProgramData%\Contrast\dotnet-core\logs
にあるすべてのファイル。「logs」フォルダを右クリックして、「送る」 > 「圧縮(zip形式) フォルダー」を選択します。 - Windowsイベントログ:「コントロールパネル」の「管理ツール」より「イベントビューアー」を選択します。「イベントビューアー」の画面左側で「Windowsログ」 > 「アプリケーション」を右クリックし、「すべてのイベントを名前をつけて保存」を選択して「MyEvents.evtx」という名前で保存します。
- クラッシュダンプ:C:\dumpsにある各プロセスのダンプファイル(例、w3wp.exe_171002_151601.dmp)のzipファイルを作成します。ダンプファイルは非常に大きくなる場合があります。
そして、C:>procdump.exe -u
でProcDumpをアンイストールします。
弊社サポートチームでは、これらの詳細なログを提供頂くことにより、発生している問題を詳しく調査することができます。Contrastサポートチームへのお問い合わせは、サポートポータルよりリクエストを送信してください。