2011-01-15 8 views
45

Visual Studio 2010 Professional EditionおよびWindows Vistaを使用しています。Visual Studioでのダンプファイルのデバッグ

まず、私はこのコードを持っています。あなたが見ることができるように、それはプログラムをクラッシュさせるでしょう!

using System; 

namespace Crash 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string a = null; 

      if (a.Length == 12) 
      { 
       // ^^ Crash 
      } 
     } 
    } 
} 

プログラムはif文でクラッシュします。さて、私はそれがif文でクラッシュしたことを知りたい。

Visual Studioから「デバッグなしで起動」すると、Crash.exeがクラッシュします。 1,356kbのメモリを使用します。私はプログラム/デバッグを閉じるのVistaオプションを取得します。デバッグを選択すると、Visual Studioの新しいインスタンスを開くことができ、ifステートメントでNullReferenceExceptionを指摘します。これはいい。

ここで別のコンピュータでクラッシュしたと仮定して、タスクマネージャでダンプファイルを私に渡すようにします。それは54,567kbです。なぜそんなに大!それは広大です!しかし、これは私にはあまり関心がある

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86 
Copyright (c) Microsoft Corporation. All rights reserved. 


Loading Dump File [C:\Users\Richard\Desktop\Crash.DMP] 
User Mini Dump File with Full Memory: Only application data is available 

Symbol search path is: SRV*C:\SYMBOLS*http://msdl.microsoft.com/download/symbols 
Executable search path is: 
Windows Server 2008/Windows Vista Version 6002 (Service Pack 2) MP (4 procs) Free x86 compatible 
Product: WinNt, suite: SingleUserTS Personal 
Machine Name: 
Debug session time: Sat Jan 15 11:07:36.000 2011 (UTC + 0:00) 
System Uptime: 0 days 4:24:57.783 
Process Uptime: 0 days 0:00:05.000 
........................ 
eax=002afd40 ebx=77afa6b4 ecx=002afd48 edx=00000001 esi=001cdaa4 edi=00000000 
eip=77bf5e74 esp=001cda5c ebp=001cdacc iopl=0   nv up ei ng nz ac pe cy 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000297 
ntdll!KiFastSystemCallRet: 
77bf5e74 c3    ret 

:とにかく、私はWindbgのにそのダンプを開くと、私は私の素人目に使用の非常に少ないの取得(少し)

ことにはあまり興味があります。私が知る限り、有用な出力を得るためにはコマンドを記述する必要があり、Visual Studioが優れています。

私はVisual Studioで開きます。私は「ネイティブのみでデバッグする」を選択することができますが、私はあなたのような人々を巧みにするための何かを意味するものをたくさん得ています。

enter image description here

enter image description here

だから、私の質問:

私は私のソースコードにVisual Studioのを表示するにはどうすればよい私は、これらの二つの画面を取得しますか?

また、ダンプファイルを小さくする方法はありますか?それは圧縮した後でさえ、とてつもなく大きいようです。私は、なぜプログラムのフットプリントよりほんの少し大きいものが存在せず、ソースコードとともに素晴らしいデバッグを得ることができないのか分かりません。

+0

Visual Studioに組み込まれているデバッガについてよく知っていますか?私はあなたの質問の一番下まで実際には読んでいませんでしたが、これがなぜあなたにとってうまくいかないのかは不明です。 –

+1

すべての正直なところ、私はそれに精通していないので、私はここに来た理由です。どこかで "Load source"ボタンがなければなりませんが、私はそれを見つけることができます... – niemiro

答えて

41

Visual Studio 2010でクラッシュダンプファイルをデバッグし、管理されたソースコードをステップ実行することができる多くのアドバタイズされた機能には、gotchaが付いています。それはonly for .NET 4.0 assembliesで動作します。ここで手順は次のとおりです。

  1. VS2010
  2. 内の溶液
  3. オープンオープン
  4. タスクマネージャを使用して.DMPファイル、別のコンピュータ上のクラッシュダンプファイルを作成します([ファイル] - > [開く]を...)
  5. Debug With Mixedをクリックします(これは.NET 4でのみ表示されます)。0)
  6. ソースコードを開き、あなたがネイティブにのみ関係しているのVisual Studioでのデバッグ限り例外

の正確な原因と場所を点検することができるようになりますと、WinDbgを以下で便利ではありません。

+0

ダンプが生成されたときにdllがネイティブアプリケーションに注入され、dllがクラッシュした理由を知りたいのですが?もちろん、DLLは.net4 +です。 – Guapo

+1

私も同じ問題に直面していますが、Visual Studioでソースコードを見ることはできません。私はNet 4.5とVS15を使用しています。 VSのダンプファイルでソースコードを取得するためのセットアップをしてください。 –

5

シンボルをロードできるように、関連するpdb(プログラムデータベース)ファイルをデバッガに提供する必要があります。また、より良い表示を得るために、Microsoft Public Symbolサーバーを使用してください。 This articleには情報が含まれています。

38

ここで使用しているツールは、管理対象プログラムのクラッシュを解決するためのものではありませんでした。 MinidumpsとWindbgは、CやC++で書かれたコードの何が間違っているかを知るために使うものです。非常に重要なツールは、実行時に管理されたプログラムをクラッシュさせることのできる種類のものをサポートしていない言語です。スタックトレースを持つ例外と同様です。

ミニダンプのサイズが大きく異なる理由は、ミニダンプのミニなのでです。設計上、プロセスの小さなスナップショットをキャプチャすることを意図していました。関連する引数はMiniDumpWriteDump functionのDumpTypeです。この関数には、デバッガセッションで使用する可能性が低いため、プロセス状態のどの部分を記録する必要がないかがわかる、賢いコードがあります。追加のダンプ・タイプ・フラグを指定することでオーバーライドできます。 Explorerが生成するミニダンプには、これらのフラグがすべてオンになっていれば、キットとキャブード全体が得られます。

実際には管理対象プログラムにとって非常に重要です。このミニダンプ作成者が使用する経験則は、アンマネージコードにのみ適切です。管理プログラムダンプのデバッグは、ダンプに収集されたガベージヒープ全体を含めるとうまくいきます。はい、それは大きなダンプになります、ミニはもはや適用されません。

次の問題は、ミニダンプデータからマシンビューの魂を得ていることです。スクリーンショットにマシンコードが表示されています。これらのショットでWindowsの内部にいる場合、ntdll.dllがスタックの上にどのようにあるのか注意してください。 mscorwks.dllエントリはCLRです。下から見ると、自分のコードからスタックフレームを見るべきです。ただし、JITコンパイラによって生成されたマシンコードが表示されます。あなたのC#コードではありません。

Windbgアドインがsos.dllという名前で、Windbgのコマンドセットを拡張して管理対象データを検査することができます。ちょうどいいヒットを得るためにgoogle "sos.dll"。しかし、これはまだのlooongです。あなたはVisual Studioデバッガからデバッグ体験を得ることができます。 MinidumpsをロードできるWindbgやVSデバッガとはまったく違って、マネージコードをよく認識しています。 Sosは本当にCLRのバグをトラブルシューティングするために設計されました。

現在表示されているミニダンプ情報ページ以外のVS2010では劇的な改善はありませんでした。実際にはあまり効果がありません。私は、デバッガチームがこれをToDoリストに載せていると思っています。克服すべきいくつかの根本的な問題があります。特にミニダンプ形式と作成コードの場合。 connect.microsoft.comを使用してフィードバックを提供し、注意を払い、投票を優先順位リストに反映させます。

+0

ありがとうございました!あなたは私にそんなに教えてくれました。私は本当に、あなたが私のためにしたことに本当に感謝しています。私を助けるために時間をとってくれてありがとう、ありがとう。私は「回答としてマーク」を切り替え続けます!非常に多くの素晴らしい答え(まあ、それはあなたのためです!)ありがとう、もう一度! – niemiro

+3

@全員:私は答えとして1つの投稿をマークすることができることを補うために、このたくさんのアップフォーを与えてください! – niemiro

関連する問題