在过程出口中打破视觉工作室

Break in Visual Studio on process exit

本文关键字:视觉 工作室 过程 出口      更新时间:2023-10-16

我在确定导致进程退出的原因时遇到了一些困难。我正在调试一些关机代码中的断点,但是,在断点并踏上一次调试器后,整个过程立即退出。每个线程在输出窗口中报告一个-1的退出代码。当时的过程中有很多线程,并且代码库很大,因此很难搜索罪魁祸首。

我已经尝试安装std::atexit功能,但这不会受到打击。我还尝试过覆盖SetUnhandledExceptionFilter,以防它是由崩溃引起的,并且也不会受到打击。该项目已禁用例外(#define _HAS_EXCEPTIONS=0),因此我无法调用std::set_terminatestd::set_unexpected

是否还有其他方法可以确定什么导致该过程退出?当过程即将终止时,有些选项可以打破调试器?

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

如果您在那里看不到任何有趣的东西,则表示您的应用程序称为exitProcess/exitthread/exit,或更糟糕的是,terminateProcess/terminateThread/_exit。

您可以在这些上放置断点。在启动时设置一个断点,启动调试器。确保您有针对相关DLL的调试符号,kernel32.dll for exitprocess and Friends,还有其他一些DLL,例如出口,例如ucrtbase.dll。在"断点"窗口中按"新/功能断点",例如" ExitProcess",按OK。

您也可以尝试使用Windows SDK的GFLAGS工具。

如果您可以找到(通过读取Windows logs>应用程序)原因是自我退出,则可以在GFLAGS中检查"启用转储集合",然后您可以将转储加载到Windbg中并获得完整的呼叫堆栈告诉您谁打电话给谁。

不幸的是,该工具的最新版本被破坏了。

但是您可以安装旧的Windows SDK。您只需要从那里开始的" Windows调试工具",无需安装完整的SDK。