QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

JITデバッグについて

いつも参考にさせて頂いております。
JITデバッグについて質問させて下さい。
開発環境:WindowsXPPro、言語:VB.netでWindowsアプリケーションを開発しております。作成したプログラム実行時に、エラー処理が設定されていなかったり、Frameworkのバグ等でハンドルされない例外が発生した場合に自動で表示されるダイアログボックスに表示されるJITデバッグの有効化の方法について教えて下さい。
ダイアログボックスではJITデバッグを有効にしてコンパイルし、machine.configファイルを以下の様に編集する事でこのJITデバッグが有効となるといってるのですが、このように設定してもJITデバッグが起動しません。
まだ他に何か設定が必要なのでしょうか?ご存知の方がいましたらご教授下さいます様お願いいたします。

以下、ダイアログボックス文言引用
Just-In-Time (JIT) デバッグを有効にするには、
このアプリケーション、またはコンピュータ (machine.config) の構成ファイルの
jitDebugging 値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを有効にしてコンパイルされなければなりません。
machine.config編集例 :

質問者:道の駅

回答

昨晩ひたすらはまって、ようやく結論が出たような気がしますが、道の駅さんにこれが当てはまるかどうかは不明です...。

どうも.NET Framework 1.0のこの機能には奇妙なバグがあるみたいです。以下のコードを「csc.exe /t:winexe /debug+ frm.cs」でコンパイルしてEXEを作成します。



using System.Windows.Forms;
using System;
using System.Threading;

class Form1 : Form {
static void Main() {
Application.Run(new Form1());
}

Form1() {
TextBox t = new TextBox();
Controls.Add(t);
Button b = new Button();
b.Click += new EventHandler(b_c);
AcceptButton = b;
b.Left = t.Width;
Controls.Add(b);
}

void b_c(object o, EventArgs e) {
    throw new ApplicationException("hoge");
}
}

で、次の内容のfrm.exe.configを同じディレクトリに配置します。



<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

frm.exeを実行します。ENTERキーを押します。すると、「詳細、続行、終了」のダイアログボックスが出ます。jitDebuggingの設定は効いていないように見えます。

もう一度frm.exeを実行します。今度はマウスでボタンをクリックします。または、ボタンにフォーカスを当ててSPACEキーを押します。すると、JITデバッガへのアタッチダイアログボックスが出ます。あらびっくり、jitDebuggingの設定が効いています。

.NET Framework 1.1で同じコードを同じオプションでコンパイルし、同じ構成ファイルを使って試してみましたが、この場合はどちらの方法でもJITデバッガの画面が出ました。なので1.0のバグという結論に落ち着いたのですが、道の駅さんほうではいかがでしょうか?

投稿者:NothingButXMLInfoSet

編集 履歴 (0)

すみません、VB.NETでしたね。サンプルを書き直しました。これを「vbc /debug+ /t:winexe /r:System.dll,System.Windows.Forms.dll frm.vb」でコンパイルしてもやはり同じ現象になりました。



Imports System
Imports System.Windows.Forms

Class Form1 : Inherits Form
  Shared Sub Main()
    Application.Run(New Form1())
  End Sub
  Sub New()
    Dim t As TextBox = New TextBox()
    Controls.Add(t)
    Dim b As Button = New Button()
    AddHandler b.Click, AddressOf b_c
    b.Left = t.Width
    AcceptButton = b
    Controls.Add(b)
  End Sub
  Sub b_c(s As Object, e As EventArgs)
    Throw New ApplicationException("hoge")
  End Sub
End Class

投稿者:NothingButXMLInfoSet

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。