2010-04-28 5 views
3

Я хочу распечатать список всех типов, загруженных в выполняемый .NET-процесс. Мой план состоит в том, чтобы в конечном итоге создать графическое приложение на основе этого, поэтому я хочу сделать это из своего кода, а не стороннего инструмента. Я считаю, что лучше всего использовать MDbgCore для присоединения к текущему процессу, а затем использовать MDbgProcess.AppDomains для получения объектов CorAppDomain и попытаться пройти объектную модель вниз.Как программно перечислять типы в запущенном .NET-процессе с помощью MDbg?

Однако я не могу на всю жизнь остановить другой процесс и увидеть любые AppDomains. Я использую подобный код (который я на основе кода из Mike Stall's blog)

[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 * , Я думал об итерации по всем методам и установке точек останова для всех из них, но я не могу также перебирать список модулей. Я пробовал debugger.Options.Trace, но это связано с отслеживанием выполнения MDbg с использованием TraceListeners, а не для отслеживания целевого приложения.

Я запускаю свое приложение-отладчик в режиме деблокирования и цель в режиме отладки. Я использую Visual C# 2010, и я нахожусь в своем уме. Может ли кто-нибудь пролить свет на это?

ответ

0

Просто делает несколько попыток, попробуйте что-то вроде этого (возможно, потребуется изменить, как necesary) ...

 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; 
      } 
     } 
+0

Это не сработает - это будет показывать только типы, определенные в основной сборке этого процесса, а не типы, загружаемые в этот процесс во время выполнения. – TarkaDaal

0

Это не будет так легко. У меня нет конкретного исходного кода для этой проблемы, но я бы псевдо-код так:

  • Сделайте остановку на процесс MDBG
  • установки нового AppDomain (смешанные приложения могут иметь .NET2 и сборки .NET4, поэтому отражение их в текущем приложении может вызвать исключение !!)

    System.AppDomain tempDomain = System.AppDomain.CreateDomain («ReflectionOnly»);

  • Итерации MDbgProcess.Modules и загрузить их в AppDomain для отражения только с помощью Assembly.ReflectionOnlyLoad (см How to load a .NET assembly for reflection operations and subsequently unload it?)

  • перебирает сборки в tempDomain
  • Для каждой сборки, получить список типов
  • Сообщить о Type.Name
  • Разгрузка tempDomain
  • Invoke MDbgProcess.Go
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!"); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^