3

実行中の .NET プロセスにロードされたすべての異なるタイプのリストを出力したいと考えています。私の計画は、最終的にこれに基づいて GUI アプリを構築することなので、サードパーティのツールではなく、自分のコードからこれを行いたいと考えています。私の最善の策は、MDbgCore を使用して実行中のプロセスにアタッチし、次に MDbgProcess.AppDomains を使用して CorAppDomain オブジェクトを取得し、オブジェクト モデルを試してみることです。

ただし、私の人生では、他のプロセスを停止して AppDomains を確認することはできません。私は次のようなコードを使用しています (これは、Mike Stall のブログのコードに基づいています) 。

    [MTAThread] // MDbg is MTA threaded
    static void Main(string[] args)
    {
        MDbgEngine debugger = new MDbgEngine();

        debugger.Options.StopOnModuleLoad = true;

        // Launch the debuggee.            
        int pid = Process.GetProcessesByName("VS2010Playground")[0].Id;
        MDbgProcess proc = debugger.Attach(pid);
        if (proc.IsAlive)
        {
            proc.AsyncStop().WaitOne();

            Console.WriteLine(proc.AppDomains.Count);
            if (proc.AppDomains.Count > 0)
            {
                Console.WriteLine(proc.AppDomains[0].CorAppDomain);
            }
        }

        Console.WriteLine("Done!");
    } 

これは以下を出力します:

MDbgPlayground.exe
0
Done!

debugger.Options.Stop* のさまざまなフレーバーを試しました。すべてのメソッドを繰り返し処理し、それらすべてにブレークポイントを設定することを考えましたが、Modules リストも繰り返し処理できません。debugger.Options.Trace を試してみましたが、それはターゲット アプリをトレースするのではなく、TraceListeners を使用して MDbg の実行をトレースすることに関係しています。

noddy デバッガー アプリをリリース モードで実行し、ターゲットをデバッグ モードで実行しています。私は Visual C# 2010 を使用していますが、頭がいっぱいです。誰でもこれに光を当てることができますか?

4

3 に答える 3

0

ちょっといじって、このようなことを試してみてください(必要に応じて変更する必要があるかもしれません)...

        foreach (Process process in Process.GetProcesses())
        {
            try
            {
                Assembly test = Assembly.LoadFrom(process.MainModule.FileName);
                Console.WriteLine(test.FullName);

                foreach (Type type in test.GetTypes())
                    Console.WriteLine(type.FullName);
            }
            catch
            {
                continue;
            }
        }
于 2010-04-28T21:08:56.023 に答える
0

いくつかの理由で、変数debugger.Processs.Activeの代わりに使用する必要があります。また、前にproc電話する必要があります。最終的なコードdebugger.Go()AsyncStop

[MTAThread] // MDbg is MTA threaded
static void Main(string[] args)
{
    MDbgEngine debugger = new MDbgEngine();

    debugger.Options.StopOnModuleLoad = true;

    // Launch the debuggee.            
    int pid = Process.GetProcessesByName("VS2010Playground")[0].Id;
    MDbgProcess proc = debugger.Attach(pid);
    proc.Go();
    if (proc.IsAlive)
    {
        proc.AsyncStop().WaitOne();

        Console.WriteLine(debugger.Process.Active.AppDomains.Count);
        if ((debugger.Process.Active.AppDomains.Count > 0)
        {
            Console.WriteLine((debugger.Process.Active.AppDomains[0].CorAppDomain);
        }
    }

    Console.WriteLine("Done!");
} 
于 2013-05-09T13:28:15.143 に答える
0

これはそれほど簡単ではありません。この問題の特定のソース コードはありませんが、次のように疑似コードを作成します。

  • Mdbg プロセスを停止します。
  • 新しい AppDomain をセットアップします (混合アプリには .NET2 アセンブリと .NET4 アセンブリを含めることができるため、現在の appdomain でそれらを反映すると例外がスローされる可能性があります!!)

    System.AppDomain tempDomain=System.AppDomain.CreateDomain("ReflectionOnly");

  • MDbgProcess.Modules を反復処理し、Assembly.ReflectionOnlyLoad を使用して、リフレクションのみのアプリケーション ドメインにロードします (リフレクション操作のために .NET アセンブリをロードし、その後アンロードする方法を参照してください) 。

  • tempDomain のアセンブリを反復処理する
  • アセンブリごとに、型のリストを取得します
  • Type.Name を報告する
  • tempDomain のアンロード
  • MDbgProcess.Go を呼び出す
于 2012-08-09T09:19:47.403 に答える