找出什么叫 __fastfail

Val*_*kyy 5 c++ crash debugging multithreading

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

... 要求退出致命程序。

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

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

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

Tho*_*ler 3

数据库管理工具

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

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

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

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

视觉工作室

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

  1. 转到Tools | Options ...主菜单
  2. Debugging | Symbols从选项菜单中选择
  3. 如果您希望文件存储在特定目录中,请输入目录名称。

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

Visual Studio 2015 社区版中的符号