【问题标题】:Identify exact line on which application got crashed?确定哪个应用程序崩溃的确切行?
【发布时间】:2014-08-21 13:18:30
【问题描述】:

如何确定我的应用程序崩溃的确切程序行?有什么工具可以告诉我哪个源文件的哪一行导致应用程序崩溃?

我正在使用 C/C++、MFC 和 VC++。

【问题讨论】:

  • “调试”就是答案,你也可以抛出异常并使用行号宏
  • 我本来打算建议使用Visual Studio,但既然你已经在使用Visual Studio,我想你必须先解决PEBCAC
  • 构建“调试”,而不是“发布”。按 F5 运行。
  • 感谢大家的回答和 cmets。但问题是崩溃并不是一直产生的。在我们的开发中心没有生成崩溃,它在客户端有时会在任何特定条件下崩溃,并且很难在我们端重现。这就是为什么我已经在使用日志机制,它告诉我们应用程序崩溃了模块名称(它向我们展示了 ntdll.dll)。这就是为什么我想知道任何可用的机制,它只记录代码的行号以及模块名称。

标签: c++ winapi visual-c++ mfc


【解决方案1】:

使用 gdb 查看应用程序崩溃的位置。对于 linux,使用gdb --args (Application command line)

使用断点进入各种功能。如果遇到崩溃,请使用 bt 回溯代码。

虽然 gdb 中有很多东西,但我的目的只是给出一个指针,你可以从哪里开始。

【讨论】:

  • 记得告诉编译器添加调试信息。
  • 这可能本身就是一个问题,但你能用 gdb 调试 microsoft visual c++ 吗?
  • @MadScienceDreams:是的,如果你喜欢痛苦(gdb 不了解 VC 的调试信息)
【解决方案2】:

对于运行时(未附加调试器)异常,我喜欢使用“BOOST_EXCEPTIONS”,因为 BOOST_THROW_EXCEPTION 宏将 BOOST_CURRENT_FUNCTION、FILELINE 附加到异常。

但最好的方法是在调试模式下编译并在附加调试器的情况下运行。如果您使用的是 Visual Studio(使用 VC++,您可能已经在使用)切换到调试模式并运行它。当抛出一个未处理的异常时,它应该会把你带到那里。

如果你想捕捉处理的异常,从菜单栏,Debug->Exceptions。检查所有这些将使调试器捕获异常,即使它们已被处理。虽然使用异常处理非致命错误的人可能会让这个超级烦人......

【讨论】:

    【解决方案3】:

    这在很大程度上取决于您所说的“崩溃”。但是假设您的意思是您的应用程序中发生了异常,那么EXCEPTION_RECORD 结构将包含发生异常的确切地址,即引发异常时执行的 IP。在 Windows C++ 异常上使用 SEH。阅读永恒的 A Crash Course on the Depths of Win32™ Structured Exception Handling 了解 SEH。

    您可以从故障转储中检索异常信息(请参阅ecxr Display Exception Context Record),或者您可以指示调试器在出现异常时中断。 Dr. Watson 会在发生崩溃时为您创建转储。

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2020-08-17
      • 2021-11-11
      相关资源
      最近更新 更多