2009-10-26 4 views
11

Я создаю инструмент внутреннего разработчика для управления различными процессами, обычно используемыми в нашей среде разработки. Инструмент отображает список контролируемых процессов, указывает их рабочее состояние и позволяет запускать или останавливать каждый процесс.Как подключить отладчик динамически к определенному процессу

Я хотел бы добавить функциональность прикрепления отладчика к контролируемому процессу из своего инструмента вместо того, чтобы идти в «Debug-> Attach to process» в визуальной студии и находить процесс.

Моя цель состоит в том, чтобы иметь что-то вроде Debugger.Launch(), который отобразит список доступной визуальной студии. Я не могу использовать Debugger.Launch(), потому что он приветствует отладчик процесса, выполняющего вызов. Мне нужно что-то вроде Debugger.Launch (processId).

Кто-нибудь знает, как добиться этой функциональности?

Решение может состоять в том, чтобы реализовать команду в каждом контролируемом процессе, чтобы вызвать Debugger.Launch(), когда команда получена из инструмента мониторинга, но я бы предпочел бы что-то, что не требует изменения кода отслеживаемых процессов ,

Боковой вопрос: При использовании Debugger.Launch() экземпляры Visual Studio, у которых уже есть отладчик, не указаны. Visual Studio не ограничивается одним прикрепленным отладчиком, вы можете присоединить его к нескольким процессам, используя «Debug -> Attach to process».

Кто-нибудь знает, как обойти это ограничение при использовании Debugger.Launch() или альтернативы?

ответ

14

Коллега закончилась с решением, использующим DTE, я разместил код на PasteBin.

методы интерес AttachVisualStudioToProcess и TryGetVsInstance

Source Code

public static void AttachVisualStudioToProcess(Process visualStudioProcess, Process applicationProcess) 
{ 
    _DTE visualStudioInstance; 

    if (TryGetVsInstance(visualStudioProcess.Id, out visualStudioInstance)) 
    { 
     //Find the process you want the VS instance to attach to... 
     DTEProcess processToAttachTo = visualStudioInstance.Debugger.LocalProcesses.Cast<DTEProcess>().FirstOrDefault(process => process.ProcessID == applicationProcess.Id); 

     //Attach to the process. 
     if (processToAttachTo != null) 
     { 
      processToAttachTo.Attach(); 

      ShowWindow((int)visualStudioProcess.MainWindowHandle, 3); 
      SetForegroundWindow(visualStudioProcess.MainWindowHandle); 
     } 
     else 
     { 
      throw new InvalidOperationException("Visual Studio process cannot find specified application '" + applicationProcess.Id + "'"); 
     } 
    } 
} 

private static bool TryGetVsInstance(int processId, out _DTE instance) 
{ 
    IntPtr numFetched = IntPtr.Zero; 
    IRunningObjectTable runningObjectTable; 
    IEnumMoniker monikerEnumerator; 
    IMoniker[] monikers = new IMoniker[1]; 

    GetRunningObjectTable(0, out runningObjectTable); 
    runningObjectTable.EnumRunning(out monikerEnumerator); 
    monikerEnumerator.Reset(); 

    while (monikerEnumerator.Next(1, monikers, numFetched) == 0) 
    { 
     IBindCtx ctx; 
     CreateBindCtx(0, out ctx); 

     string runningObjectName; 
     monikers[0].GetDisplayName(ctx, null, out runningObjectName); 

     object runningObjectVal; 
     runningObjectTable.GetObject(monikers[0], out runningObjectVal); 

     if (runningObjectVal is _DTE && runningObjectName.StartsWith("!VisualStudio")) 
     { 
      int currentProcessId = int.Parse(runningObjectName.Split(':')[1]); 

      if (currentProcessId == processId) 
      { 
       instance = (_DTE)runningObjectVal; 
       return true; 
      } 
     } 
    } 

    instance = null; 
    return false; 
} 
+0

Вы создали для этого пользовательский VS-плагин? Или как вы «подключили его»? У меня такая же потребность. Я смотрю с вашим кодом здесь, но ищу, как вы подключили его в своем конечном решении. Благодарю. – granadaCoder

+0

Мы не создали плагин VS, мы использовали этот код в настраиваемом инструменте, который контролирует наши процессы продукта. –

+0

Ок. Я смог использовать это. Я бы дал вам ответ ... 3 «Upvotes», если бы мог. – granadaCoder

12

Windbg по умолчанию отлаживает цепочку для собственного кода. Если вы хотите запустить еще один экземпляр Visual Studio, проверьте Launch the Debugger Automatically на MSDN:

Чтобы автоматизировать существующий отладчик, используйте Marshal.GetActiveObject, чтобы получить текущий EnvDTE.Debugger, а затем присоедините его к процессу, который вы только что создали.

Иногда вам может потребоваться отладить код запуска для приложения, запускаемого другим процессом. Примеры включают службы и пользовательские действия по настройке. В этих сценариях вы можете запускать отладчик и автоматически присоединяться при запуске приложения.

Чтобы установить приложение, чтобы запустить отладчик автоматически

  1. Запустите редактор реестра (Regedit).

  2. В редакторе реестра откройте папку HKEY_LOCAL_MACHINE.

  3. Перейдите к HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ образному файлу.

  4. В папке Параметры файла образа найдите имя приложения, которое вы хотите отлаживать, например myapp.exe. Если вы не можете найти приложение, которое хотите отладить:

    a. Щелкните правой кнопкой мыши папку «Параметры файла изображения», а в контекстном меню щелкните Новый ключ.

    b.Щелкните правой кнопкой мыши новый ключ и в контекстном меню нажмите Переименовать.

    c. Измените имя ключа на имя вашего приложения; myapp.exe, в этом примере.

  5. правой кнопкой мыши папку myapp.exe, и в контекстном меню выберите New String Значение.

  6. Щелкните правой кнопкой мыши новое значение строки и в контекстном меню выберите Переименовать.

  7. Измените название на debugger.

  8. Щелкните правой кнопкой мыши новое значение строки и в контекстном меню выберите . Изменить.
    Появляется диалоговое окно «Редактирование строки» .

  9. В Значение данных поле типа vsjitdebugger.exe.

  10. Щелкните ОК.

  11. Из реестра меню, нажмите кнопку Выход .

  12. Каталог, содержащий vsjitdebugger.exe, должен быть в вашем системном пути. Чтобы добавить его в системный путь, выполните следующие шаги:

    a. Откройте панель управления в классическом виде и дважды щелкните Система.

    b. Щелкните Дополнительные настройки системы.

    c. В Свойства системы, перейдите на вкладку Продвинутый.

    d. На вкладке Advanced щелкните Переменные среды.

    e. В диалоговом окне Переменные среды, под номером Системные переменные, выберите Путь, затем нажмите кнопку Редактировать.

    f. В диалоговом окне Edit System Variable добавьте каталог в поле Значение переменной. Используйте точку с запятой, чтобы отделить ее от других записей в списке.

    g. Щелкните OK, чтобы закрыть Редактировать системную переменную диалоговое окно.

    h. Щелкните OK, чтобы закрыть Переменные среды диалоговое окно.

    i. Щелкните OK, чтобы закрыть Свойства системы диалоговое окно.

Теперь, используйте любой способ для запуска своего приложения. Visual Studio запустит и загрузит приложение.

+0

Ссылку вы предоставили указать, как начать процесс с отладчика прилагается. Я хочу присоединить отладчик к процессу, когда он уже запущен. После прочтения статьи я проверил документацию о vsjitdebugger и о том, что именно мне нужно: vsjitdebugger -p ProcessId. Спасибо, что указал мне в этом направлении. Любая идея, как подключиться к визуальной студии, находящейся в режиме отладки? Список Visual Studio, показанный в «Visual Studio Just-in-time debugger», не отображает их. –

+0

Что значит? подключить отладчик к Visual Studio, который отлаживает что-то еще? Для чего это полезно? –

+0

Я хочу отлаживать несколько процессов, используя только один экземпляр visual studio. Это можно сделать из «Debug -> Attach to process», но диалог JIT Debugger не показывает экземпляры Visual Studio, которые находятся в режиме отладки. –

6

Я сомневаюсь, что вы все еще ищете, но вот некоторая информация о том, как вы можете программно присоединить отладчик к нескольким процессам:

Attach to locally running processes

Attach to remotely running processes

+0

Это не ответ. –

+0

Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259), чтобы включить здесь основные части ответа и предоставить ссылку для справки. – Kev

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