es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C++: La aplicación se bloquea con abort() en la función de registro.

Aquí está mi código que se ejecuta en Windows:

Log.h

#include <iostream>
#include <sstream>
#include <fstream>
#include <shared_mutex>
#include <thread>
#include <iomanip>

class Log {
public:
    static std::ofstream myfile;
    static std::shared_mutex m_smutex;

    static bool isLogEnabled();
    static void close() {
        Log::myfile.close();
    }
    template<typename... args="">
    static void debug(const char* format, Args... args) {
        std::unique_lock<std::shared_mutex> lock(Log::m_smutex);

        if (isLogEnabled()) {
            if (!Log::myfile.is_open()) {
                Log::myfile.open("C:\\tmp\\log.txt", std::ios_base::app);
            }
            ...
            Log::myfile.close();
        }
        else {
            if (Log::myfile.is_open()) {
                Log::myfile.flush();
                Log::myfile.close();
            }
        }
    }
};

Puedes ver que he eliminado la mayor parte del código (…) porque he reducido el problema.

Log.cpp

#include <windows.h>
#include "Log.h"

std::ofstream LogLine::myfile;
std::shared_mutex LogLine::m_smutex;
bool LogLine::isLogEnabled() {
    CHAR regeditPath[MAX_PATH] = { 0 };
    CHAR variable[] = "DEBUG_LOGS";
    GetEnvironmentVariableA(variable, regeditPath, MAX_PATH);

    return GetLastError() == ERROR_ENVVAR_NOT_FOUND ? false : true;
}

El proceso debe ejecutarse siempre, por eso abro y cierro el archivo cada vez que registro algo. Quiero poder eliminar los registros incluso cuando el proceso sigue en ejecución. Tal vez esto sea absurdo porque podría haber una bandera que me permita eliminar los registros mientras el archivo está abierto por algún proceso.

Uso de ejemplo:

Log::debug("little test %d", 10);

Como puedes ver, uso un mutex porque quiero llamar a la función “debug” desde diferentes hilos. El problema es que después de un tiempo obtengo el código de error “Abort() ha sido llamado”, pero no puedo entender por qué.

P.D.
Creé este código en un Proveedor de Credenciales personalizado para habilitar la depuración, pero estoy buscando en Internet y parece que nadie está usando el registro allí. ¿Es esto porque está prohibido? ¿Quizás esta es la razón del fallo?</windows.h></typename…>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El código proporcionado parece ser una implementación básica para el registro de eventos con mutex para garantizar la seguridad de los hilos. Sin embargo, sin contexto adicional, es difícil determinar por qué se está produciendo el error “Se ha llamado a Abort()”.

    Es importante tener en cuenta que abrir y cerrar constantemente el archivo de registro puede resultar en una sobrecarga adicional y aumentar la probabilidad de errores. En su lugar, puede ser mejor mantener el archivo de registro abierto y utilizar el “flushing” para garantizar que los datos del registro se escriban en el archivo de manera oportuna.

    En cuanto al uso del registro de eventos en un proveedor de credenciales personalizado, no hay indicación de que esté prohibido. Puede ser simplemente que el registro de eventos no se use comúnmente en ese contexto. Sin embargo, puede ser útil consultar cualquier documentación o pautas relevantes para asegurarse de que se permita el registro de eventos y se implemente correctamente.

Comments are closed.