2008-12-18 87 views
7

我有一个用C++编写的Windows应用程序,偶尔会蒸发。我使用蒸发这个词,因为没有什么遗留的东西:没有“我们很抱歉”来自Windows的消息,没有从Dr. Watson工厂的崩溃转储...如何调试意外终止静默的win32进程?

有一次崩溃发生在调试器下,调试器没有中断 - 它显示应用程序仍在运行。当我手动暂停执行时,我发现我的进程不再有任何线程。

如何捕获此过程终止的原因?

+0

你怎么知道应用程序没有正常退出? – hova 2008-12-18 16:45:55

+0

两个原因: 1.当正常退出时,应用程序会跳过几个圈来正确关闭一些网络连接的硬件。硬件在崩溃后仍在运行。 2.当应用程序正常退出时,调试会话结束。在这种情况下,它没有。 – 2008-12-18 17:01:12

+0

你在你的问题中说应用程序线程已经终止,然后主进程循环退出。这听起来像应用程序正常终止 - 并且'错误'可能是一个设计问题。检查你的线程循环,看看他们为什么退出(中断点)。 – Klathzazt 2009-02-03 14:57:02

回答

5

你可以尝试使用在windows debugging tool package的ADPlus的工具。

adplus -crash -p yourprocessid 

自动转储工具为异常提供小型转储,并在应用程序崩溃时提供完整转储。

1

您可以在Windows上检查Windows日志Event Viewer

+0

并让您的服务登录到事件日志中...... – 2008-12-18 20:25:06

1

首先我想说的是,我只有对Windows开发一个适度的经验。 之后,我认为这是一个日志可能有所帮助的典型案例。

通常调试和记录提供正交信息。如果你的调试器无用,那么日志会帮助你。

2

嗯,问题是你得到访问冲突。您可能想要附加WinDBG并打开所有的异常过滤器。它可能仍然没有帮助 - 我的猜测是你得到的内存损坏不是抛出异常。

你可能想看看enabling full pageheap checking

你可能也想看看这个older question大约堆损坏对工具的一些想法。

4

如果您正在使用Visual Studio 2003或更高版本,您应该通过打开调试菜单下找到的所有调试异常中断选项启用调试器“第一次机会异常”处理功能|例外对话框。在调试器中开始进程的调试版本之前打开EVERY选项。

默认情况下,大多数调试器,这些第一次机会异常处理程序被关闭,因此,如果Windows或您的代码抛出一个异常,调试器希望您的应用程序来处理它。

的第一次机会异常系统允许调试器拦截由所述进程和/或系统抛出EVERY可能的例外。

http://support.microsoft.com/kb/105675

2

对这种突然消失的最常见的原因是堆栈溢出,通常是由某种无限递归的(其可以,当然,涉及几个功能相互调用链)而引起的。

这是否是在您的应用程序的可能性?

3

发布的所有其他想法都很好。

但它听起来也像是在应用程序调用中止()或终止()。

如果您在调试器中运行它,请在这两种方法上设置断点,并使用exit()以获得较好的度量。

以下是导致terminate to be called because of exceptions出错的情况列表。

参见: Why destructor is not called on exception?

这表明,应用程序将终止()如果一个异常没有被捕获。因此,将main()中的catch块报告错误(记录到日志文件),然后重新抛出。

int main() 
{ 
    try 
    { 
     // Do your code here. 
    } 
    catch(...) 
    { 
     // Log Error; 
     throw; // re-throw the error for the de-bugger. 
    } 
} 
1

这可能是对_exit()或某些Windows等价物的调用。尝试在_exit上设置断点...

0

您是否尝试过PC Lint等并通过您的代码运行它? 尝试编译最大警告 如果这是一个.NET应用程序 - 使用FX Cop。

0

可能的原因浮现在脑海。

  • 了TerminateProcess()
  • 堆栈溢出异常
  • 异常而处理异常

最后一个在应用程序的立即失败特定结果。
堆栈溢出 - 您可能会收到此通知,但不太可能。

放入调试器,将所有异常通知更改为“总是停止”,而不是“如果不处理则停止”,然后执行您的操作来导致程序失败。如果您遇到异常,调试器将停止,您可以决定这是否是您要查找的异常。

0

我花了几个小时,试图挖掘到这个运行在Windows 7 64位应用程序,我最后不得不设置在RtlReportSilentProcessExit功能,它生活在NTDLL断点的Visual Studio 2017年。 dll文件。只有基本函数名称足以让Visual Studio找到它。

也就是说,我让Visual Studio自动下载C标准库的符号后,它也自动停止在导致问题的运行时异常。