case CORDBG_E_CANT_CALL_ON_THIS_THREAD:
output = "The function evaluation requires all threads to run.";
break;
+ case E_UNEXPECTED:
+ output = "Evaluation timed out, but function evaluation can't be completed or aborted. Debuggee have inconsistent state now.";
+ break;
default:
break;
}
}\r
};\r
\r
+ bool evalTimeOut = false;\r
auto WaitResult = [&]() -> HRESULT\r
{\r
ChangeThreadsState(THREAD_SUSPEND);\r
iCorEval2->RudeAbort();\r
}\r
\r
+ evalTimeOut = true;\r
iCorProcess->Continue(0);\r
}\r
+ // Wait for 5 more seconds, give `Abort()` a chance.\r
+ timeoutStatus = f.wait_for(std::chrono::milliseconds(5000));\r
+ if (timeoutStatus == std::future_status::timeout)\r
+ {\r
+ // Looks like can't be aborted, this is fatal error for debugger (debuggee have inconsistent state now).\r
+ iCorProcess->Stop(0);\r
+ m_evalResult.reset(nullptr);\r
+ LOGE("Fatal error, eval abort failed.");\r
+ return E_UNEXPECTED;\r
+ }\r
\r
auto evalResult = f.get();\r
IfFailRet(evalResult.get()->Status);\r
else\r
ret = m_evalCanceled ? COR_E_OPERATIONCANCELED : COR_E_TIMEOUT;\r
}\r
+ // In this case we have same behaviour as MS vsdbg and MSVS C# debugger - in case it was aborted with timeout, show proper error.\r
+ else if (evalTimeOut)\r
+ {\r
+ ret = (ret == E_UNEXPECTED) ? E_UNEXPECTED : COR_E_TIMEOUT;\r
+ }\r
\r
ChangeThreadsState(THREAD_RUN);\r
return ret;\r