2012年4月21日土曜日

~は動作を停止しました (CLR20r3:MDbg.exe編)

初めての方は、前編をご覧ください。

今回は、
.NET SDK コマンド ライン デバッガ (MDbg.exe) を用いて進めていきます。

.NET Framework 2.0 SDK等、SDKを入れていないと使えません。納品先等で活用したい場合は、持ち運ぶ等の工夫をします。

使用の際の注意点を:

Error: デバッグ対象とデバッガが互換性のないプラットフォームにあるので、操作に失敗しました。 (HRESULT からの例外: 0x80131C30)

32ビット版・64ビット版の区別、つまりPlatformの区別が有ります。

64ビット版(x64)の.NET Frameworkで動いているプログラムにアタッチするには、64ビット版のSDKに含まれているMDbg.exeを使います。

つまり「デバッガのPlatform=アタッチ先のPlatform」となるように、Platformを合わせる必要が有ります。

起動:

C:\Program Files\Microsoft.NET\SDK\v2.0 64bit\Bin>Mdbg.exe

MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".

mdbg>

a」コマンドで、アタッチ可能なプロセス一覧を表示します。

mdbg> a
Please choose some process to attach
Active processes on current machine:
(PID: 968) C:\Proj\FNF\bin\Debug\FNF.exe
        (ID: 1) FNF.exe
(PID: 4020) C:\Proj\FNF\bin\Debug\FNF.vshost.exe
        (ID: 1) FNF.vshost.exe


a 968」を、実行。968番にアタッチします。

mdbg> a 968
[p#:0, t#:0] mdbg>


ちょっとプロンプトが変わりました。

p -d」で、デバッガ変数の一覧を表示します。例外落ちで停止しているので、$exが現れています。

[p#:0, t#:0] mdbg> p -d
$ex=System.ComponentModel.Win32Exception
$thread=System.Threading.Thread


p $ex」で、例外情報を見ます。

[p#:0, t#:0] mdbg> p $ex
$ex=System.ComponentModel.Win32Exception
        nativeErrorCode=2
        _className=<null>
        _exceptionMethod=<null>
        _exceptionMethodString=<null>
        _message="指定されたファイルが見つかりません。"
        _data=<null>
        _innerException=<null>
        _helpURL=<null>
        _stackTrace=array [192]
        _stackTraceString=<null>
        _remoteStackTraceString=<null>
        _remoteStackIndex=0
        _dynamicMethods=<null>
        _HResult=-2147467259
        _source=<null>
        _xptrs=0
        _xcode=-532459699


情報が見えてきました。

w」で、スタックトレースを見ます。

[p#:0, t#:0] mdbg> w
Thread [#:0]
*0. System.Diagnostics.Process.StartWithShellExecuteEx (source line information unavailable)
 1. System.Diagnostics.Process.Start (source line information unavailable)
 2. FNF.Program.Run (Program.cs:13)
 3. FNF.Program.Main (Program.cs:9)


Process.Startの中でトラぶっているのが判ります。

これで大体の原因は判ると思います。

それで、今回の例外落ちプログラムのソースコードは次のようになっています:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace FNF {
    class Program {
        static void Main(string[] args) {
            new Program().Run();
        }

        private void Run() {
            Process.Start(Guid.NewGuid().ToString("N") + ".exe");
        }
    }
}

0 件のコメント:

コメントを投稿