C++ 找出什么叫快速失败

C++ 找出什么叫快速失败,c++,multithreading,debugging,crash,windbg,C++,Multithreading,Debugging,Crash,Windbg,我有一个我不熟悉的庞大的代码库,程序异常终止,因为某个线程正在调用uu fastfail。这是基于消息的,消息以 。。。请求致命程序退出 调用栈没有符号,因为它在C++ 2015运行时UCRTBASE.DLL内。调用似乎是在主线程以外的线程上进行的。这个神秘的线程只在问题发生之前启动,所以我无法在调试器中捕捉到它启动的行为-我不知道是什么启动了它,以及首先是什么导致整个过程 我在我的main中使用了SEH _try/_catch,所以任何未处理的异常都应该被捕获在那里。相反,我猜测某个地方出现了

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

。。。请求致命程序退出

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

我在我的main中使用了SEH _try/_catch,所以任何未处理的异常都应该被捕获在那里。相反,我猜测某个地方出现了一些气泡,导致了快速失败

我试着像main一样用SEH插入我的所有线程,试着挂起中止、退出和终止,但找不到问题。我如何调试它,有什么提示吗?

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

启动WinDbg,使用正确的比特数 在WinDbg文件/打开可执行文件下运行可执行文件。它将在初始断点处停止。 ,至少为.symfix c:\debug\symbols和.reload。如@所述,符号是可用的,这将在需要时下载它们。 继续使用g运行应用程序 复制问题 当WinDbg停止时, 使用.dump/ma c:\debug\mydump.dmp创建一个崩溃转储,以便以后进行分析 使用.exr-1获取有关异常的信息 切换到导致~s异常的线程 查看带有k的调用堆栈 学习WinDbg是一项艰巨的任务,因为大多数事情都是通过神秘的命令完成的,而不是通过UI完成的,但它几乎可以完成所有事情

如果你有更多的线索,可以用标签问更多的问题

Visual Studio Visual Studio还可以下载符号PDB文件;来自Microsoft服务器的调用堆栈信息

转到工具|选项。。。在主菜单中 从选项菜单中选择调试|符号 如果要将文件存储在特定目录中,请输入目录名。 以下是Visual Studio 2015社区版的外观:


Hans和James是对的,获得一个可读的调用堆栈是解决这个问题的关键

代码库安装了一个正在执行快速失败的纯调用处理程序。纯处理程序通过SEH。程序中40多个线程中的一个线程有一个纯调用错误,因为另一个线程部分清除了问题线程试图访问的程序状态。一旦我有了符号,VisualStudio在调用Pu召回处理程序的地方就闯入C++运行库,我把它追溯到他们安装了自己的程序。 他们快速失败的方式是复杂的,并分解成一些RtlXXX函数,显然无法用signalSIGABRT捕获,因为我以前确实尝试过


再次感谢大家的帮助

您可以尝试在CreateThread上设置断点,并查看在崩溃之前是如何进行的。ucrtbase.dll的公共符号在符号服务器上可用。您应该能够加载它们。实际上,它并没有使用uu fastfail。你必须深入挖掘,因为这是无法回答的。堆栈跟踪是非常必要的。它不需要做这么多工作。当uu fastfail中断发生时,系统将停止进程中所有线程的执行,然后通知调试器是否连接了一个线程。只要有为ucrtbase.dll加载的符号,就应该相当简单地遍历堆栈。VisualStudio调试器或windbg在这里都可以正常工作。