在进程退出时中断 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_terminate
或 std::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的主要内容,如果未能解决你的问题,请参考以下文章