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.

Fallo de segmentación poco común durante la creación de un objeto con new.

En una aplicación Java, uso JNI para llamar a varios métodos de C++. Uno de los métodos crea un objeto que debe persistir después de que el método haya terminado y que se utiliza en otras llamadas de método. Con este fin, creo un puntero del objeto, que devuelvo a Java como una referencia para un acceso posterior (nota: la clase Java implementa Closable y en el método close, llamo a un método para eliminar el objeto).

Sin embargo, en casos raros, aproximadamente después de 50.000 llamadas, el código de C++ arroja un error de segmentación. Según el contenido del archivo de registro, solo unas pocas líneas de código son sospechosas de ser la fuente del error (están entre el último mensaje de registro impreso y el siguiente):

MyObject* handle = new MyObject(some_vector, shared_ptr1, shared_ptr2);
handles.insert(handle); // handles es un std::set
jlong handleId = (jlong) handle;

Me gustaría saber si hay un posible problema aquí, aparte de que estoy utilizando punteros de estilo antiguo de C. ¿Podría ser un problema el multinúcleo? ¿O podría truncarse el ID del puntero al convertirse en jlong?

También quiero señalar que, según mi experiencia anterior, soy consciente de que el registro solo es un indicador aproximado de dónde ocurrió un error de segmentación. También podría haber ocurrido más adelante en el código y el siguiente mensaje de registro simplemente no se ha impreso aún. Sin embargo, reproducir este error puede llevar de 1 a 2 días, así que me gustaría comprobar si estas líneas tienen algún problema.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En este escenario, hay varios problemas posibles que podrían contribuir a la violación de segmento.

    En primer lugar, el uso de punteros C de estilo antiguo puede ser problemático, ya que no ofrecen el mismo nivel de gestión de memoria y características de seguridad que proporcionan los punteros inteligentes modernos. Esto puede causar fugas de memoria o errores de acceso a memoria, lo que podría llevar a una violación de segmento.

    En segundo lugar, la multithreading también puede ser un problema posible, especialmente si el conjunto de handles se está accediendo simultáneamente por varios hilos sin una sincronización adecuada. Esto puede llevar a condiciones de carrera y violaciones de acceso a memoria, que también podrían resultar en una violación de segmento.

    Por último, la posibilidad de que la identificación del puntero se trunque cuando se convierte en jlong también existe, especialmente si el tamaño del puntero no está garantizado que quepa dentro de un jlong. Esto puede llevar a una interpretación incorrecta de la dirección de memoria y dar lugar a violaciones de acceso a memoria.

    Para determinar la causa raíz de la violación de segmento, sería útil realizar una investigación y análisis adicionales, incluyendo el examen del código C++ relacionado con MyObject y analizando cualquier traza de pila o herramienta de depuración de memoria. Además, realizar pruebas de estrés o pruebas de concurrencia en la aplicación puede ayudar a identificar cualquier problema relacionado con la multimultiplexación.

Comments are closed.