2011-09-27 46 views
10

我有一个问题,在调用第三方库例程期间,我的进程终止。我完全无法在调试器中捕捉到这一点。这可能与此问题有关:How can I debug a win32 process that unexpectedly terminates silently?我如何确定为什么我的进程终止

当我将一个调用转入该库时,被调试的进程只是终止。如果这种终止是由于未处理的异常或内存访问冲突造成的,调试器就会发现它。所以我最好的猜测是这个过程以某种方式正常结束。

我曾尝试:

  • ExitThread和设置断点ExitProcess
  • 设置处理程序未处理的异常和无效paramters(set_terminate_set_invalid_parameter_handler
  • 更改_set_abort_behavior_set_error_mode
  • 指示调试器停止对所有抛出的异常执行。

但无济于事,没有处理程序被调用,也没有触发任何断点。

我观察什么: 当进程崩溃,我看到在调试输出窗口两件事情:

  1. 没有关系(见下文更新) 我看到 EEFileLoadException被抛出。这个异常的快速谷歌并没有给我一个明确的答案,这个异常意味着什么。

    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac.. 
    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. 
    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. 
    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: 0xe0434352. 
    
  2. 终止时,所有的线程返回相同的错误代码(STATUS_INVALID_CRUNTIME_PARAMETER)。 就我所知,此错误代码表示其中一个c运行时函数已收到无效参数,并出于安全原因终止了该应用程序。

    The thread 'Win32 Thread' (0x12c0) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0xe04) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x53c) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x116c) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x16e0) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x1420) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x13c4) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x40c) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0xc78) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0xd88) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x16c8) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0xcb8) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x584) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x1164) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x1550) has exited with code -1073740777 (0xc0000417). 
    The thread 'Win32 Thread' (0x474) has exited with code -1073740777 (0xc0000417). 
    The program '[5140] Program.exe: Native' has exited with code -1073740777 (0xc0000417). 
    

我真的想知道是什么原因造成这一点,和可选;我怎么能在调试器中捕捉到这个?

更新 关于EEFileLoadException,它实际上是在节目之前抛出,使导致它终止呼叫,所以它是不相关的进程的终止。

更新 我刚才读的set_terminate不会在调试工作,所以这是不可能的。正如我在评论中指出的那样,处理程序是按照线程进行管理的,所以我无法访问相关的处理程序。

此外,该程序很可能会崩溃在我无法访问的工作线程中,所以很难设置任何断点/处理程序。

有没有更好的方法来找出哪里出了问题?

+0

我意识到,终止处理程序不叫,因为它们被安装在每个线程的基础,我要崩溃线程的访问权限。 –

+0

我遇到类似的情况,除了我的情况,TRACE消息也没有被传递到输出窗口。当我使用WinDebug进行连接时,发现有一个VS忽略的DebugBreak()调用,导致进程自己终止(),导致程序[0x2F74]'OUTLOOK.EXE'已退出与代码-1073740777(0xc0000417).'不幸的是,我不明白为什么Visual Studio忽略它应该调试的程序。 –

回答

0

运行您的应用程序裸机调试程序(或附加到正在运行的进程),按Ctrl+Alt+E并选中框以让调试程序停止对异常执行。

每次发生异常时,调试器都会中断。您将能够检查线程状态/调用堆栈以可能识别问题。

为一个应用程序意外终止的典型原因是:

  • 东西真的职位WM_QUIT消息,该指示关闭应用
  • 有例外发生,并且它没有被处理(ESP的背景。线);异常遍历调用堆栈高达OS,它不知道如何处理所有的东西做的,

由于EEFileLoadException例外发生,你不knnow它是关于什么的,你也许只想杀死进程首先要理解它是否被处理,如果它实际上是你的应用程序的一个致命的东西。

+1

我已经试过指示调试器停止所有抛出的异常,但没有运气。 –

+0

此外,我不认为'WM_QUIT'是因为应用程序在调试主线程时终止的问题。这将指向另一个线索是罪魁祸首。 –

+0

调试器是否停止异常?您正在使用哪种类型的调试器,本机和/或托管? –

-2

我以前遇到同样的问题。我刚刚删除了C#项目中的obj文件。并再次重建,它的项目工作。希望这会解决你的问题。

2

配置procdump在进程终止时生成进程的转储。不知道VS2010是否可以打开转储文件,但windbg可以。然后转储所有的线程堆栈,你应该看到导致终止的那个。然后,您将能够检查堆栈以查找有问题的参数。

如果您的应用foo.exe的运行,然后在命令提示符下这样procdump: procdump -ma -t -w foo.exe

-ma表示完全内存转储

-t表示在进程终止

写转储 - w表示等待进程启动(如果尚未运行)

然后在任何调试器的外部运行以外的。一旦终止,你应该看到procdump的输出表明进程已经终止,并且正在写入一个转储文件。

这里的链接到procdump: http://technet.microsoft.com/en-us/sysinternals/dd996900

相关问题