如何使用 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.
嗯,这是你自己的错,因为你没有更好地优化你的构建过程,或者没有将你的应用程序分解成更易于管理的部分,等等。
我在检查 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.
嗯,这是你自己的错,因为你没有更好地优化你的构建过程,或者没有将你的应用程序分解成更易于管理的部分,等等。