初めての方は、前編をご覧ください。
今回は、
.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 件のコメント:
コメントを投稿