如何立即终止崩溃的应用程序?

时间:2010-12-24 23:24:43

标签: debugging crash dr.watson

我有一个应用程序,有时会导致异常。如果崩溃,我需要重新启动它。但问题是,我在这里有Windows 7,当应用程序崩溃时,Windows会向我显示一个很好的对话框,其中包含关闭应用程序的建议。但是应用程序本身仍在运行,直到我单击“关闭”。如何摆脱这个窗口,使应用程序立即终止,没有任何对话框?

3 个答案:

答案 0 :(得分:13)

理想情况下,您会在程序的最外层范围内捕获所有异常。但是,有时您无法进行此类更改,并且崩溃对话框会阻止您从崩溃中恢复。在这些情况下,您可以考虑完全禁用Windows Error Reporting,也可以考虑禁用特定程序。

在Windows 7上:启动Orb - >控制面板 - >行动中心 - >维护 - >检查问题报告的解决方案 - >设置

更新:完全禁用错误报告UI更改DontShowUI注册表设置:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Windows错误报告\ DontShowUI

答案 1 :(得分:1)

您可以使用Dr Watson的概念来检测崩溃并重新启动应用程序。使用以下内容:

设置如下的定时器:

SetTimer( eIsDwwin, 30000, NULL);

这将在系统进程中每隔30秒使用以下内容检查Dr Watson进程:

void CMainFrame::OnTimer(UINT nIDEvent) {

    case eIsDwwin:
        HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        DWORD dwsma = GetLastError();
        DWORD dwExitCode = 0;
        PROCESSENTRY32  procEntry={0};
        procEntry.dwSize = sizeof( PROCESSENTRY32 );
        Process32First(hndl,&procEntry);
        do {
            if(((!strcmpi(procEntry.szExeFile,"dwwin.exe"))|| 
                (!strcmpi(procEntry.szExeFile,"drwatson.exe"))||
                (!strcmpi(procEntry.szExeFile,"drwtsn32.exe"))||
                (!strcmpi(procEntry.szExeFile,"WerFault.exe"))) &&
                (procEntry.th32ParentProcessID == GetCurrentProcessId())) {

                WSACleanup();
                PostMessage( WM_CLOSE);
                Sleep(500);

        if(0==strcmpi(procEntry.szExeFile,"dwwin.exe")) {
            system("TASKKILL /IM dwwin.exe /F");
        } else if(0==strcmpi(procEntry.szExeFile,"drwatson.exe")) {
            system("TASKKILL /IM drwatson.exe /F");
        } else if(0==strcmpi(procEntry.szExeFile,"drwtsn32.exe")) {
            system("TASKKILL /IM drwtsn32.exe /F");
            } else if(0==strcmpi(procEntry.szExeFile,"WerFault.exe")) {
            system("TASKKILL /IM WerFault.exe /F");
        } else {
                    system("TASKKILL /IM WerFault.exe /F");
        }
                break;
        }
    } while(Process32Next(hndl,&procEntry));

        CloseHandle(hndl);
    break;
    }
}

这将关闭已经崩溃的应用程序。

另一种方法是使用Windows中的Signal API来处理异常和崩溃。

答案 2 :(得分:0)

不知道应用程序的语言会让它变得有点困难,但通常可以通过在try / catch块(如C#,C ++或Python)中运行应用程序来处理它。在伪Csharp-ish代码中:

bool done = false;
main()
{
    while( !done )
    {
        AppClass aclass = new AppClass();
        try
        {
            aclass->Run();
        }
        catch( Exception x )
        {
             LogErrorSomehow(x);
             delete aclass;
             continue;
        }
    }
}

基本上,解决“未处理异常”错误的最佳方法是通过捕获异常并采取适当的操作来处理异常(即使该操作无效)。

在此示例中,如果有人想关闭您的应用,您可以将“完成”值设置为true并从Run()返回。