【发布时间】:2011-05-21 19:11:19
【问题描述】:
我正在准备写一个在线法官核心,
一个可以编译用户代码并运行程序来检查答案的程序,就像uva在线判断一样。
而且我在捕获如下提交程序的异常时遇到问题。
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;
感谢您的帮助,非常抱歉我的英语不好。
=================================
附:
问题是如何在 C# 中为子进程设置错误模式。
我的英语不够好,无法解释问题,非常抱歉。
【问题讨论】:
-
有几个错误框应该不是问题,因为无论如何你都需要很好地沙箱化你的东西。你可以杀死沙箱和它的进程。