java matlab debugging segmentation-fault matlab-class

java - Error de segmentación de Matlab al iterar la asignación de vectores



debugging segmentation-fault (1)

Con mucho, la causa más probable es que la operación esté internamente usando código de auto modificación. El problema con esto es que los procesadores modernos tienen cachés de CPU, por lo que si cambias el código en la memoria, pero el código ya ha sido asignado a un caché, generará un error seg.

La razón por la cual es aleatorio es porque depende de si el código modificado está en la memoria caché en el momento de la modificación y de otros factores.

Para evitar esto, el programador debe asegurarse de que el código limpie la caché antes de realizar una auto-modificación.

He estado vectorizando algún código de Matlab que había escrito previamente, y durante este proceso matlab comenzó a fallar debido a fallas de segmentación. Reduje el problema a un único tipo de cálculo: la asignación a múltiples propiedades de estructura.

Por ejemplo, incluso la autoasignación de esta forma eventualmente causa una falla seg cuando se ejecuta miles de veces:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

Inicialmente asumí que esto debía ser una pérdida de memoria de algún tipo, así que intenté imprimir la memoria libre de Java después de cada iteración, pero esto permaneció bastante constante.

Así que sí, completamente perdido ahora en cuanto a por qué se rompe esto: - /

ACTUALIZACIÓN: los siguientes cambios corrige el seg fallado:

temp = [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

La pregunta ahora es por qué esto arreglaría algo. ¿Algo sobre el acceso repetido a una clase de control en lugar de una lista de estructuras quizás?

ACTUALIZACIÓN 2: LA PARRILLA ESPESÓ

Finalmente, he replicado el problema y el trabajo en torno al uso de un programa ficticio lo suficientemente simple como para publicarlo aquí:

una clase simple:

classdef test_class properties test_prop end end

Y un programa que hace un montón de asignaciones de vectores con la clase, y siempre se bloqueará.

test_instance = test_class(); test_instance.test_prop = struct(''test_field'',{1 1}); for i=1:10000 [test_instance.test_prop.test_field] = test_instance.test_prop.test_field; end

ACTUALIZACIÓN 3: LA PARCELA DISMINUYE

Resulta que encontré un error. Según el soporte técnico de Matlab, la asignación repetida de vectores de propiedades de clase simplemente no funcionará en R2011a (y presumiblemente en versiones anteriores). Me dijo que funciona bien en R2012a, y luego mencionó la misma solución que descubrí: use una variable temporal.

Así que sí...

Estoy bastante seguro de que esta pregunta termina con ese ticket de soporte, pero si alguna persona atrevida quiere hacer una prueba de por qué existe este error, definitivamente seguiría interesado en esa respuesta. (¡aprender es divertido!)