我準備寫在線評委核心,
一個程序,可以編譯用戶的代碼,並運行程序來檢查答案,如uva在線裁判。我可以在C#過程中使用SetErrorMode嗎?
而我在抓取下面提交程序的例外時遇到問題。
int main()
{
while(~scanf("%d %d",n,&m))
{
printf("%d\n",n+m);
}
return 0;
}
它的訪問在第一行被拒絕,因爲它將整數掃描到錯誤位置。
我怎樣才能捕捉我的過程運行時錯誤?
我曾經使用「try catch」來捕獲異常,
但它沒有回覆任何有關運行時錯誤的信息。
所以我只檢查提交程序的退出碼,雖然它不檢查,除了一個過程..
一個很好的方法,它顯示了像photo
我必須手動關閉該錯誤消息框,
我發現一個解決方案是使用SEH Handler DLL進程。
SetErrorMode(SEM_NOGPFAULTERRORBOX);
但我不知道如何在C#過程中使用它。
以下是我的判定機構代碼
timer = new Stopwatch();
timer.Reset();
submitProg = new Process();
submitProg.StartInfo.FileName = outputFile;
submitProg.StartInfo.UseShellExecute = false;
submitProg.StartInfo.CreateNoWindow = true;
submitProg.StartInfo.RedirectStandardInput = true;
submitProg.StartInfo.RedirectStandardOutput = true;
submitProg.StartInfo.RedirectStandardError = true;
submitProg.StartInfo.ErrorDialog = false;
submitProg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
submitProg.EnableRaisingEvents = true;
submitProg.Start();
timer.Start();
progInput = submitProg.StandardInput;
progOutput = submitProg.StandardOutput;
progInput.Write(inputStream.ReadToEnd());
submitProg.StandardInput.Close();
while (!submitProg.HasExited)
{
peakPagedMem = submitProg.PeakPagedMemorySize64;
peakVirtualMem = submitProg.PeakVirtualMemorySize64;
peakWorkingSet = submitProg.PeakWorkingSet64;
if (peakPagedMem > memLimit)
{
submitProg.Kill();
}
if (timer.ElapsedMilliseconds > timeLimit)
{
timeLimitExceed = true;
submitProg.Kill();
}
}
timeUsed = timer.ElapsedMilliseconds;
timer.Stop();
if(submitProg.ExitCode!=0)systemRuntimeError = true;
感謝您的幫助,爲我的英語很差很抱歉。
==================================
p.s.
問題是如何在C#中爲子進程設置錯誤模式。
我的英語不夠好解釋問題,所以很抱歉。 <(_ _)>
有幾個錯誤框不應該是一個問題,因爲你需要在任何情況下沙箱你的事情很好。你可以用它殺死沙箱和進程。 – 2011-05-21 08:59:33