【问题标题】:Crash at static object destruction静态对象破坏时崩溃
【发布时间】:2009-12-28 07:39:30
【问题描述】:

我正在开发第 3 方 c++ 应用程序。它在退出时崩溃。如果我查看堆栈,我得到的只是 __static_initialization_and_destruction_0 函数和许多问号。项目很大,不幸的是它有很多静态对象。有什么方法可以查出是哪一个崩溃了?

【问题讨论】:

  • 您需要在此处发布更多数据,首先,您是如何获得堆栈转储的?
  • 在 Linux 下,当我看到堆栈/堆损坏时,我的第一个调用端口几乎总是使用 valgrind 运行程序。

标签: c++ static destructor


【解决方案1】:

尽管这可能不是您正在寻找的建议,但请避免使用静态对象。这样做的原因是没有办法保证构建和销毁的顺序。

我在这里猜测,但一个静态对象完全有可能依赖于另一个静态对象。由于无法保证破坏的顺序,您最终会遇到麻烦。

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

【讨论】:

    【解决方案2】:

    如果可以,请在附加调试器的情况下运行,它会让您在崩溃时中断。

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

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

    【讨论】:

    • 可以,但函数名称是 (??) 没有帮助。
    • 尝试在堆栈中备份一点。你试过cout一些信息吗?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-26
      • 1970-01-01
      • 2023-03-29
      • 2015-12-16
      • 1970-01-01
      • 2021-01-02
      • 2017-05-20
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多