Как динамически подключить отладчик к определенному процессу - PullRequest
12 голосов
/ 26 октября 2009

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

Я бы хотел добавить функцию присоединения отладчика к отслеживаемому процессу из моего инструмента вместо того, чтобы идти в Отладка -> Присоединиться к процессу в Visual Studio и найти процесс.

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

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

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

Дополнительный вопрос:

При использовании Debugger.Launch() экземпляры Visual Studio, к которым уже подключен отладчик, не отображаются. Visual Studio не ограничивается одним подключенным отладчиком, вы можете подключиться к нескольким процессам при использовании Debug Присоединить к процессу .

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

Ответы [ 3 ]

15 голосов
/ 03 ноября 2011

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

Методы интереса AttachVisualStudioToProcess и TryGetVsInstance

Исходный код

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

    if (TryGetVsInstance(visualStudioProcess.Id, out visualStudioInstance))
    {
        //Find the process you want the Visual Studio 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;
}
12 голосов
/ 26 октября 2009

WinDbg по умолчанию выполняет отладку цепочки для собственного кода. Если вы хотите запустить другой экземпляр Visual Studio, установите флажок Автоматически запускать отладчик на MSDN:

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

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

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

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

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

  3. Перейдите к HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ опции выполнения файла изображения.

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

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

    .

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

    .

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

  5. Щелкните правой кнопкой мыши папку myapp.exe и в контекстном меню выберите Новое значение строки .

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

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

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

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

  10. Нажмите OK .

  11. В меню Реестр нажмите Выход .

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

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

    б. Нажмите Расширенные настройки системы .

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

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

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

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

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

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

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

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

6 голосов
/ 10 июня 2010

Вот некоторая информация о том, как программно подключить отладчик к нескольким процессам:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...