Как отладить исполняемый файл, запущенный через Планировщик Windows?

Я использую Планировщик Windows для запуска написанного мною exe.

Как я могу перейти в сеанс отладки, когда планировщик запускает мой exe?

Обновление 1. Я думал сделать Thread.Sleep, а затем присоединиться к процессу. Когда я попробовал, он говорит, что отладчик уже подключен к процессу ...

Ответов (4)

«Присоединиться к процессу» в меню отладки Visual Studio.

Вы можете установить ключ, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options который будет присоединять отладчик к процессу при его запуске. Вы можете прочитать, как это сделать, в этой статье базы знаний .

При таком подходе есть несколько недостатков:

Для отладки с использованием VS вам необходимо указать VSJitDebugger.exe в параметрах IFEO вашего исполняемого файла. Вам также необходимо указать механизм отладки, который будет использоваться вручную. Подробнее здесь .

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

Вы можете просто вызвать DebugBreak () из своей программы.

Согласно странице MSDN , DebugBreak делает следующее:

Вызывает исключение точки останова в текущем процессе. Это позволяет вызывающему потоку сигнализировать отладчику о необходимости обработки исключения.

Чтобы вызвать исключение точки останова в другом процессе, используйте функцию DebugBreakProcess.

Затем вы можете подключить свой отладчик на этом этапе и продолжить выполнение программы.

Единственная проблема с этим решением заключается в том, что вам нужно сделать DebugBreak () в коде условным, чтобы он не прерывался каждый раз при запуске программы. Возможно, вы добьетесь этого с помощью переменной среды, параметра реестра или параметра, который планировщик передает программе, чтобы гарантировать, что она не сработает при запуске.

Пример кода

Вот несколько непроверенных примеров кода, читающего переменную среды:

int main()
{
    char *debugBreakChar = getenv("DEBUG_BREAK");
    int debugBreak = atoi(debugBreakChar);
    if (debugBreak)
    {
        DebugBreak();
    }

    // Rest of the program follows here
}

Теперь все, что вам нужно сделать, это установить переменную среды как системную переменную и убедиться, что она доступна из того же контекста оболочки, что и планировщик (перезагрузка позволит добиться этого):

set DEBUG_BREAK=1

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

Переменные среды в этом отношении немного неудобны, поскольку они основаны на контексте, и вам нужно знать, что планировщик запускается из того же контекста среды. Значения реестра лучше, чем это, и вместо этого вы можете прочитать значение реестра, используя RegQueryValueEx в своем коде (вам нужно включить windows.h, чтобы использовать эту функцию).