Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当你的程序在进入main之前崩溃时该怎么办?_C++_Windows_Visual Studio - Fatal编程技术网

C++ 当你的程序在进入main之前崩溃时该怎么办?

C++ 当你的程序在进入main之前崩溃时该怎么办?,c++,windows,visual-studio,C++,Windows,Visual Studio,我有一个很奇怪的问题。我们公司的应用程序是一个桌面应用程序,用C++编写,并用Visual Studio 2017编译。在过去的几周里,有时应用程序会在进入main之前崩溃。我知道这一点,因为我把断点放在了主菜单的第一行,它从来没有被调用过。撞车不会很快发生,所以我有时间按下“全部中断”诊断工具。但我只收到一条消息“您的应用程序已进入中断状态,但没有代码显示,因为所有线程都在执行外部代码,通常是系统或框架代码”。有时候清理所有的东西和重新构建使代码工作,但有时候不行 我甚至不知道如何开始研究这个

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

我甚至不知道如何开始研究这个问题,代码已经有好几年了,从来没有出现过这个问题

知道怎么办吗

编辑

按照建议,我在WinMainCRTStartup中设置了断点,并将问题跟踪到exe_common.inl中的224行函数uu scrt_common_main_seh:

如果_initterm_e_xi_a,_xi_z!=0 返回255


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

假设调试器在捕捉到我的想法时遇到问题,我的想法可能只会起作用。 如何通过set_terminate设置您自己的终止函数? 您可以在静态全局变量的构造函数中执行此操作,它可能在软件崩溃之前被调用。不幸的是,静态变量的初始化顺序未定义。 尝试在其中设置断点

int main()
{
    throw 0;
    return 0;
}

 struct reterminator
{
    static void myterminate() {
        std::cerr << "terminate handler called\n";
        abort();  // forces abnormal termination
    }

    reterminator()
    {
        std::set_terminate(myterminate);
    }
} static reterminator_;

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


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

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

我有一个本地目录solarcaptures,文件长度为0,名为out_0001_21605508221437,没有后缀。运行exe扩展命令行参数:

collatepackets solarcaptures\*
但是,将命令行更改为以下命令会导致x64发行版上相同初始化代码中出现访问冲突

collatepackets solarcaptures\out*

更新:我制作了一个带有main的最小程序,使用printf列出参数。它在x64版本上崩溃。在两个最新的Windows 10上测试了它,并干净地安装了VS2017。非常可重复,但对扩展的特定名称非常敏感。缩短目录名有时会使它工作。

对于任何崩溃,通常要做的事情是在调试器中捕获它,并在代码中找到它发生的位置。如果它不是源于您的代码,那么您应该在main函数中查找大型数组,因为Windows每个进程只有一个默认的1M字节堆栈,并且在main之前崩溃通常是由于太多或太大的局部变量(包括数组)而导致堆栈溢出的迹象,通常存储在堆栈上。如果没有任何大型数组,则调试器应已捕获崩溃,并很可能将您指向某个全局变量初始化。我要检查的选项之一是缺少一些依赖项。如果您拥有所有依赖DLL,请验证工作目录是否设置正确。Visual Studio可以选择在特定功能上中断。您可以在那里输入一个初始化例程,在主函数之前中断并逐步完成反汇编。我该怎么做?你能给出具体的步骤吗?