在进程退出时中断 Visual Studio

Posted

技术标签:

【中文标题】在进程退出时中断 Visual Studio【英文标题】:Break in Visual Studio on process exit 【发布时间】:2017-09-14 13:52:55 【问题描述】:

我在确定导致进程退出的原因时遇到了一些困难。我正在调试的一些关闭代码中有一个断点,但是,在断点处中断调试器并单步执行后,整个过程立即退出。每个线程在输出窗口中报告退出代码 -1。当时进程中有大量线程,代码库也很大,很难找到罪魁祸首。

我尝试安装 std::atexit 函数,但没有成功。我也尝试过覆盖SetUnhandledExceptionFilter,以防它是由崩溃引起的,并且它也不会被击中。该项目已禁用异常 (#define _HAS_EXCEPTIONS=0),因此我无法调用 std::set_terminatestd::set_unexpected

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

【问题讨论】:

我不是很专家...调试器一步一步没有帮助?如果无法及时反映操作顺序,请在代码 ecc 中使用 printf("1") printf("2") 来识别代码未执行的位置 异常被项目设置(C/C++->代码生成)而不是 #define 禁用。所以Debug->Windows->Exception Settings 可能有用。 或在您的 main 中添加一个 trycatch...,然后即使没有调试器设置,您也可以查看它是否是带有断点的未捕获异常。 @UKMonkey - 在main 中已经有一个__try/__finally 块,而__finally 块没有被命中。 "atexit" 仅在正常终止时运行;所以我对没有被调用并不感到惊讶。我会考虑添加一些信号处理程序en.cppreference.com/w/cpp/utility/program/signal,以便您至少可以跟踪正在发生的事情。 【参考方案1】:

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

如果您在那里没有看到任何有趣的东西,这意味着您的应用名为 ExitProcess/ExitThread/exit,或者更糟的是 TerminateProcess/TerminateThread/_exit。

您可以在这些上设置断点。在启动时设置断点,启动调试器。确保您为相关 DLL 加载了调试符号,为 ExitProcess 和朋友加载了 kernel32.dll,还有一些其他 DLL 用于退出,例如ucrtbase.dll。在 Breakpoints 窗口中按“New / Function breakpoint”,输入例如“退出进程”,按确定。

【讨论】:

虽然这是一个合理的答案......但它对我不起作用(请参阅问题上的 cmets)。 很好的提示!谢谢!【参考方案2】:

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

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

很遗憾,该工具的最新版本是broken beyond repair。

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

【讨论】:

以上是关于在进程退出时中断 Visual Studio的主要内容,如果未能解决你的问题,请参考以下文章

12个Visual Studio调试效率技巧

12个Visual Studio调试效率技巧

12个Visual Studio调试效率技巧

12个Visual Studio调试效率技巧

为啥matlabcontrol在代理创建时中断调用线程?

在代码执行进入 Dll 或 Lib 空间时中断