gpt4 book ai didi

c++ - 找出调用 __fastfail 的原因

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:23 25 4
gpt4 key购买 nike

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

结尾的消息

... Fatal program exit requested.

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

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

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

最佳答案

WinDbg

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

  1. 启动WinDbg,使用正确的位数
  2. 在 WinDbg 下运行您的可执行文件(文件/打开可执行文件)。它将在初始断点处停止。
  3. Set up the symbols ,至少 .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

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

  1. 转到工具 |选项 ... 在主菜单中
  2. 选择调试 |选项菜单中的符号
  3. 如果要将文件存储在特定目录中,请输入目录名称。

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

Symbols in Visual Studio 2015 Community Edition

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com