代码之家  ›  专栏  ›  技术社区  ›  Andreas

记录/监视来自应用程序的所有函数调用

  •  6
  • Andreas  · 技术社区  · 16 年前

    我们正在开发的应用程序有问题。很少,像百分之一,应用程序在启动时崩溃。当崩溃发生时,它会关闭整个系统,计算机开始发出哔哔声,完全冻结,唯一的恢复方法是关闭电源(我们使用的是WindowsXP)。崩溃的稀有性与我们不能进入调试器或者甚至在发生时产生堆栈转储的事实相关联,这使得调试非常困难。

    我在找一个能把所有函数调用记录到一个文件中的东西。有这样的工具吗?实现它应该不是不可能的,像VTune这样的分析器也会做一些非常类似的事情。

    我们使用VisualStudio 2008(C++)。

    谢谢

    公元前

    6 回复  |  直到 16 年前
        1
  •  3
  •   deemok    16 年前

    记录函数入口/出口是解决问题的低级方法。我建议使用自动调试器检测(在regedit中使用image file execution options下的调试器键,或在下面提供链接的包中使用gflags),并尝试重新处理问题,直到问题崩溃。此外,可以使用脚本使用可疑模块的调试器日志函数调用历史,或者收集任何其他信息。
    但不知道应用程序的详细信息,很难提出解决方案。是用户应用程序、服务还是驱动程序?“启动时崩溃”是什么意思-在Windows启动或应用程序启动时?
    用这个 debugger package 排除故障。

        2
  •  2
  •   Hugh Allen    16 年前

    日志记录的唯一问题是,当系统崩溃时,最新的日志项可能仍在缓存中,没有机会写入磁盘…

    如果是我,我会尝试在另一台PC上运行这个程序,它可能是片状的硬件或驱动程序导致问题。应用程序“不应该”能够关闭系统。

        3
  •  2
  •   shoosh    16 年前

    一些想法
    很有可能在崩溃之前应用程序中有某种异常。如果使用setUnhandledExceptionFilter()为所有未处理的异常设置处理程序,并将堆栈跟踪写入日志文件,则可能有机会捕获操作中的崩溃。
    记住每次写入后都刷新文件。

    另一种选择是使用诸如 strace 它将所有系统调用记录到内核中(有多种类型和实现,所以请选择您喜欢的)。如果你在撞车前看一下日志,你可能会找到肇事者

        4
  •  2
  •   Head Geek    16 年前

    您是否考虑过使用第二台计算机作为远程调试器(通过网络)?当应用程序(和系统)崩溃时,第二台机器应该仍然显示一些有用的信息,如果不是问题的实际点的话。我相信vc++有这种能力,至少在某些版本中是这样。

        5
  •  2
  •   Martin Beckett    16 年前

    对于Visual C++ _penter() and _pexit() 可以用来测试代码。

    也见 Method Call Interception in C++ .

        6
  •  0
  •   Ben Combee    16 年前

    GCC(包括版本 MingGW for Windows development )有一个名为 -finstrument-functions 它告诉编译器在每个函数调用周围发出对名为“cyg_profile_func_enter”和“cyg_profile_func_exit”的函数的特殊调用。对于VisualC++,有类似的选项称为 /GH /Gh 。这会导致编译器围绕函数调用发出对“penter”和“pexit”的调用。

    这些测试模式可用于实现日志记录系统,实现编译器生成的调用,以输出到本地文件系统或网络上的另一台计算机。

    如果可能的话,我也会尝试使用 valgrind 或类似的检查工具。这可能会在你的问题失控之前抓住它。