Как отладить исполняемый файл, работающий через планировщик Windows? - PullRequest
2 голосов
/ 26 февраля 2009

Я использую планировщик Windows, чтобы запустить исполняемый файл, который я написал.

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

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

Ответы [ 5 ]

5 голосов
/ 26 февраля 2009

Вы можете просто вызвать 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, чтобы использовать эту функцию).

2 голосов
/ 26 февраля 2009

См. Этот вопрос переполнения стека Как я могу использовать DebugBreak в C #

1 голос
/ 26 февраля 2009

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

Есть несколько ошибок с таким подходом:

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

1 голос
/ 26 февраля 2009

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

0 голосов
/ 26 февраля 2009

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

...