57

Visual Studio 2010ProfessionalEditionとWindowsVistaを使用しています。

まず、私はこのコードを持っています。ご覧のとおり、プログラムがクラッシュします。

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です。なんでこんなに大きい!広大です!とにかく、私はそれにあまり興味がありません(少し)

Windbgでそのダンプを開くと、訓練を受けていない目にはほとんど役に立たなくなります。

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

しかし、これは私にはあまり興味がありません。私の知る限り、有用な出力を得るにはコマンドを書き込む必要があり、VisualStudioの方が優れています。

そこで、VisualStudioで開きます。「ネイティブのみでデバッグ」を選択することもできますが、あなたのような賢い人にとって何か意味のあるものがたくさんあります。私は賢くありません。次の2つの画面が表示されます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

だから、私の質問:

Visual Studioをソースコードに表示するにはどうすればよいですか?

また、より小さなダンプファイルを取得する方法はありますか?圧縮した後でも、途方もなく大きいようです。プログラムのフットプリントよりもほんの少し大きいだけで、ソースコードを使用して優れたデバッグを行うことができない理由がわかりません。

4

3 に答える 3

49

Visual Studio 2010でクラッシュダンプファイルをデバッグし、管理されたソースコードをステップ実行できる、広く宣伝されている機能には、落とし穴があります。これは、.NET4.0アセンブリでのみ機能します。手順は次のとおりです。

  1. タスクマネージャーを使用して、別のコンピューターにクラッシュダンプファイルを作成します
  2. VS2010でソリューションを開きます
  3. .DMPファイルを開きます([ファイル]-> [開く...])
  4. をクリックしますDebug With Mixed(これは.NET 4.0でのみ表示されます)
  5. ソースコードが開き、例外の正確な原因と場所を調べることができます

ネイティブのみを使用したデバッグに関する限り、VisualStudioはWinDbgよりも有用ではありません。

于 2011-01-15T11:59:07.587 に答える
47

ここで使用しているツールは、クラッシュした管理対象プログラムのトラブルシューティングを目的として設計されたものではありません。MinidumpsとWindbgは、CまたはC++で記述されたコードの何が問題になっているのかを調べるために使用するものです。非常に重要なツールです。これらは、クラッシュしたマネージドプログラムから取得できる種類の機能をランタイムがサポートしていない言語です。スタックトレースの例外のように。

ミニダンプのサイズが大きく異なるのは、ミニダンプのミニが原因です。設計上、プロセスの小さなスナップショットをキャプチャすることを目的としていました。関連する引数は、MiniDumpWriteDump関数のDumpTypeです。この関数には、デバッガセッションで使用する可能性が低いため、プロセス状態のどの部分を記録する必要がないかを判断できる非常に巧妙なコードがあります。追加のダンプタイプフラグを提供することでオーバーライドできます。Explorerが生成するミニダンプでは、これらのフラグがすべてオンになっているため、キット全体とcaboodleを入手できます。

これは、管理対象プログラムにとって実際には非常に重要です。このミニダンプ作成者が使用するヒューリスティックは、アンマネージコードにのみ適したものです。管理対象プログラムダンプのデバッグは、ガベージコレクションされたヒープ全体をダンプに含める場合にのみ適切に機能します。はい、それは大きなダンプになります、ミニはもう適用されません。

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

管理されたデータを検査できるようにWindbgのコマンドセットを拡張するsos.dllと呼ばれるWindbgアドインがあります。良いヒットを得るには、「sos.dll」をグーグルで検索してください。ただし、これは、 VisualStudioデバッガーから得られる種類のデバッグエクスペリエンスからはまだ遠い道のりです。これは、ミニダンプをロードできるWindbgやVSデバッガーとは異なり、マネージコードを密接に認識しています。Sosは、CLRのバグをトラブルシューティングするために実際に設計されました。

現在表示されているミニダンプ情報ページを除いて、VS2010には劇的な改善はありませんでした。これは実際にはほとんど何もしません。デバッガーチームがこれをやることリストに載せているのではないかと思います。確かに克服すべきいくつかの根本的な問題があります。特にミニダンプ形式と作成コードで。connect.microsoft.comを使用してフィードバックを提供します。フィードバックに注意を払い、投票が優先リストに影響を与えるようにします。

于 2011-01-15T12:11:52.143 に答える
5

シンボルをロードできるように、関連するpdb(プログラムデータベース)ファイルをデバッガーに提供する必要があります。また、より良いビューを取得するには、MicrosoftPublicSymbolサーバーを使用します。この記事にはそれに関する情報が含まれています。

于 2011-01-15T11:55:09.573 に答える