静态对象破坏时崩溃 我正在研究一个第三方C++应用程序。它在出口时撞坏了。如果我看一下堆栈,我得到的只是uu静态u初始化u和_销毁0函数和许多问号。项目是巨大的,不幸的是它有许多静态对象。有没有办法找出哪一个正在崩溃?

静态对象破坏时崩溃 我正在研究一个第三方C++应用程序。它在出口时撞坏了。如果我看一下堆栈,我得到的只是uu静态u初始化u和_销毁0函数和许多问号。项目是巨大的,不幸的是它有许多静态对象。有没有办法找出哪一个正在崩溃?,c++,static,destructor,C++,Static,Destructor,如果可以的话,在运行时附加一个调试器,它会让你在崩溃时崩溃 否则,您可以尝试在析构函数中添加日志信息,例如: std::cout << "In ~SomeObject." << std::endl; 无效的调用堆栈可能表示堆栈已被某个析构函数损坏。我建议在实例化静态对象的每个析构函数中放置一个断点,然后可以确定最后执行的析构函数是哪个 同样在每次中断时,您应该观察调用堆栈是否有损坏的迹象。如果将中断放在每个析构函数的末尾,则可能会在堆栈实际崩溃之前看到损坏的堆栈 如果您

如果可以的话,在运行时附加一个调试器,它会让你在崩溃时崩溃

否则,您可以尝试在析构函数中添加日志信息,例如:

std::cout << "In ~SomeObject." << std::endl;

无效的调用堆栈可能表示堆栈已被某个析构函数损坏。我建议在实例化静态对象的每个析构函数中放置一个断点,然后可以确定最后执行的析构函数是哪个

同样在每次中断时,您应该观察调用堆栈是否有损坏的迹象。如果将中断放在每个析构函数的末尾,则可能会在堆栈实际崩溃之前看到损坏的堆栈


如果您有一种类型的多个对象,您可以在确信该类正确执行后删除该类的断点。此外,您可能只能在仅静态实例化的类中放置断点。

尽管这可能不是您想要的建议,但请避免使用静态对象。原因是无法保证施工和破坏秩序

我在这里猜测,但完全有可能一个静态对象依赖于另一个静态对象。既然没有办法保证毁灭的顺序,你就有麻烦了


将静态对象更改为在主函数开始时创建并在主函数结束时销毁的指针可能是值得的。然后您可以选择对它们进行适当的排序。

您需要在此处发布更多数据,以了解初学者如何获得堆栈转储?在Linux下,当我看到堆栈/堆损坏时,我的第一个调用端口几乎总是使用valgrind运行程序。确实如此,但函数名为(?)这没有帮助。请尝试在堆栈中备份一点。您是否尝试过输入一些信息。?