找出来电 __fastfail

Find out what's calling __fastfail

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

结尾的消息

... Fatal program exit requested.

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

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

我试过像 main() 一样用 SEH 填充我的所有线程,尝试挂钩 abort()exit()terminate(),但找不到问题。我该如何调试,有什么提示吗?

WinDbg

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

  1. 启动WinDbg,使用正确的位数
  2. 运行 您在 WinDbg 下的可执行文件 (File/Open executable)。它将在初始断点处停止。
  3. , at least .symfix c:\debug\symbols and .reload. As mentioned by @James McNellis,符号可用,这将在需要时下载它们。
  4. 继续 运行 应用 g
  5. 重现问题
  6. 当 WinDbg 停止时,
    • 使用 .dump /ma c:\debug\mydump.dmp 创建故障转储,以便稍后分析
    • 通过 .exr -1
    • 获取有关异常的信息
    • 切换到引发异常的线程~#s
    • 查看调用堆栈k

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

对于更具体的问题,如果您有更多线索,请使用 标签提出更多问题。

Visual Studio

此外 Visual Studio 可以从 Microsoft 服务器下载符号(PDB 文件;调用堆栈信息)。

  1. 转到主菜单中的Tools | Options ...
  2. Select Debugging | Symbols 来自选项菜单
  3. 如果要将文件存储在特定目录中,请输入目录名称。

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

Hans 和 James 是对的,获得可读的调用堆栈对于解决此案例至关重要。

代码库安装了一个执行快速失败的纯调用处理程序。纯处理程序会通过 SEH。程序中的 40 多个线程中有一个出现纯粹的调用错误,因为其他线程部分清理了问题线程随后尝试访问的程序状态。一旦我让符号 Visual Studio 在它调用 purecall 处理程序的地方闯入 C++ 运行时库,我将它追溯到他们安装自己的程序。

他们快速失败的方式很复杂,并分解成一些 RtlXXX 函数,显然不能用 signal(SIGABRT) 捕获,因为我之前确实尝试过。

再次感谢大家的帮助!