如何使用 ProcMon 检查 Win32 CreateProcess() 失败的原因。排除 GetLastError()

How to check Win32 CreateProcess() failed reason using ProcMon. exclude GetLastError()

我在检查 CreateProcess() 失败原因时遇到问题,生产中有一段代码在 CreateProcess() 失败时不记录 GetLastError() 所以我运行 ProcMon 检查原因但无法找到原因(procMon 会记录类似 "C:\dummy.exe path not found or permission denied" 的失败原因吗?)。

有没有一种方法(工具?)可以在不考虑 GetLastError() 的情况下检查 CreateProcess() 失败的原因?

我无法调试客户环境(无法访问我),但我可以更改代码并提供新版本,由于流程需要很长时间。我目前正在寻找可用的快速选项。以下是示例代码,并非确切的生产代码。

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;
}

乍一看,我看到 TempPathString 被初始化为 "",这不是有效路径。因此,当您解决该问题时,您就有机会添加适当的错误处理。

您正在寻找的工具是调试器。您应该附加您选择的调试器,在 CreateProcess 的 return 上设置一个断点,然后检查那里的错误。

除了调试和错误处理(日志记录等)之外,您还必须发挥创意。例如,将工作环境与生产环境进行比较。

i am running ProcMon to check the reason but unable to find the reason (Will procMon log the failure reason something like "C:\dummy.exe path not found or permission denied" ?).

仅当请求到达文件系统时,即查找 EXE 文件,在您的情况下,这听起来好像没有这样做,可能是因为 CreateProcess() 未能在它之前验证您的输入参数进入文件系统。

Is there a way (tools ?) to check why CreateProcess() is failing without considering GetLastError() ?

正如其他人所说,您可以尝试将调试器附加到您的 运行 应用程序,并在 CreateProcess 函数本身中放置一个断点。

另一种选择是使用像 API Monitor 这样的工具,它将向您显示实际的 API 调用您的程序、它们的参数值是什么、报告的错误代码等。

I can't debug customer environment (no access to me) but I can change the code & provide new build

那么这就是你应该做的。修复您的代码以正确记录错误代码,不要再忽略它们。

it takes long time due to process.

嗯,这是你自己的错,因为你没有更好地优化你的构建过程,或者没有将你的应用程序分解成更易于管理的部分,等等。