Как проверить причину сбоя Win32 CreateProcess () с помощью ProcMon. исключить GetLastError () - PullRequest
0 голосов
/ 17 марта 2020

У меня проблема с проверкой CreateProcess () причина сбоя, в работе был код, который не регистрирует GetLastError () при сбое CreateProcess (), поэтому я запускаю ProcMon, чтобы проверить причину но не может найти причину (Будет ли протокол ProMon регистрировать причину сбоя что-то вроде «C: \ dummy.exe путь не найден или разрешение отклонено»?).

Есть ли способ (инструменты?), Чтобы проверить, почему CreateProcess () дает сбой, не учитывая GetLastError ()?

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

int main()
{
    STARTUPINFO info = { sizeof(info) };
    PROCESS_INFORMATION processInfo;

    TCHAR dymmypath[_MAX_PATH] = _T("C:\\dummy.exe");
    static TCHAR TempPathString[_MAX_PATH];

    STARTUPINFO         si = { sizeof(si) };        //default set up
    PROCESS_INFORMATION pi;                     //data structure for CreateProcess

    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOWMINIMIZED;

    if (!CreateProcess(dymmypath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, TempPathString, &si, &pi))
    {
        printf("Failed");
    }
    else {
        printf("Success");
    }

    return 0;
}

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Я запускаю ProcMon, чтобы проверить причину, но не могу найти причину (Будет ли ProMMon регистрировать причину сбоя что-то вроде «C: \ dummy.exe путь не найден или разрешение отклонено»?).

Только если запрос достигает файловой системы, ie ищет файл EXE, который в вашем случае выглядит так, как будто он этого не делает, скорее всего из-за того, что CreateProcess() не может проверить ваши входные параметры прежде чем он попадет в файловую систему.

Есть ли способ (инструменты?), чтобы проверить, почему CreateProcess () не работает без учета GetLastError ()?

Как говорили другие Вы можете попробовать подключить отладчик к запущенному приложению и установить точку останова в самой функции CreateProcess.

Другой вариант - использовать такой инструмент, как API Monitor , который будет отображать вы сами вызовы API вашей программы, значения их параметров, сообщенные коды ошибок и т. д. c.

Я не могу отладить среду клиента (нет доступа ко мне), но я не могу измените код и предоставьте новую сборку

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

это занимает много времени из-за процесса.

Ну, это ваше ошибка в том, что вы не оптимизировали процесс сборки лучше или разбили свое приложение на более управляемые части, и т. д. c.

0 голосов
/ 17 марта 2020

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

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

Помимо отладки и обработки ошибок (logging et c), вам придется просто стань творческим. Сравните, например, рабочую среду с производством.

...