我有一个庞大的代码库,我不熟悉,程序异常终止,因为某处的线程正在调用 __fastfail 。这是基于消息,它以



调用堆栈没有符号,因为它位于 C++ 2015 运行时 ( ucrtbase.dll ) 中。该调用似乎是在我的主线程以外的线程上进行的。这个神秘的线程只在问题发生之前开始,所以我无法在调试器中捕捉到它的行为 - 我不知道是什么启动了它,以及首先是什么导致了整个过程。

我使用 main() 在我的 __try/__catch 中有 SEH,所以任何未处理的异常都应该被困在那里。相反,我猜测某处的某些东西会冒泡到运行时并导致 __fastfail

我尝试像 main() 一样用 SEH 填充我的所有线程,尝试 Hook abort()exit()terminate() ,但找不到问题。我如何调试这个,任何提示?

最佳答案

数据库

我会说这对 WinDbg 来说是一项不错的任务。 WinDbg 是 Debugging Tools for Windows 的一部分,它是免费的。安装 x64 和 x86 两个版本,以便您可以调试任何类型的应用程序。

  • 启动 WinDbg,使用正确的位数
  • 在 WinDbg ( File/Open executable ) 下运行您的可执行文件。它将在初始断点处停止。
  • Set up the symbols ,至少 .symfix c:\debug\symbols.reload 。正如@ James McNellis 所提到的,这些符号是可用的,这将在需要时下载它们。
  • 使用 g
  • 继续运行应用程序
  • 复现问题
  • 当 WinDbg 停止时,
  • 使用 .dump /ma c:\debug\mydump.dmp 创建故障转储,以便您稍后对其进行分析
  • 使用 .exr -1
  • 获取有关异常的信息
  • 使用 ~#s
  • 切换到导致异常的线程
  • k
  • 查看调用堆栈

    学习 WinDbg 是一项艰巨的任务,因为大多数事情都是通过神秘的命令而不是通过 UI 完成的,但它几乎可以做任何事情。

    对于更具体的问题,当您有更多线索时,请使用 windbg 标签提出其他问题。

    视觉工作室

    此外,Visual Studio 可以从 Microsoft 服务器下载符号(PDB 文件;调用堆栈信息)。
  • 转到主菜单中的 Tools | Options ...
  • 从选项菜单中选择 Debugging | Symbols
  • 如果要将文件存储在特定目录中,请输入目录名称。

  • 这是它在 Visual Studio 2015 社区版中的样子:

    c++ - 找出什么叫 __fastfail-LMLPHP

    关于c++ - 找出什么叫 __fastfail,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32383972/

    10-12 07:34