gpt4 book ai didi

c++ - Windows 7 - CreateProcess w/DEBUG_PROCESS 访问冲突

转载 作者:可可西里 更新时间:2023-11-01 14:45:47 28 4
gpt4 key购买 nike

好吧...在这个问题上筋疲力尽...整天抓耳挠腮。我有一个非常简单的单一用途 c++ DLL (StartApplication.dll) 用于启动应用程序。

  • 在 WinXP 中工作正常,但在 win7 中不工作
  • 将 CreateProcess() 与 DEBUG_PROCESS 结合使用(这样我就可以在终止之前等待程序完成)。
  • 如果我在任务管理器中监控进程,我可以看到进程启动,但没有创建窗口,也没有进一步发生
  • 如果我更改为 NORMAL_PRIORITY_CLASS,程序将按预期执行(但我无法在终止前等待,因为我只能在调试时执行此操作)
  • 错误代码给我 STATUS_ACCESS_VIOLATION
  • 我关闭了 UAC 并将可执行文件设置为以管理员身份运行并与 WinXP 兼容,但没有任何作用

这是代码。任何想法将不胜感激

    //...blah blah...handful of stuff preceding this to set up command line and
//directories etc....not of use here probably...

SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;

STARTUPINFO si = {0}; si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;

si.hStdOutput = (NULL == stdOutFileName)? INVALID_HANDLE_VALUE :
::CreateFile(stdOutFileName, GENERIC_WRITE, FILE_SHARE_READ, &sa
, CREATE_ALWAYS, 0, NULL);

si.hStdError = (NULL == stdErrFileName)? INVALID_HANDLE_VALUE :
::CreateFile(stdErrFileName, GENERIC_WRITE, FILE_SHARE_READ, &sa
, CREATE_ALWAYS, 0, NULL)
PROCESS_INFORMATION pi = {0};
if (::CreateProcess(useApplicationName? applicationName : NULL, processCommandLine
, NULL, NULL, TRUE, /*NORMAL_PRIORITY_CLASS*/DEBUG_PROCESS, NULL, currentDirectory, &si, &pi))
{
BOOL cont = TRUE;
while (cont)
{
DWORD continueStatus = DBG_CONTINUE;

DEBUG_EVENT debugEvent = {0};
if (!::WaitForDebugEvent(&debugEvent, INFINITE))
{
errorCode = ErrorCode_Other;
::TerminateProcess(pi.hProcess, 0);
break;
}
else
{
switch (debugEvent.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
switch (debugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
case EXCEPTION_DATATYPE_MISALIGNMENT:
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
case EXCEPTION_FLT_DENORMAL_OPERAND:
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
case EXCEPTION_FLT_INEXACT_RESULT:
case EXCEPTION_FLT_INVALID_OPERATION:
case EXCEPTION_FLT_OVERFLOW:
case EXCEPTION_FLT_STACK_CHECK:
case EXCEPTION_FLT_UNDERFLOW:
case EXCEPTION_INT_DIVIDE_BY_ZERO:
case EXCEPTION_INT_OVERFLOW:
case EXCEPTION_PRIV_INSTRUCTION:
case EXCEPTION_IN_PAGE_ERROR:
case EXCEPTION_ILLEGAL_INSTRUCTION:
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
case EXCEPTION_STACK_OVERFLOW:
case EXCEPTION_INVALID_DISPOSITION:
case EXCEPTION_INVALID_HANDLE:
errorCode = ErrorCode_ApplicationException;
*exceptionCode = debugEvent.u.Exception.
ExceptionRecord.ExceptionCode;
::TerminateProcess(pi.hProcess, 0);
break;
default:
;
}
break;

case EXIT_PROCESS_DEBUG_EVENT:
cont = FALSE;
break;
default:
;
}
::ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId
, continueStatus);
}
}

::GetExitCodeProcess(pi.hProcess, reinterpret_cast<LPDWORD>(exitCode));

::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
if (INVALID_HANDLE_VALUE != si.hStdOutput)
::CloseHandle(si.hStdOutput);
if (INVALID_HANDLE_VALUE != si.hStdError)
::CloseHandle(si.hStdError);

return errorCode;

最佳答案

您的代码在第一个异常发生后终止整个过程。通常你应该让程序处理异常,只有当异常没有被处理时,进程才会终止。

要查看异常是否是致命的(即第一次未处理)检查 u.Exception.dwFirstChance:

  • 如果为 0,则相应地设置错误代码并终止。
  • 否则,第一次发生异常,您应该调用ContinueDebugEventDBG_EXCEPTION_NOT_HANDLED将异常传递给进程。

编辑

如果您只想观察异常而不是从调试器内部处理它们,您应该始终继续 DBG_EXCEPTION_NOT_HANDLED

有一个问题:

就在主线程启动之前,Windows 引发了一个 INT3 异常,该异常需要传递给进程 (DBG_CONTINUE)。

伪代码:

bool FirstInt3 = true;

while (cont)
{
DWORD continueStatus = DBG_EXCEPTION_NOT_HANDLED;

// ....

switch(...)
{
case EXCEPTION_DEBUG_EVENT:
if(!FirstChance)
{
// Fatal exception

// Log Exception that terminated the program here
// Don't do anything else, Windows automatically terminates the process
// You will get an EXIT_PROCESS_DEBUG_EVENT on the next event
}
switch (debugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_BREAKPOINT:
if(FirstInt3)
{
FirstInt3 = false;
continueStatus = DBG_CONTINUE;
break;
}
default:
// Log ExceptionCode here
break;
}
break;
}

关于c++ - Windows 7 - CreateProcess w/DEBUG_PROCESS 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com