2017-02-17 7 views
4

J'ai une application qui utilise la journalisation boost. Lors de l'arrêt, il obtient une violation d'accès sur un accès pointeur nul. Lorsque je passe le code au point d'échec, il semble que le fichier boost :: log dll est en train d'être désaffecté, puis boost :: thread code essaye d'accéder à la mémoire qui était autrefois occupée par la DLL du journal.Boost Accédez Violation d'accès dans Boost Connexion à l'arrêt

Je n'utilise pas de threads boost dans mon propre code, et supposons donc que le dll boost-thread est utilisé par boost log.

Pour vous assurer que tous les puits sont détruits avant l'arrêt, je vous appelle: core-> flush() et> remove_all_sinks de core()

J'utilise boost 1.60 et ai essayé avec boost 1,63. Même résultat

Y a-t-il un moyen de s'assurer que le noyau de journalisation de boost est complètement arrêté avant de quitter/décharger les dll?

+0

Avez-vous un échantillon de code minimum où le problème se produit? –

+0

"Boost.Log ne prend pas en charge le déchargement des plugins car il enregistre en interne des références à diverses données statiques et code." - Boost Journal auteur. Résolution du problème en évitant d'utiliser le journal boost dans mon plugin car il ne supporte pas mon cas d'utilisation. – JeffV

+0

Voulez-vous dire l'arrêt de l'application ou l'arrêt du système? – KonstantinL

Répondre

1

Ce problème peut se produire avec les objets régionaux définis par le système de survoltage. De même, dans votre cas, ces paramètres régionaux risquent d'être détruits avant que Boost.Log soit désinitialisé, ce qui entraîne un plantage.

Selon le document boost en particulier le module de rotation des fichiers journaux. Ils ont fourni une solution de contournement pour un cas similaire Boost known issues

La solution serait d'initialiser les paramètres régionaux dans la boucle principale de sorte que l'accélération ait suffisamment de cycles pour effectuer le nettoyage à la fin.

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

    // ... 
}