在啥情况下会在控制权到达 main() 函数之前发生崩溃? [复制]

Posted

技术标签:

【中文标题】在啥情况下会在控制权到达 main() 函数之前发生崩溃? [复制]【英文标题】:In what scenarios crash happens before control comes to main() function? [duplicate]在什么情况下会在控制权到达 main() 函数之前发生崩溃? [复制] 【发布时间】:2011-04-09 04:57:12 【问题描述】:

可能重复:Is there any way a C/C++ program can crash before main()?

您好,在什么情况下,应用程序在控制到达 main() 函数之前崩溃? 到目前为止我的理解:全局和全局静态初始化发生在 main() 之前。因此,如果初始化顺序不正确,那么在使用未初始化的指针等时可能会导致崩溃。

可能的解决方案:使用函数获取静态指针值,以便它们可以初始化并返回正确的指针。

我在 Program crashes in debugger before anything happens

我正在寻找更多信息。 这种崩溃还有其他情况吗? 以及避免此类崩溃的解决方案是什么?

【问题讨论】:

解决方案:不要使用全局变量。 【参考方案1】:

全局对象和静态类数据成员在调用main() 之前调用它们的构造函数。如果这些构造函数崩溃,程序会在调用main() 之前崩溃。这是避免使用全局变量的众多充分理由之一。

如果您遇到许多全局变量,您可以通过在其构造函数中放置断点或调试输出来调试它们。依赖问题可以通过将全局变量转换为函数局部静态变量来解决,在第一次使用时构建。

【讨论】:

【参考方案2】:

您已经给出了自己的大部分要求。 但这里有一些额外的信息:

在 Visual c++ 中,您可以通过以下方式控制初始化顺序:

#pragma init_seg(...)

在 gcc 中是这样的:

__attribute__ ((init_priority (2000)))

您现在可以阅读有关详细信息的相应文档。

【讨论】:

【参考方案3】:

如果使用过大的全局成员,耗尽可用内存,程序会在 main 之前崩溃或被操作系统杀死。

如果您的程序与具有初始化代码的动态库链接,则该代码可以在 main 之前运行,具体取决于您的操作系统。该代码可能会崩溃。

许多其他脑死亡案例,当它故意崩溃时。

【讨论】:

以上是关于在啥情况下会在控制权到达 main() 函数之前发生崩溃? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

AppDomain.DoCallback()在啥情况下会失败?

memcpy在啥情况下会失败

memcpy在啥情况下会失败

React:useState 钩子中的 setState 在啥情况下会导致重新渲染?

SQLite中的页面缓存在啥情况下会被清除?

.NET 进程和 AppDomain 在啥情况下会共享内存中加载的程序集?