none
CodeDomで実行時に生成したコードのデバッグ方法(ステップイン、ウォッチ、ブレークポイントなど) RRS feed

  • 質問

  • メインのプログラム内からCodeDomProviderを利用しサブプログラムを自動生成しています。

    生成、実行は問題ないのですが、サブプログラム内をVisualStudioで行う様な、ステップイン、変数のウォッチ、ブレークポイントを置きデバッグなどをする必要がでてきました。

    使用するアセンブリや、クラスがわからず、”CodeDom PDB”のキーワードでネット上を検索しているのですが、参考になるページが見つかりませんでした。

    何か参考になるページや、必要な情報のキーワードを教えていただけませんでしょうか?

    よろしくお願いします。

     

    2010年9月1日 8:38

すべての返信

  • 次のような方法はどうでしょうか?
    1. CodeDom で動的に生成したサブプログラムをファイルに出力する
    2. 出力したファイルを使って簡単なプロジェクトを作成する
    3. プロジェクトをデバッグする


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月1日 10:30
  • どのメソッドを使って、どこまでやっているのでしょうか?

    コンパイルまでやっているのであれば、CompilerParameters.IncludeDebugInformation あたりを設定することが必要だとみられます。
    (それだけで十分かは未検証)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年9月1日 14:29
    モデレータ
  • アドバイスありがとうございます。

    業務アプリを作成しており、ユーザーが作成したサブプログラムをユーザーによってデバッグする形をとりたいと思っています。

    なのでVSはできる限り起動させないようにしたいと思います。

    ハンバーグおいしそうですね。

    2010年9月1日 23:44
  • アドバイスありがとうございます。

                Using cp As CodeDomProvider = CodeDomProvider.CreateProvider("VisualBasic")
                    Dim cps As New CompilerParameters
                    Dim cres As CompilerResults
                    cps.GenerateInMemory = True
                    cps.IncludeDebugInformation = True
                    cps.ReferencedAssemblies.Add("halcondotnet.dll")
                    cres = cp.CompileAssemblyFromSource(cps, [source])

                    If cres.Errors.HasErrors = False Then
                        Dim asm As [Assembly] = cres.CompiledAssembly
                        InspectFunction = asm.GetType("MainClass")
                        Return True
                    Else
                        Return False
                    End If
                End Using

    のような感じでサブプログラムを作成し

    InspectFunction.InvokeMember

    で呼び出しております。

    IncludeDebugInformation でデバッグ情報を組み込むことができるのはわかりましたが、それをどのように使ったらいいのかがわかりません。

    VSの機能でプロセスのアタッチができ、PDBを使ってデバッグができるらしいのですが、できる限りVSを起動せず、メインプログラム内でトレース、ウォッチを動作させたいと思います。

    現在SharpDevelopをトレースしながら中身を探っているのですがなかなか手ごわいです。

    2010年9月2日 0:04
  • どのメソッドを使って、どこまでやっているのでしょうか?

    コンパイルまでやっているのであれば、CompilerParameters.IncludeDebugInformation あたりを設定することが必要だとみられます。
    (それだけで十分かは未検証)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。


    ICorDebug インターフェイスにたどり着きました。

    これを深く調べていこうと思います。間違ってないでしょうか?

    2010年9月2日 3:09
  • CodeDom から生成したものを InvokeMember で呼び出す場合 ICorDebug はおそらく利用できません。現在のアプリケーション(B)をホストする起動用の別プログラム(A)を用意する必要があるでしょう。

    A.exe(ICorDebug を使用するだけの小さなプログラム) → B.exe(ICorDebug の対象、CodeDom を利用してデバッグしたいコードを動かす)

    みたいなかんじですかね。

    > 業務アプリを作成しており、ユーザーが作成したサブプログラムをユーザーによって
    > デバッグする形をとりたいと思っています。

    私なら(時間や予算がどれぐらいとれるかによりますが) PowerShell を内蔵して独自の簡易デバッガを提供しますかね。これならかなり簡単にすみますし。

    # 製品の導入先に有償のVisualStudioを含めたくないというだけであれば、SDKに含まれるような無償のデバッガを使わせるのも手かもしれません。

    2010年9月2日 7:15
  • VSの機能でプロセスのアタッチができ、PDBを使ってデバッグができるらしいのですが、できる限りVSを起動せず、メインプログラム内でトレース、ウォッチを動作させたいと思います。

    デバッガを作りたいと言うことですか?
    ICorDebug を使ったことはないのですが、自分自身のプロセスをデバッグすることはできないと推測されます。
    (ブレークしたら、自分自身も止まるので)

    すでに提案されているように、対象のプロセスを別プロセスとして起動するか、独自のデバッガの仕組みを用意するべきかと思われます。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年9月2日 14:01
    モデレータ