我遇到一个问题,在调用第三方库例程期间,我的进程终止。我完全无法在调试器中捕获这个。这可能与此问题有关:How can I debug a win32 process that unexpectedly terminates silently?。
当我调用此库中的调用时,正在调试的进程会终止。如果此终止是由于未处理的异常或内存访问冲突导致的,则调试器会捕获它。所以我最好的猜测是这个过程会以某种方式正常终止。
我尝试了什么:
ExitThread
和ExitProcess
set_terminate
和_set_invalid_parameter_handler
)_set_abort_behavior
和_set_error_mode
。但无济于事,没有一个处理程序被调用,也没有触发断点。
我观察到的内容: 当进程崩溃时,我在调试输出窗口中看到两件事:
不相关(请参阅下面的更新) 我看到 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.
终止时,所有线程都返回相同的错误代码(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 :(得分: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文件。并重新重建,它的项目工作。希望这能解决你的问题。