main()程序无法正常退出

时间:2015-05-27 18:15:06

标签: c++11

DiGSE的My C ++ 2011 main()程序是:

int main(int argc, char* argv[]) {
. . .
return EXIT_SUCCESS;
} // this } DOES match the opening { above

它正确编译和执行。紧接在返回输出之前的打印声明。但是,弹出Windows 7.1通知说" DiGSE.exe已停止工作。"然后它慷慨地提供搜索网络的解决方案。

我尝试用return 0替换return;出口(0);没有任何东西如此执行从底部落下(据我所知,这是可以接受的)。但是,在所有情况下我仍然会弹出窗口。

如何让main()正常退出?

DiGSE只是在MinGW 4.9.2上编译的Windows 7可执行文件的名称。 "完整"程序已被剥离:

int main(int argc, char* argv[]) {

try {
DiGSE::log_init(DiGSE::log_dest_T::console_dest, "dig.log", true,
                DiGSE::log_lvl_T::trace_lvl);
}//try

catch (const std::exception& ex) {
    std::cerr << FMSG("\n"
                      "Executing '%1%' raised this exception:\n"
                      "    %2%", % DiGSE::Partition::productName()
                      % ex.what())
              << std::endl;
    return EXIT_FAILURE;
}//exception

catch (...) {
    std::cerr << FMSG("\n"
                      "Executing '%1%' instance raised an unknown exception.",

                      % DiGSE::Partition::productName())
               << std::endl;
    return EXIT_FAILURE;
}//exception

L_INFO(FMSG("'%1% v%2%' terminated normally.", 
            % DiGSE::Partition::productName()
            % DiGSE::Partition::productVersion()))
return EXIT_SUCCESS;

} // main()的

L_INFO()是一个日志记录调用,它应该按原样输出。顶部的log_init()初始化日志。注释掉log_init()和L_INFO()与最初报告的结果相同。

编程接收信号SIGSEGV,分段故障。 libstdc ++中的0x000000006fc8da9d - 6!_ZNSo6sentryC1ERSo()    来自D:\ Program Files \ mingw-w64 \ x86_64-4.9.2-posix-seh-rt_v3-rev0 \ mingw64 \ bin \的libstdc ++ - 6.dll

当mail()退出时,这就是gdb返回的内容。即使注释掉了log_init()和L_LNFO(),它也会这样做。所以问题可能在于它与之相关联的全局内容之一。

1 个答案:

答案 0 :(得分:3)

程序完全可能在main结束后崩溃 - 程序还没有结束。 main()返回后执行以下项目:

  • 已注册的at_exit处理程序
  • main()自动变量的析构函数,以及具有静态存储持续时间的所有变量(全局变量和函数静态)(仅限C ++)
  • 您正在使用的所有动态库中的
  • DllMain(PROCESS_DETACH)代码(仅限Windows)

除此之外,各种事件可能发生在您的程序之外并导致您可能会因程序失败而导致的错误(特别是如果您的程序分叉或生成自己的副本):

  • SIGCHLD被引发(在* nix上)。进程句柄变为信号并导致等待函数返回(在Windows上)
  • 放弃所有打开的句柄(文件描述符),并调用驱动程序中的close处理程序
  • 连接的另一端(管道,套接字)转换为断开状态(读取返回0,写入失败,可能会引发* nix SIGHUP

我建议附加一个调试器,在main的末尾设置一个断点,然后单步执行清理代码以找出发生故障的位置。划分和征服也可能有所帮助(删除一些全局变量,或特定DLL的所有用法)。