我支持的程序是使用SIGSEGV崩溃但是我无法从.dmp文件中崩溃

时间:2014-02-10 22:33:09

标签: c++ crash windbg sigsegv dmp

根据标题,当我支持的程序崩溃时,我无法找到任何转储文件。

应用程序的日志清楚地提到了它的SIGSEGV异常,但是我搜索了整个硬盘驱动器,并且找不到任何.dmp文件。

该计划的开发人员已经在其他地方看到了类似的问题,但到目前为止还无法解释为什么会发生这种情况 - 而且我们现在有点陷入困境。

应用程序日志中的最后一部分显示为:

Received signal SIGSEGV, segmentation violation.
OurApplication::sigHandler 11.
Removing signal handlers.
OurApplication::signalCatched.
OurApplication::sigHandler: exiting application.
Removing signal handlers.

我对此的有限理解是我们的应用程序的信号处理程序可能正在“中和”抛出的SIGSEGV异常。因此,没有核心转储产生...我确实向开发人员提出了这个想法,但他们似乎从未真正调查过这可能是原因。他们在柜台中提出的理论是,他们认为dmp没有产生的原因是因为程序可能会崩溃两次非常接近。

所以我现在的问题是:

  • 是否有任何控制.dmp文件创建的Windows7参数?
  • 是否需要将任何需求/标志编译到程序中,以便它(或Windows)在崩溃时创建核心转储文件?
  • 我99%确定它必须是负责创建核心文件的Windows,因为程序本身在崩溃时会死亡/终止,对吗?
  • 是否还有其他我应该注意的事项,或检查,或“我可以收集的证据”,然后向我们的开发人员展示?

非常感谢提前

2 个答案:

答案 0 :(得分:1)

考虑以编程方式创建自己的minidump文件。应该有大量的代码来展示如何做到这一点。你可以在这里试试:

https://stackoverflow.com/search?q=minidump

这样,您不依赖Dr. Watson或任何其他设置来创建转储文件。相反,您将调用DBGHELP.DLL中的函数来创建转储文件。

答案 1 :(得分:1)

是否有控制.dmp文件创建的Windows7参数?

有些参数可以控制崩溃转储的创建:请参阅MSDN on Collecting user-mode dumps

是否需要将任何需求/标志编译到程序中,以便它(或Windows)在崩溃时创建核心转储文件? < / p>

您无需为以前的答案编译任何内容。但是,由于未处理的异常,程序需要终止,这意味着你需要让异常冒泡并且不被未处理的异常处理程序处理。

我99%确定它必须是负责创建核心文件的Windows,因为程序本身在崩溃时会死机/终止,对吗?

如上所述,Windows可以处理这个问题,让Windows处理崩溃是个好主意。想象一下,由于内存泄漏,您的程序已损坏。一些内存已被覆盖。在这种情况下,您的unhandled exception handler可能会被销毁。但是,Windows仍然可以完全控制进程,可以暂停它并从外部(而不是从内部)创建转储。

还有其他我应该注意的事项,或检查,或者我可以收集的“证据”然后向我们的开发人员展示吗?

好吧,建议由于上述原因让Windows创建转储。然后他们也不需要实现配置设置(您不希望始终创建故障转储文件,是吗?)。您不需要为文件实现限制编号。您不需要实现磁盘空间检查等。

您可以建议阅读Windows Internals 6书籍。