【问题标题】:Boost Thread Access Violation in Boost Log on shutdown关闭时 Boost Log 中的 Boost 线程访问冲突
【发布时间】:2017-07-07 13:53:56
【问题描述】:

我有一个使用增强日志记录的应用程序。在关闭期间,它在空指针访问时遇到访问冲突。当我单步执行代码到故障点时,似乎 boost::log dll 正在被解除分配,然后 boost::thread 代码尝试访问曾经被 log dll 占用的内存。

我没有在自己的代码中使用任何 boost 线程,因此假设 boost 日志使用了 boost-thread dll。

为确保在关闭之前销毁所有接收器,我调用:core->flush() 和 core->remove_all_sinks()

我正在使用 boost 1.60,并且也尝试过使用 boost 1.63。结果一样。

有没有办法确保在退出/卸载 dll 之前完全关闭 boost 日志记录核心?

【问题讨论】:

  • 您有出现问题的最小代码示例吗?
  • "Boost.Log 不支持插件卸载,因为它在内部保存了对各种静态数据和代码的引用。" - 提升日志作者。通过避免在我的插件中使用 boost log 解决了问题,因为它不支持我的用例。
  • 您是指应用程序关闭还是系统关闭?
  • DLL 卸载。该应用程序是游戏引擎中的一个 dll 插件。当插件卸载时,boost log dll和boost thread dll也会被卸载。这一次,boost 线程代码正在访问之前被 boost log 代码占用的代码空间 (RAM)。
  • @JeffV,你知道 DllMain 的限制吗?以防万一:stackoverflow.com/questions/17259729/…

标签: c++ boost boost-thread boost-log


【解决方案1】:

这个问题可能与 boost 系统设置的语言环境对象有关。同样,在您的情况下,此语言环境可能会在 Boost.Log 被取消初始化之前被破坏,从而导致崩溃。

根据 boost 文档,特别是日志文件轮换模块。他们为类似案例提供了解决方法Boost known issues

解决方案是在主循环中初始化语言环境,以便 boost 有足够的循环在最后进行清理。

int main(int argc, char* argv[])
{
    boost::filesystem::path::imbue(std::locale("C"));
    initialize_log();

    // ...
}

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多