在XP中检测应用程序崩溃的最佳方法是什么(每次生成相同的“错误”窗口对 - 每个窗口都有相同的窗口标题)然后重新启动它?

我特别感兴趣的是听到使用最少系统资源的解决方案,因为有问题的系统很老。

我曾想过使用像AutoIt这样的脚本语言( http://www.autoitscript.com/autoit3/ ),并且可能每隔几分钟触发一次'探测器'脚本?

在Python,Perl,PowerShell或其他方面完全可以做得更好吗?

任何想法,提示或想法非常感谢。

编辑:它实际上并没有崩溃(即退出/终止 - 感谢@tialaramex)。 它显示一个等待用户输入的对话框,然后是另一个等待进一步用户输入的对话框,然后它实际退出。 这是我想要检测和处理的对话框。

===============>>#1 票数:12

最好的方法是使用命名的互斥锁

  1. 开始申请。
  2. 创建一个新的命名互斥锁并对其拥有所有权
  3. 开始一个新的进程(进程而不是线程)或新的应用程序,你喜欢什么。
  4. 从该进程/应用程序尝试获取互斥锁。 该过程将阻止
  5. 当应用程序完成释放互斥锁(发出信号)
  6. 如果应用程序完成或应用程序崩溃,“控制”进程将仅获取互斥锁。
  7. 在获取互斥锁后测试结果状态。 如果应用程序崩溃了,它将是WAIT_ABANDONED

说明:当线程完成而不释放互斥锁时,任何等待它的其他进程都可以获取它,但它将获得WAIT_ABANDONED作为返回值,这意味着互斥锁被放弃,因此受保护的部分的状态可能是不安全的。

这样你的第二个应用程序将不会消耗任何CPU周期,因为它将继续等待互斥锁(并且这是由操作系统完全处理的)

===============>>#2 票数:3 已采纳

如何创建一个包装器应用程序,作为一个孩子启动有故障的应用程序并等待它? 如果子项的退出代码指示错误,则重新启动它,否则退出。

===============>>#3 票数:3

我认为主要问题是Dr. Watson会显示一个对话框,让您的流程保持活力。

您可以使用Windows API编写自己的调试器,然后从那里运行崩溃的应用程序。 这将阻止其他调试器捕获应用程序的崩溃,您还可以捕获异常事件。

由于我没有找到任何示例代码,我编写了这个Python快速而肮脏的示例。 我不确定它有多强大,特别是DEBUG_EVENT的声明可以改进。

from ctypes import windll, c_int, Structure
import subprocess

WaitForDebugEvent = windll.kernel32.WaitForDebugEvent    
ContinueDebugEvent = windll.kernel32.ContinueDebugEvent
DBG_CONTINUE = 0x00010002L    
DBG_EXCEPTION_NOT_HANDLED = 0x80010001L

event_names = {    
    3: 'CREATE_PROCESS_DEBUG_EVENT',
    2: 'CREATE_THREAD_DEBUG_EVENT',
    1: 'EXCEPTION_DEBUG_EVENT',
    5: 'EXIT_PROCESS_DEBUG_EVENT',
    4: 'EXIT_THREAD_DEBUG_EVENT',
    6: 'LOAD_DLL_DEBUG_EVENT',
    8: 'OUTPUT_DEBUG_STRING_EVENT', 
    9: 'RIP_EVENT',
    7: 'UNLOAD_DLL_DEBUG_EVENT',
}
class DEBUG_EVENT(Structure):
    _fields_ = [
        ('dwDebugEventCode', c_int),
        ('dwProcessId', c_int),
        ('dwThreadId', c_int),
        ('u', c_int*20)]

def run_with_debugger(args):
    proc = subprocess.Popen(args, creationflags=1)
    event = DEBUG_EVENT()

    while True:
        if WaitForDebugEvent(pointer(event), 10):
            print event_names.get(event.dwDebugEventCode, 
                    'Unknown Event %s' % event.dwDebugEventCode)
            ContinueDebugEvent(event.dwProcessId, event.dwThreadId, DBG_CONTINUE)
        retcode = proc.poll()
        if retcode is not None:
            return retcode

run_with_debugger(['python', 'crash.py'])

===============>>#4 票数:2

我意识到你正在处理Windows XP,但对于Vista下类似情况的人来说,有新的崩溃恢复API可用。 这里有一个很好的介绍 ,他们可以做什么。

===============>>#5 票数:2

这是一个稍微改进的版本。

在我的测试中,当错误的exe生成“访问冲突”时,前面的代码在无限循环中运行。

我对我的解决方案并不完全满意,因为我没有明确的标准来知道哪个例外应该继续,哪个不可以(ExceptionFlags没有帮助)。

但它适用于我运行的示例。

希望它有所帮助,Vivian De Smedt

from ctypes import windll, c_uint, c_void_p, Structure, Union, pointer
import subprocess

WaitForDebugEvent = windll.kernel32.WaitForDebugEvent
ContinueDebugEvent = windll.kernel32.ContinueDebugEvent
DBG_CONTINUE = 0x00010002L
DBG_EXCEPTION_NOT_HANDLED = 0x80010001L

event_names = {
    1: 'EXCEPTION_DEBUG_EVENT',
    2: 'CREATE_THREAD_DEBUG_EVENT',
    3: 'CREATE_PROCESS_DEBUG_EVENT',
    4: 'EXIT_THREAD_DEBUG_EVENT',
    5: 'EXIT_PROCESS_DEBUG_EVENT',
    6: 'LOAD_DLL_DEBUG_EVENT',
    7: 'UNLOAD_DLL_DEBUG_EVENT',
    8: 'OUTPUT_DEBUG_STRING_EVENT',
    9: 'RIP_EVENT',
}

EXCEPTION_MAXIMUM_PARAMETERS = 15

EXCEPTION_DATATYPE_MISALIGNMENT  = 0x80000002
EXCEPTION_ACCESS_VIOLATION       = 0xC0000005
EXCEPTION_ILLEGAL_INSTRUCTION    = 0xC000001D
EXCEPTION_ARRAY_BOUNDS_EXCEEDED  = 0xC000008C
EXCEPTION_INT_DIVIDE_BY_ZERO     = 0xC0000094
EXCEPTION_INT_OVERFLOW           = 0xC0000095
EXCEPTION_STACK_OVERFLOW         = 0xC00000FD


class EXCEPTION_DEBUG_INFO(Structure):
    _fields_ = [
        ("ExceptionCode", c_uint),
        ("ExceptionFlags", c_uint),
        ("ExceptionRecord", c_void_p),
        ("ExceptionAddress", c_void_p),
        ("NumberParameters", c_uint),
        ("ExceptionInformation", c_void_p * EXCEPTION_MAXIMUM_PARAMETERS),
    ]

class EXCEPTION_DEBUG_INFO(Structure):
    _fields_ = [
        ('ExceptionRecord', EXCEPTION_DEBUG_INFO),
        ('dwFirstChance', c_uint),
    ]

class DEBUG_EVENT_INFO(Union):
    _fields_ = [
        ("Exception", EXCEPTION_DEBUG_INFO),
    ]

class DEBUG_EVENT(Structure):
    _fields_ = [
        ('dwDebugEventCode', c_uint),
        ('dwProcessId', c_uint),
        ('dwThreadId', c_uint),
        ('u', DEBUG_EVENT_INFO)
    ]

def run_with_debugger(args):
    proc = subprocess.Popen(args, creationflags=1)
    event = DEBUG_EVENT()

    num_exception = 0

    while True:
        if WaitForDebugEvent(pointer(event), 10):
            print event_names.get(event.dwDebugEventCode, 'Unknown Event %s' % event.dwDebugEventCode)

            if event.dwDebugEventCode == 1:
                num_exception += 1

                exception_code = event.u.Exception.ExceptionRecord.ExceptionCode

                if exception_code == 0x80000003L:
                    print "Unknow exception:", hex(exception_code)

                else:
                    if exception_code == EXCEPTION_ACCESS_VIOLATION:
                        print "EXCEPTION_ACCESS_VIOLATION"

                    elif exception_code == EXCEPTION_INT_DIVIDE_BY_ZERO:
                        print "EXCEPTION_INT_DIVIDE_BY_ZERO"

                    elif exception_code == EXCEPTION_STACK_OVERFLOW:
                        print "EXCEPTION_STACK_OVERFLOW"

                    else:
                        print "Other exception:", hex(exception_code)

                    break

            ContinueDebugEvent(event.dwProcessId, event.dwThreadId, DBG_CONTINUE)

        retcode = proc.poll()
        if retcode is not None:
            return retcode

run_with_debugger(['crash.exe'])

  ask by Umber Ferrule translate from so

未解决问题?本站智能推荐:

2回复

WindowsForm应用程序在InitializeComponent上崩溃

我的相对简单的Window Application似乎在窗体的构造函数中进入InitializeComponent方法后便崩溃了。 现在,表单显然是局部类,并且在局部类的另一部分中调用了InitializeComponent。 问题是生成了其他子类。 我该如何调试它并找出导致我的应用崩溃的
2回复

什么样的崩溃会在Windows XP上产生应用程序错误(也就是应用程序弹出窗口)?

首先,我将描述我所知道的崩溃类型。 向下滚动查看实际问题。 请注意,我只对Windows处理的崩溃感兴趣。 特定的应用程序和框架有时会有自己的崩溃处理程序(例如Cygwin,VCL,Java或.NET),我不会讨论。 沃森博士 在Windows XP上,大多数未处理的“结构化异
1回复

VS 2010 .NET应用程序版本在XP或Server 2003上编译时崩溃

我当时正在考虑将我的应用程序之一从VS2010迁移到VS2012。 该解决方案包含许多项目,因此,我将尝试概述主要部分。 入口点是基于.NET 3.5 SP1的WPF应用程序。 该项目引用了一个.NET 2.0类库和一个使用VS2008的VC90库编译的.NET 2.0 C ++ /
2回复

Window中的Icon属性会使Windows XP SP2中的应用程序崩溃

假设我有这个: <Window stuff Icon="Resources\\myicon.ico"> 如果我在Windows 7上运行该程序,那很好。 如果我在Windows XP SP2上运行它,它会崩溃。 删除Icon属性,它在Windows XP上运行正常,但
1回复

Windows XP和7之间发生了什么变化,导致我的Mono C#应用程序崩溃了?

我使用Linux上的Mono框架创建并编译了一个C#应用程序。 该程序适用于Windows XP和Linux。 然而,当我在Windows 7上启动它时,它崩溃了,没有任何有用的信息。 这两个版本的Windows之间发生了什么变化,这可能会导致这种情况发生? 源代码可从http:
3回复

XP上的C#应用​​程序崩溃

最近3个月,我正在VS2010中在Windows 7上开发C#应用程序。 现在它几乎完成了,我发现它不能在XP上运行。 它立即崩溃,并显示消息“程序遇到问题,需要关闭...”。 Standart Windows“发送/不发送”错误没有对问题进行具体说明。 我可以在这里发布代码,但实际
1回复

事件日志中的应用程序错误

我经常在事件日志中收到VB5应用程序的以下错误: 可能是什么原因? msvbvm50.dll是VB5运行时的一部分,我不认为这为什么会出错。 我以为这将是一个非常可靠的组件。 无论如何,有没有调试这种错误的原因?
2回复

Windows XP上的Visual Studio 2010突然崩溃,然后停止工作,直到重新安装

在工作中,我在Windows XP上使用Visual Studio 2010。 安装的唯一扩展是ASP.NET MVC 3及其捆绑的东西。 由于某种原因,VS可以正常工作,直到它突然崩溃,然后在大多数情况下会在打开文件时崩溃,并且当它没有崩溃时,当我尝试从VS运行我的MVC项目时,Web服务
1回复

在功能区上重复使用图像会导致XP崩溃

我正在使用WPF功能区,但遇到了一些奇怪的行为。 我有一个上下文选项卡,该选项卡复制了“主页”选项卡中的某些功能,因此我的用户不必来回点击。 我看到的问题是,如果我重复使用映像,并且在Windows XP上运行,我的应用程序将在启动时崩溃。 Windows 7上没有问题。有什么想法吗?
1回复

My.Computer.Info.OSFullName崩溃,Windows XP-已安装.Net 4

有谁知道为什么调用My.Computer.Info.OSFullName(或.anything)会导致.Net 4崩溃? 有人知道它是否可以与McAfee软件等与杀毒软件相关的软件吗?