在进程退出时中断Visual Studio

时间:2017-09-14 13:52:55

标签: c++ visual-studio visual-c++ atexit

我在确定导致流程退出的原因时遇到了一些困难。我在调试的一些关闭代码中有一个断点,但是,在断点处调试调试器并踩一次后,整个过程立即退出。每个线程在输出窗口中报告退出代码-1。当时进程中有大量的线程,而且代码库非常大,使搜索罪魁祸首变得困难。

我已尝试安装std::atexit功能,但这并没有受到影响。我还尝试覆盖SetUnhandledExceptionFilter,以防它是由崩溃引起的,并且它也没有被击中。该项目已禁用例外(Private Sub TextBox1_TextChanged(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyUp Dim text1 As String = TextBox1.Text Dim textboxFont As Font = TextBox1.Font Dim textSize As Size = TextRenderer.MeasureText(text1, textboxFont) If textSize.Width > TextBox1.ClientRectangle.Width Then Dim cursorLocation As Integer = TextBox1.SelectionStart TextBox1.Text = TextBox1.Text.Remove(cursorLocation - 1, 1) If cursorLocation > TextBox1.Text.Length Then TextBox1.SelectionStart = TextBox1.Text.Length Else TextBox1.SelectionStart = cursorLocation End If End If End Sub ),因此我无法致电#define _HAS_EXCEPTIONS=0std::set_terminate

还有其他方法可以确定导致进程退出的原因吗?有一些选项可以在进程即将终止时中断调试器吗?

2 个答案:

答案 0 :(得分:4)

使用调试器运行您的应用程序并阅读调试输出。如果应用程序因C ++异常或SEH而终止,您将在输出窗口中读取它。

如果您没有看到任何有趣的内容,则表示您的应用程序名为ExitProcess / ExitThread / exit,或者更糟糕的是,TerminateProcess / TerminateThread / _exit。

你可以在这些上加点断点。在启动时设置断点,启动调试器。确保为相关DLL加载调试符号,为ExitProcess和朋友加载kernel32.dll,为退出加载一些其他DLL,例如ucrtbase.dll。按“新建/功能断点”,输入例如“ExitProcess”,按OK。

答案 1 :(得分:0)

您也可以尝试使用gflags tool from Windows SDK

如果您发现(通过阅读Windows日志>应用程序)原因是自行退出,您可以在gflags中检查“启用转储集合”,然后您就可以在WinDBG中加载转储并获得完整调用堆栈告诉你谁叫什么。

不幸的是,该工具的最新版本是broken beyond repair

但你可以install older Windows SDK。您只需要“从Windows调试工具”,无需安装完整的SDK。