sisoputnfrba / foro

Foro de consultas para el trabajo práctico
148 stars 7 forks source link

Segmentation fault en log.c #3549

Closed lucasciola1 closed 5 months ago

lucasciola1 commented 5 months ago

Me sale segmentation fault en la funcion _isEnableLeveInLogger del archivo de las commons log.c image

Esto sale cuando corro el siguiente codigo:

int main(int argc, char* argv[]) {
    iniciar_config();
    //Iniciar servidor de memoria
    fd_memoria = iniciar_servidor(PUERTO_ESCUCHA, memoria_logger, "Servidor Iniciado Correctamente" );
    //Esperar conexion de E/S

}

void iniciar_config(){
    memoria_logger = log_create("memoria.log", "LOGGER MEMORIA", true, LOG_LEVEL_INFO);
    memoria_log_debug = log_create("memoria_debug.log","LOGGER DEBUG MEMORIA", true , LOG_LEVEL_DEBUG);
    memoria_config = config_create("./memoria.config");

    PUERTO_ESCUCHA = config_get_string_value(memoria_config,"PUERTO_ESCUCHA");
    TAM_MEMORIA = config_get_int_value(memoria_config,"TAM_MEMORIA");
    TAM_PAGINA = config_get_int_value(memoria_config,"TAM_PAGINA");
    PATH_INSTRUCCIONES = config_get_string_value(memoria_config,"PATH_INSTRUCCIONES");
    RETARDO_RESPUESTA = config_get_int_value(memoria_config,"RETARDO_RESPUESTA");

    log_info(memoria_logger,PUERTO_ESCUCHA);
    log_info(memoria_logger,"Estructuras inicializadas correctamente");
}

Siendo la funcion iniciar_servidor la siguiente:

int iniciar_servidor(char* puerto, t_log* logger1, char* msj)
{
    int socket_servidor;

    struct addrinfo hints, *servinfo, *p;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, puerto , &hints, &servinfo);

    socket_servidor = socket(servinfo->ai_family,
                        servinfo->ai_socktype,
                        servinfo->ai_protocol);

    bind(socket_servidor,servinfo->ai_addr, servinfo->ai_addrlen);

    listen(socket_servidor, SOMAXCONN);
    freeaddrinfo(servinfo);
    log_info(logger1,"SERVER: %s", msj);

    return socket_servidor;
}

Vale aclarar que al correr el programa los dos logs de la funcion iniciar_configs se ejecutan bien.

iago64 commented 5 months ago

Buenas! Cómo va?

Si te fijas en los valores de las variables, la variable logger esta llegando en null (o 0x0 como lo muestra vscode)

image

Revisen con el debug que estan pasando bien el logger a todos los lados donde lo quieren usar.

Saludos.-

lucasciola1 commented 5 months ago

Buenas, aunque elimine la linea:

log_info(logger1,"SERVER: %s",msj) ;

Igualmente sigo recibiendo el mismo error, aunque en la funcion iniciar_servidor sin esa linea no se utilice un logger en ningun momento.

Me parecio raro que el error me dirija directamente a las commons.

Gracias

RaniAgus commented 5 months ago

¡Buenas! El error aparece en esa línea ya que es la última función en la cual cuenta con una referencia de código. Eso es porque nosotros les recomendamos desde un inicio compilar e instalar las commons en modo debug.

Sin embargo, sepan que el código de las commons está exhaustivamente testeado (no solo por los unit tests sino también por varios años de cursada, por lo que difícilmente el bug se encuentre ahí.

Entonces, al igual que si uno encuentra un segmentation fault al llamar a printf() probablemente se deba a algún problema con los parámetros, lo mismo aplica para las commons.

Como bien dice Dami, Valgrind es una excelente herramienta para detectar errores de manejo de memoria, ya que entre otras cosas te devuelve la pila de llamados a funciones desde la cual se origina el error.

En VSCode también pueden acceder a dicha pila abajo a la izquierda:

image

Desde ahí pueden clickear y saltar directamente a la función que llamó a log_info, en este caso:

image

También lo hermoso de esto es que a la derecha pueden contar con el estado de las variables de esa función que llamó a log_info() ☺️

Saludos

RaniAgus commented 5 months ago

PD: Otra cosa, viendo la primera captura de pantalla entiendo que estás llamando a log_trace() en vez de log_info(), ya que el log level que recibe es LOG_LEVEL_TRACE.

lucasciola1 commented 5 months ago

Hola, un compañero ejecuto el mismo codigo en otra computadora y le funciona perfectamente. Probe varias cosas y ya no se que puede ser lo que genere esto. Gracias

iago64 commented 5 months ago

Buenas! Cómo va?

Si otro compañero ejecutó el mismo código y le funcionó bien y el problema lo tenes al momento de loggear algo que por esas casualidades levantaste de un config... creo que tu problema es algo que tratamos en el doc de Rutas Relativas y Absolutas

Parece una gilada, pero esto de las rutas genera problemas incluso en empresas que mueven toneladas de guita por día, por las dudas revisa el doc y checkea lo que estas ejecutando a ver si no es el caso.

Saludos.-

RaniAgus commented 5 months ago

¿Probaste revisando con el Debugger en qué línea se produce el error? Repito, viendo la captura entiendo que hay un llamado a log_trace() pero en el código que pasaste no veo ninguno.

lucasciola1 commented 5 months ago

Ese creo que es el problema, nunca cree un loger con LOG_LEVEL_TRACE, el logger que se pasa como parametro a iniciar_servidor es uno en LOG_LEVEL_INFO, y al loggear utilizo la funcion log_info.

Pero como se ve en la primera captura y mencionaste, en el debugger figura como LOG_LEVEL_TRACE

lucasciola1 commented 5 months ago

Lo que figura en el apartado "Call Stack" del debugger es lo siguiente:

image

El archivo conexion_srv.c no existe, y nunca fue creado, no entiendo el porque figura eso.

RaniAgus commented 5 months ago

Mmm... Eso significa que estás debuggeando código viejo. Raro porque supuestamente la configuración "debug.onTaskErrors": "abort" que está en el workspace te debería frenar eso. ¿Cuál es el output de la consola al compilar? Copiá y pegá el texto como acá:

image

También la parte de "executing task: make all" y lo de abajo, por las dudas

lucasciola1 commented 5 months ago

El output al compilar el modulo es:

make: Nothing to be done for 'all'.

RaniAgus commented 5 months ago

Hagamos algo... Andá a Terminal > Run Task, seleccioná la que dice clean para memoria y lo mismo para utils, y por último volvé a compilar. Eso debería resolver el problema de llamar a una función "fantasma" ya que no debería existir en tu nuevo ejecutable.

lucasciola1 commented 5 months ago

Ahi lo pude solucionar con lo de clean. Muchisimas gracias!!