none
.NET Framework 3.5を使用したアプリでクラッシュダンプを出力したい RRS feed

  • 質問

  • 目的

    本番環境で異常終了(...は動作を停止しましたのダイアログが表示された)したアプリをデバッグしたい。

    動作環境

    • Windows Server 2008
    • .NET Framework 3.5

    調べたこと

    Windows Server 2008の環境を用意して、以下の内容を確認しました。

    1. クラッシュダンプを出力するように以下のレジストリを追加。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumpsのkeyにDumpCount, DumpFolder, DumpTypeを設定。

    2. 例外をスローするだけのコンソールアプリを作成。

    using System;
    
    namespace ConsoleApp4 {
        class Program {
            static void Main(string[] args) {
                throw new Exception("test");
            }
        }
    }

    3. .NET Framework 4をターゲットにしてビルドしたアセンブリを実行→クラッシュダンプが出力される。

    4. .NET Framework 3.5をターゲットにしてビルドしたアセンブリを実行→クラッシュダンプが出力されない。

    質問

    .NET Framework 3.5をターゲットにしたアプリで、クラッシュダンプを出力することは可能でしょうか?可能な場合は方法をご教示いただけますでしょうか。

    参考

    ダンプ解析入門 - Visual Studioでの可視化によるC#トラブルシューティング - Grani Engineering Blog


    プログラマーな日々(Blog):http://blog.jhashimoto.net/

    IT勉強会・セミナーまとめWiki:http://itstudy.jhashimoto.net/






    2018年9月20日 10:50

回答

  • > クラッシュダンプを取得するしかないと思っていましたが、
    > タスクマネージャーから出力したダンプでそれが可能であれば、
    > レジストリを変更しないで済むので、望ましいです。

    "APPCRASH" 問題の調査を行うなら、クラッシュ時のダンプを採取する必要があります。
    アプリで「動作を停止しました」のダイアログが出ると、アプリケーション ログに "APPCRASH" が記録されるはずで、WER のレジストリ設定をしておけばそのプロセスのダンプが自動生成されるはずです。
    もしそれでもダンプが自動生成されないのであれば、該当アプリの「動作を停止しました」ダイアログが出たタイミングでタスク マネージャから採取すれば代用できるかも。

    ダンプ解析は WinDBG でも確認できます。
    もっとも質問者さんが参照しているサイトでは、「いきなりハードコアにやる必要はないんですね。Visual Studioによる解析がもっともイージーだと思いますし」と、お勧めしていないようですが。
    私は WinDBG の方が慣れているので、Visual Studio でのダンプ解析はほとんどやったことがありません。

    もし WinDBG を使って解析するなら。。。
    下記サイトが参考になると思います。
    --------------------------------------------------------
    Debugging Managed Code Using the Windows Debugger
    https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-managed-code

    SOS.dll (SOS デバッガー拡張)
    https://docs.microsoft.com/ja-jp/dotnet/framework/tools/sos-dll-sos-debugging-extension
    --------------------------------------------------------

    • 回答としてマーク jhashimoto 2018年9月26日 4:54
    2018年9月21日 8:00
  • > .NET 3.5をターゲットにしたプロセスのダンプで、どのようにすればそれができるのでしょうか?

    Visual Studio ではできないので、すでに提案されているとおり、WinDbg + SOS 拡張を使って頑張ってください。

    Visual Studio のダンプを解析する機能は比較的新しい世代のものであり、.NET 4.0 以上のみです。
    "with 3.5 and earlier you only get native debugging"
    from https://blogs.msdn.microsoft.com/tess/2009/06/16/first-look-at-debugging-net-4-0-dumps-in-visual-studio-2010/

    2018年9月21日 13:30
    モデレータ

すべての返信

  • アプリケーション ログに記録されているエラー ログに、差異はないのでしょうか?

    あと、.Net Framework 3.5 利用したプロセスの、Task Manager からのダンプの生成はできているのでしょうか?

    2018年9月21日 0:28
  • アプリケーション ログに記録されているエラー ログに、差異はないのでしょうか?

    アプリケーションログとは、イベントログのことでしょうか?イベントビューアでアプリケーションログを確認したところ、.NET4がターゲットのプロセスを実行したときは、以下のイベントログが出力されていましたが、 .NET 3.5がターゲットのプロセスを実行したときは、イベントログは出力されていませんでした。

    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    - <System>
      <Provider Name=".NET Runtime" /> 
      <EventID Qualifiers="0">1026</EventID> 
      <Level>2</Level> 
      <Task>0</Task> 
      <Keywords>0x80000000000000</Keywords> 
      <TimeCreated SystemTime="2018-09-21T05:53:59.000000000Z" /> 
      <EventRecordID>24071</EventRecordID> 
      <Channel>Application</Channel> 
      <Computer>WIN-50FV1ROGHS2</Computer> 
      <Security /> 
      </System>
    - <EventData>
      <Data>Application: ConsoleApp4.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.Exception at ConsoleApp4.Program.Main(System.String[])</Data> 
      </EventData>
      </Event>
    - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    - <System>
      <Provider Name="Application Error" /> 
      <EventID Qualifiers="0">1000</EventID> 
      <Level>2</Level> 
      <Task>100</Task> 
      <Keywords>0x80000000000000</Keywords> 
      <TimeCreated SystemTime="2018-09-21T05:53:59.000000000Z" /> 
      <EventRecordID>24072</EventRecordID> 
      <Channel>Application</Channel> 
      <Computer>WIN-50FV1ROGHS2</Computer> 
      <Security /> 
      </System>
    - <EventData>
      <Data>ConsoleApp4.exe</Data> 
      <Data>1.0.0.0</Data> 
      <Data>5ba35b36</Data> 
      <Data>KERNELBASE.dll</Data> 
      <Data>6.1.7601.24214</Data> 
      <Data>5b627415</Data> 
      <Data>e0434352</Data> 
      <Data>000000000001a06d</Data> 
      <Data>9a0</Data> 
      <Data>01d4516f7d90d560</Data> 
      <Data>C:\Console4\Release\ConsoleApp4.exe</Data> 
      <Data>C:\Windows\system32\KERNELBASE.dll</Data> 
      <Data>bb552b1f-bd62-11e8-bfc4-06e99e830c40</Data> 
      </EventData>
      </Event>

    あと、.Net Framework 3.5 利用したプロセスの、Task Manager からのダンプの生成はできているのでしょうか?

    .NET 3.5をターゲットにしたプロセス、.NET 4をターゲットにしたプロセスのいずれも、タスクマネージャーからのダンプ生成ができました。

    ただし、前者の場合は、Visual Studio 2017でダンプを開いても[マネージのみでデバッグ]、[混合でデバッグ]がアクションに表示されませんでした。

    こちらで紹介されている、[マネージのみでデバッグ]、[混合でデバッグ]ができれば、原因を突き止められると考えていますが、.NET 3.5をターゲットにしたプロセスのダンプで、どのようにすればそれができるのでしょうか?

    この時点で「例外情報:スレッドのスタックがいっぱいです」によりスタックオーバーフローが原因だとわかりますが、更にアクションから「混合でデバッグ」、あるいは「マネージのみでデバッグ」をクリックしましょう。

    クラッシュダンプを取得するしかないと思っていましたが、タスクマネージャーから出力したダンプでそれが可能であれば、レジストリを変更しないで済むので、望ましいです。


    プログラマーな日々(Blog):http://blog.jhashimoto.net/

    IT勉強会・セミナーまとめWiki:http://itstudy.jhashimoto.net/

    2018年9月21日 6:21
  • > クラッシュダンプを取得するしかないと思っていましたが、
    > タスクマネージャーから出力したダンプでそれが可能であれば、
    > レジストリを変更しないで済むので、望ましいです。

    "APPCRASH" 問題の調査を行うなら、クラッシュ時のダンプを採取する必要があります。
    アプリで「動作を停止しました」のダイアログが出ると、アプリケーション ログに "APPCRASH" が記録されるはずで、WER のレジストリ設定をしておけばそのプロセスのダンプが自動生成されるはずです。
    もしそれでもダンプが自動生成されないのであれば、該当アプリの「動作を停止しました」ダイアログが出たタイミングでタスク マネージャから採取すれば代用できるかも。

    ダンプ解析は WinDBG でも確認できます。
    もっとも質問者さんが参照しているサイトでは、「いきなりハードコアにやる必要はないんですね。Visual Studioによる解析がもっともイージーだと思いますし」と、お勧めしていないようですが。
    私は WinDBG の方が慣れているので、Visual Studio でのダンプ解析はほとんどやったことがありません。

    もし WinDBG を使って解析するなら。。。
    下記サイトが参考になると思います。
    --------------------------------------------------------
    Debugging Managed Code Using the Windows Debugger
    https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-managed-code

    SOS.dll (SOS デバッガー拡張)
    https://docs.microsoft.com/ja-jp/dotnet/framework/tools/sos-dll-sos-debugging-extension
    --------------------------------------------------------

    • 回答としてマーク jhashimoto 2018年9月26日 4:54
    2018年9月21日 8:00
  • > .NET 3.5をターゲットにしたプロセスのダンプで、どのようにすればそれができるのでしょうか?

    Visual Studio ではできないので、すでに提案されているとおり、WinDbg + SOS 拡張を使って頑張ってください。

    Visual Studio のダンプを解析する機能は比較的新しい世代のものであり、.NET 4.0 以上のみです。
    "with 3.5 and earlier you only get native debugging"
    from https://blogs.msdn.microsoft.com/tess/2009/06/16/first-look-at-debugging-net-4-0-dumps-in-visual-studio-2010/

    2018年9月21日 13:30
    モデレータ
  • ご回答ありがとうございます。

    .NET 3.5ではVisual Studioによるダンプの解析はできないということで、理解しました。

    WinDbgを使用することにします。


    プログラマーな日々(Blog):http://blog.jhashimoto.net/

    IT勉強会・セミナーまとめWiki:http://itstudy.jhashimoto.net/

    2018年9月26日 4:56