我们正在开发的应用程序存在问题。很少,就像一百个一样,应用程序在启动时崩溃。当崩溃发生时它会关闭整个系统,计算机开始发出蜂鸣声并完全冻结,唯一的恢复方法是关闭电源(我们使用的是Windows XP)。崩溃的罕见性加上我们无法进入调试器甚至在发生堆栈转储时生成堆栈转储的事实使得调试非常困难。
我正在寻找将所有函数调用记录到文件的东西。这样的工具存在吗?它应该不是不可能实现的,像VTune这样的剖析器做了类似的事情。
我们正在使用visual studio 2008(C ++)。
由于
A·B
答案 0 :(得分:3)
记录功能输入/退出是解决问题的低级方法。我建议使用自动调试器工具(使用带有regedit的图像文件执行选项下的调试器密钥或使用包中的gflags我提供下面的链接)并尝试重新解决问题直到它崩溃。此外,您可以使用脚本获取可疑模块的调试器日志功能调用历史记录,或者收集任何其他信息 但是不知道应用程序的细节,很难提出解决方案。它是用户应用程序,服务还是驱动程序? “启动时崩溃”是什么意思 - 在Windows启动或应用启动时? 使用此debugger package进行问题排查。
答案 1 :(得分:2)
对于Visual C ++,_penter() and _pexit()可用于检测代码。
答案 2 :(得分:2)
日志记录的唯一问题是,当系统崩溃时,最新的日志条目可能仍在缓存中,并且没有机会写入磁盘......
如果是我,我会尝试在不同的PC上运行程序 - 它可能是片状硬件或导致问题的驱动程序。应用程序“不应该”能够关闭系统。
答案 3 :(得分:2)
一些想法 -
很可能在崩溃之前,应用程序中存在某种异常。如果使用SetUnhandledExceptionFilter()为所有未处理的异常设置处理程序并将堆栈跟踪写入日志文件,则可能有机会捕获崩溃。
请记住在每次写入后刷新文件。
另一种选择是使用诸如strace之类的工具将所有系统调用记录到内核中(有多种风格和实现,因此请选择您喜欢的)。如果你在崩溃前查看日志,你可能会找到罪魁祸首
答案 4 :(得分:2)
您是否考虑过使用第二台机器作为远程调试器(通过网络)?当应用程序(和系统)崩溃时,第二台机器仍然应该显示一些有用的信息,如果不是问题的实际点。我相信VC ++具备这种能力,至少在某些版本中是这样。
答案 5 :(得分:0)
GCC(包括版本MingGW for Windows development)有一个名为-finstrument-functions的代码生成开关,它告诉编译器在每个函数调用周围发出对__cyg_profile_func_enter和__cyg_profile_func_exit函数的特殊调用。对于Visual C ++,有类似的选项称为/GH和/Gh。这些导致编译器在函数调用周围发出对__penter和__pexit的调用。
这些检测模式可用于实现日志记录系统,您可以实现编译器生成的调用,以输出到本地文件系统或网络上的另一台计算机。
如果可能,我还会尝试使用valgrind或类似的检查工具来运行您的系统。这可能会在它失控之前发现你的问题。