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