2017-02-17 27 views
4

У меня есть приложение, которое использует буксировочный журнал. Во время выключения он получает нарушение доступа при доступе нулевого указателя. Когда я перехожу через код к точке отказа, кажется, что файл boost :: log dll де-распределяется, а затем boost :: thread code пытается получить доступ к памяти, которая когда-то была занята log dll.Устранение нарушения доступа к потоку в Boost Log on shutdown

Я не использую ни одного повышающего потока в своем собственном коде, и поэтому предположим, что dll boost-thread используется буфером boost.

Чтобы убедиться, что все раковины разрушены до остановки, я звоню: core-> вровень() и> remove_all_sinks core-()

Я использую импульс 1.60 и также попытался это с повышением 1,63. Тот же результат.

Есть ли способ обеспечить, чтобы ядро ​​бустерного бурения было полностью закрыто перед выходом/выгрузкой DLL?

+0

У вас есть образец минимального кода, где возникает проблема? –

+0

«Boost.Log не поддерживает выгрузку плагинов, поскольку он сохраняет ссылки на различные статические данные и код внутри». - Boost Log автор. Решенная проблема, избегая использования буфера в моем плагине, поскольку он не поддерживает мой прецедент. – JeffV

+0

Вы имеете в виду выключение приложения или выключение системы? – KonstantinL

ответ

1

Эта проблема может быть связана с объектом локали, установленным системой повышения. Аналогично, в вашем случае этот локаль может быть уничтожен до того, как Boost.Log деинициализируется, что приводит к сбою.

Как и в случае с дополнительными документами, особенно с помощью модуля поворота файла журнала. Они предоставили обходное решение для аналогичного случая. Boost known issues

Решение было бы инициализировать локаль в основном цикле, чтобы у boost было достаточно циклов для очистки в конце.

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

    // ... 
}