Métodos / Herramientas para la resolución de un misterio violación de segmento, mientras que se ejecutan en condor

StackOverflow https://stackoverflow.com/questions/3681755

  •  02-10-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una aplicación de C que se ejecuta a través de un clúster de cálculo (utilizando condor). He intentado muchos métodos para revelar el código de ofender, pero en vano.

Las claves:

  • En promedio, cuando ejecuto el código en 15 máquinas durante 2 días, tengo dos o tres segfaults (señal 11).
  • Cuando ejecuto el código localmente no consigo una violación de segmento. Lo corrió durante casi 3 semanas en mi máquina de casa.

Los intentos:

  • Me corrió el código en valgrind durante cuatro días a nivel local, sin errores de memoria.
  • Me capturó la señal de error de segmentación mediante la definición de mi propio manejador de la señal para que yo puede dar salida a algunos del estado del programa.
  • Ahora, cuando un error de segmentación ocurre que puede imprimir usando la pila actual traza inversa.
  • I puede imprimir valores de las variables.
  • I creó una variable que se establece en el número de línea actual.
  • también han intentado comentar trozos de código, con la esperanza de que si el problema desaparece voy a descubrir la violación de segmento.

Por desgracia, el número de línea emitida es bastante aleatoria. No estoy seguro del todo lo que puedo hacer con el StackTrace. Estoy en lo cierto al suponer que sólo se registra la dirección de la función en la que se produce la violación de segmento?

Las sospechas:

  • Sospecho que el sistema de verificación que señala el cual usos condor para mover puestos de trabajo a través de las máquinas es más sensible a la corrupción de memoria y es por eso que no lo veo de forma local.
  • que los índices están siendo corrompido por el insecto, y que estos índices están causando la violación de segmento. Esto explicaría el hecho de que las violaciones de segmento se están produciendo en los números de línea bastante al azar.

Actualizar

investigando este poco más he encontrado los siguientes enlaces:

ACTUALIZACIÓN 2

Greg sugirió que se examine el registro de cóndor y a 'correlacionar los segfaults a condor cuando se reinicia el ejecutable desde un puesto de control'. En cuanto a los registros de los segfaults todo se producen inmediatamente después de un reinicio. Todos los fracasos parecen ocurrir cuando un trabajo cambia de un tipo de máquina a otro tipo.

ACTUALIZACIÓN 3

La violación de segmento era causado por las diferencias entre los ejércitos, estableciendo el campo '' requiremets en el condor Enviar archivo a un problema desaparecido por completo.

Se puede configurar máquinas individuales:

requirements = machine == "hostname1" || machine == "hostname2"

o toda una clase de máquinas:

requirements = classOfMachinesName

Consulte los requisitos ejemplo aquí

¿Fue útil?

Solución

si se puede, compilar con la depuración, y colocar bajo el BGF. alternativamente, conseguir núcleo objeto de dumping y carga que en el depurador.

mpich ha depurador integrado, o puede comprar depurador paralelo comercial.

A continuación, se puede recorrer el código para ver lo que sucede en depurador

http://nmi.cs.wisc.edu/node/1610

http://nmi.cs.wisc.edu/node/1611

Otros consejos

¿Se puede crear un volcado de memoria cuando su violación de segmento que pasa? A continuación, puede depurar este vertedero para tratar de averiguar el estado del código cuando se estrelló.

Mira lo que provocó el fallo de instrucciones. Fue incluso una instrucción válida o está tratando de ejecutar datos? Si es válido, lo que la memoria es que intenta acceder? ¿De dónde vino este puntero viene. Es necesario para delimitar la ubicación de la falla (daños en la pila, daños en el montón, puntero no inicializado, el acceso a memoria no válida). Si se trata de una corrupción, ver si si hay cualquier dato reveladores de la zona dañada (punteros a los símbolos, los datos que se parece a algo en sus estructuras, ...). Su asignador de memoria puede que ya han construido en las características de depurar alguna corrupción (ver MALLOC_CHECK_ en Linux o en Mac OS MallocGuardEdges). Un caso común de estos es el uso de memoria que haya sido libre () 'd, por lo que el registro de su malloc () / free () podrían ayudar a pares.

Si ha utilizado la herramienta condor_compile volver a vincular el código con el código condor puntos de control, que hace algunas cosas de manera diferente que un enlace normal. Lo más importante es que vincula estáticamente el código, y los usos que la propia malloc. Otra gran diferencia es que condor entonces ejecutarlo en una máquina extranjera, en el que el medio ambiente puede ser bastante diferente de lo que espera a causar problemas.

El ejecutable generada por condor_compile es ejecutable como fuera independiente binaria del sistema condor. Si ejecuta el binario emitido desde condor_compile localmente, fuera del cóndor, hacer todavía ve las violaciones de segmento?

Si no es así, se puede correlacionar los segfaults a condor cuando se reinicia el ejecutable desde un puesto de control (el registro de usuario le dirá cuando esto ocurre).

Usted ha intentado la mayor parte de lo que yo pienso. La única otra cosa que me gustaría sugerir es empezar a añadir una gran cantidad de código de registro y espero que pueda reducir en donde está ocurriendo el error.

La única cosa que no dicen es la cantidad de flexibilidad que tiene que resolver el problema. Se puede, por ejemplo, que el sistema se debilite y simplemente ejecutar la aplicación? También lo importante son estos choques para resolver?

Estoy asumiendo que en su mayor parte lo hace. Esto puede requerir una gran cantidad de recursos.

El paso corto plazo es poner toneladas de "afirma" (semi escrita a mano) de cada variable para asegurarse de que no ha cambiado cuando no se desea. Este CContinuar lata de trabajo a medida que avanza el proceso a largo plazo.

Long term-- intente ejecutar en un clúster de dos (quizá su ordenador personal y una máquina virtual). ¿Todavía ve las violaciones de segmento. Si no aumenta el tamaño del clúster hasta que se empiezan a ver estas señales.

ejecutarlo en una configuración mínima (para obtener segfaults) y registrar todas las entradas hasta un accidente. Automatizar el funcionamiento del sistema con las entradas que ha grabado, retocando hasta que pueda conseguir un accidente consistente con una entrada mínima.

En ese momento vistazo alrededor. Si usted todavía no puede encontrar el error, entonces tendrá que pedir de nuevo con algunos datos adicionales que se reunieron con esas carreras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top