.NET Coreエージェントのログを取得する

  • 更新
ライセンス SaaSおよびオンプレミス
製品 AssessとProtectの両方、もしくは単体
製品カテゴリ    .NET Coreエージェント
サブカテゴリ トラブルシューティング

 

本項の内容

 Contrastエージェントを導入したことで、何らかの問題(Webサーバのプロセスのクラッシュ、特定のページがエラーになるなど)が発生する場合があります。Contrastが原因で、クラッシュやエラーが発生した場合は、このページの右上にあるチケット発行をクリックして、弊社サポートまで問題やエラーをご報告ください。このような問題の解決や再現には、詳細なログが必要となりますので、可能な限り以下の手順に従ってエージェントのログやその他の関連情報を収集してください。

 

手順

エージェントログのディレクトリ

次のいずれかの方法で、ログレベルをTRACEに設定することにより、Contrastの詳細なログを記録できます。

注:ログのデフォルトパスはYAML設定では変更できません。デフォルトパスは以下の通り:
Linux: /var/tmp/contrast/dotnet-core/logs
Windows: %ProgramData%\Contrast\dotnet-core\logs 
agent:
logger:
   level: TRACE
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サポートチームへのお問い合わせは、サポートポータルよりリクエストを送信してください。

この記事は役に立ちましたか?

0人中0人がこの記事が役に立ったと言っています

他にご質問がございましたら、リクエストを送信してください