当您的程序在进入主程序之前崩溃时该怎么办?

What to do when your program crash before entering main?

本文关键字:崩溃 怎么办 主程序 程序      更新时间:2023-10-16

我有一个很奇怪的问题。我们公司的应用程序是一个用C++编写并使用Visual Studio 2017编译的桌面应用程序。在过去的几周里,有时应用程序会在进入main之前崩溃。我知道这一点,因为我在 main 的第一行放了断点,它永远不会被调用。崩溃不会很快发生,所以我有时间在诊断工具中按全部中断。但我只收到一条消息"您的应用程序已进入中断状态,但没有代码要显示,因为所有线程都在执行外部代码(通常是系统或框架代码("。有时清理所有内容并进行重建会使代码正常工作,但有时不起作用。

我什至不知道如何开始调查这个,代码已经有好几年的历史了,从来没有遇到过这个问题。

知道该怎么办吗?

编辑

按照建议,我在WinMainCRTStartup中设置了断点,并将问题追溯到exe_common.inl中的第224行函数__scrt_common_main_seh((:

if (_initterm_e(__xi_a, __xi_z( != 0( 返回 255;

该行失败,因此该函数返回 255,并且我的 main 从未被调用。还有什么想法吗?

我终于让我的程序再次工作了。原因是该程序现在使用Visual Studio 2017编译,但是与我的程序静态链接的一些库是使用以前的Visual Studio构建的,在我使用Visual Studio 2017重新编译它们后,我的程序运行良好。

因此,如果您的程序在退出之前崩溃,要检查的一件事是确保所有库都是使用相同的编译器和相同的编译器开关构建的。

假设调试器在捕获时遇到问题,我有一个可能只起作用的想法。 如何通过set_terminate设置自己的terminate功能?http://www.cplusplus.com/reference/exception/set_terminate/你可以在静态全局变量的构造函数中做到这一点,这可能会在导致软件崩溃的事情之前被调用。不幸的是,静态变量的初始化顺序是不确定的。 尝试在其中设置断点。

int main()
{
throw 0;
return 0;
}
struct reterminator
{
static void myterminate() {
std::cerr << "terminate handler calledn";
abort();  // forces abnormal termination
}
reterminator()
{
std::set_terminate(myterminate);
}
} static reterminator_;

我最近在VS 15.9.4上遇到了同样的崩溃,它似乎与扩展命令行通配符的setargv.obj有关。它影响 x64 发布版本,但不影响调试或 x86 版本,并且取决于参数格式。我的程序仅使用标准C++,没有外部库。除了几个 POD 之外,它没有全局或静态变量。

我有一个本地目录 solarcaptures,其中包含一个名为 0 长度的文件out_0001_21605508221437不带后缀。运行 collatepacket exe 会扩展命令行参数:

collatepackets solarcaptures*

但是,将命令行更改为以下内容会导致 x64 发布版本上的同一初始化代码中出现访问冲突。

collatepackets solarcapturesout*

更新:我制作了一个最小的程序,主要使用printf来列出参数。它在 x64 发布版本上崩溃。在最近的两个Windows 10上进行了测试,并安装了VS2017。非常可重复,但对要扩展的特定名称很敏感。缩短目录名称有时会使其正常工作。