如何确定进程终止的原因

时间:2011-09-27 11:34:36

标签: visual-studio-2010 debugging winapi

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

当我调用此库中的调用时,正在调试的进程会终止。如果此终止是由于未处理的异常或内存访问冲突导致的,则调试器会捕获它。所以我最好的猜测是这个过程会以某种方式正常终止。

我尝试了什么:

  • ExitThreadExitProcess
  • 上设置断点
  • 为未处理的例外和无效参数设置处理程序(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).
    
  3. 我真正想知道的是导致这种情况的原因,也可以选择;如何在调试器中捕获它?

    更新 关于EEFileLoadException,它实际上是在程序进行调用之前抛出的,这导致它终止,因此它与进程的终止无关。

    更新 我刚刚读到set_terminate在调试器中不起作用,所以这是不可能的。正如我的评论中所述,处理程序是基于每个线程进行管理的,因此我无权访问相关的处理程序。

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

    有没有更好的方法来弄清楚出了什么问题?

3 个答案:

答案 0 :(得分:2)

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

如果你的应用是foo.exe,那么从命令提示符运行procdump,如下所示: procdump -ma -t -w foo.exe

-ma表示完全内存转储

-t表示进程终止时的写入转储

-w表示如果尚未运行,则等待启动进程

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

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

答案 1 :(得分:0)

运行应用程序nuder调试器(或附加到正在运行的进程),按Ctrl+Alt+E并选中复选框以使调试器停止执行异常。

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

应用意外终止的典型原因是:

  • 某些内容确实发布了WM_QUIT消息,并指示应用关闭
  • 发生异常,并且不处理(特别是在后台线程上);异常遍历调用堆栈到操作系统,它不知道如何处理所有的东西,只是杀死进程

EEFileLoadException异常发生并且您不知道它是什么时,您可能希望第一件事情是否理解它是否被处理,如果它对您的应用程序来说实际上是致命的。< / p>

答案 2 :(得分:-2)

我之前遇到过同样的问题。我刚刚在C#项目中删除了obj文件。并重新重建,它的项目工作。希望这能解决你的问题。

相关问题