繁体   English   中英

我可以在C#进程中使用SetErrorMode吗?

[英]Can I use SetErrorMode in C# process?

我正在准备编写在线法官核心,
一个可以编译用户代码并运行该程序以检查答案的程序,例如uva在线判断器。

而且在捕获如下所示的提交程序异常时遇到问题。

int main()
{
    while(~scanf("%d %d",n,&m))
    {   
        printf("%d\n",n+m);
    }
    return 0;
}

它在第一行拒绝访问,因为它扫描整数到错误位置。
如何捕获进程的运行时错误?

我曾经使用“尝试捕获”来捕获异常,
但它没有回答有关运行时错误的任何信息。

所以我只检查提交程序的退出代码,尽管除了过程之外这不是检查的好方法。
它像照片一样显示

我必须手动关闭错误消息框,
并且我找到了一种解决方案,该解决方案将SEH处理程序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;

感谢您的帮助,对于我的英语不好,我们深表歉意。

=================================
ps
问题是如何在C#中为子进程设置错误模式。
我的英语不足以解释问题,很抱歉。<(_ _)>

如果您指的是Win32 API函数SetErrorMode则需要使用P / Invoke,使用这样的简单签名即可轻松实现:

[DllImport("kernel32.dll")]
static extern ErrorModes  SetErrorMode(ErrorModes uMode);

[Flags]
public enum ErrorModes : uint {
    SYSTEM_DEFAULT             = 0x0,
    SEM_FAILCRITICALERRORS     = 0x0001,
    SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
    SEM_NOGPFAULTERRORBOX      = 0x0002,
    SEM_NOOPENFILEERRORBOX     = 0x8000
}

(站点http://www.pinvoike.net/始终是开始获取正确声明的好地方。)

如果不向该进程中注入代码,则无法在另一个进程中设置错误模式。 在C#中不可能轻松做到这一点。 它也不能在C / C ++中很好地工作,这类程序的生存时间不足以给您注入时间。

无论如何,它并不能解决您的问题,您还必须防止程序陷入无限循环后才退出。 简单的解决方案是给每个程序有限的执行时间。 说10秒。 如果尚未完成,则将Process.Kill()声明为失败。 这还将处理用消息框轰炸的程序。

用Process.WaitForExit(毫秒)重载来实现很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM