exe已停止工作。如何以编程方式处理?

时间:2015-04-24 03:39:41

标签: c# dll process exe windows-error-reporting

我的c#应用程序正在使用Process.start()在内部调用另一个exe,然后调用process.waitforexit()。在子exe完全执行后,我收到一条带有以下消息的弹出窗口

  

MNM_Interface已停止工作

     

问题导致程序停止正常工作。如果有可用的解决方案,Windows将关闭该程序并通知您。

我的日志显示我的父exe或子exe中没有异常。但是,只有在子exe内部完全执行代码后才会出现错误弹出窗口。 Eventviewer显示一个异常代码:0xc0000005

Faulting application name: MNM_Interface.exe, version: 1.0.0.0, time stamp: 0x5523d05b
Faulting module name: more.dll, version: 1.2.1.0, time stamp: 0x54e2d422
Exception code: 0xc0000005
Fault offset: 0x0040bb62
Faulting process id: 0x1870
Faulting application start time: 0x01d0713b195e7b30
Faulting application path: C:\MNM\Pictures 1.1.0\MNM_Interface.exe
Faulting module path: C:\MNM\Pictures 1.1.0\more.dll
Report Id: 586ce056-dd2e-11e4-b2ce-08edb9de061e

我尝试在父和子exe中使用以下代码,但无法阻止此弹出窗口的到来。

AppDomain currentDomain = AppDomain.CurrentDomain;   
currentDomain.UnhandledException += new   
    UnhandledExceptionEventHandler(DomainExceptionHandler); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

我检查各种来源后得到的解决方案是设置在注册表项下方,效果很好。

  

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Windows错误报告   DontShowUI = 1

但是我不知道如何以编程方式防止此错误进入应用程序。有可能吗?

我附加了用于调用子exe的代码。

try
        {

            if (dllPath.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                dllPath = dllPath.Remove(dllPath.Length - 1, 1);
            }
            System.Diagnostics.Process pr = new System.Diagnostics.Process();
            pr.StartInfo.UseShellExecute = true;
            pr.StartInfo.WorkingDirectory = Path.GetDirectoryName(strExe);
            pr.StartInfo.FileName = Path.GetFileName(strExe);
            pr.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            pr.StartInfo.Arguments =
                " " + strAct + " "
                + "\"" + dllPath + "\" "
                + "\"" + strProject + "\" "
                + "\"" + strUser + "\" "
                + "\"" + strPassword + "\" "
                + "\"" + strDb + "\" "
                + "\"" + strXml + "\" "
                + strModule;
            pr.Start();
            MessageBox.Show("Before process execution");
            pr.WaitForExit();
            MessageBox.Show("After process execution");
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.StackTrace);
        }

更多信息: 错误模块名称:more.dll。 如果我尝试用ildasm.exe打开这个DLL我得到没有有效的CLR标题,不能被反汇编。所以我想我应该专注于如何处理来自我的基于CLR的c#应用程序的externall dll抛出的非托管代码异常。

1 个答案:

答案 0 :(得分:0)

由于它是访问冲突,并且假设您没有错误的ram,您可以尝试第三方异常记录器,例如: www.eurekalog.com或madexcept.com

另见: stackoverflow.com/questions/14949904/what-do-i-do-when-my-program-crashes-with-exception-0xc0000005-at-address-0

如果您的more.dll是用C语言编写的,那么您也可以使用未初始化的指针。

另一种可能性是Windows在尝试访问受保护的内存时引发数据执行保护(DEP)错误