我在确定导致流程退出的原因时遇到了一些困难。我在调试的一些关闭代码中有一个断点,但是,在断点处调试调试器并踩一次后,整个过程立即退出。每个线程在输出窗口中报告退出代码-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=0
或std::set_terminate
。
还有其他方法可以确定导致进程退出的原因吗?有一些选项可以在进程即将终止时中断调试器吗?
答案 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。