válida versión valido una sqlserver services schemas reportdesigner reportdefinition que puede posterior nombres microsoft informe haya estructura esta espacio ejemplo definitioninvalidexception definición creado con admite actualizar c++ c segmentation-fault valgrind

c++ - valido - la definición de informe no es válida o no la admite esta versión de reporting services.



Valgrind informa de lectura no válida en un sistema pero no en otro (3)

Necesito ejecutar un paquete de software bastante grande en una máquina nueva para el trabajo. La aplicación está escrita en C y C ++ y estoy ejecutándome en CentOS 6.5.

El programa se compila bien, pero segfaults cuando voy a ejecutarlo. Usando valgrind, veo el siguiente error reportado en la ubicación del segfault:

==23843== Invalid read of size 4 [stack trace here] ==23843== Address 0x642e7464 is not stack''d, malloc''d or (recently) free''d

Entonces, por alguna razón, leemos de memoria que no debemos hacerlo y estamos invocando un comportamiento indefinido. Cuando utilizo mis archivos fuente, los llevo a otra máquina CentOS 6.5 (con el mismo kernel) y los compilo (con los mismos archivos make y la misma versión GCC) el programa parece funcionar bien.

Ejecuté valgrind en esa máquina también y esperé ver que el inválido volviera a leer. Mi idea era que la lectura no válida siempre estaría presente, sin embargo, debido a que el comportamiento no está definido, las cosas funcionaron correctamente en una máquina y no en la otra.

Lo que encontré, sin embargo, fue que valgrind informa que no hay errores de lectura en la segunda máquina. ¿Cómo puede ser esto posible?


Esto podría deberse al uso de diferentes versiones de Valgrind.

Algunos errores falsos positivos comunes se eliminan en las versiones más recientes. Lo que explicaría por qué una máquina se queja de ello (versión anterior) y otra no (versión más nueva).


Las diferentes versiones de la biblioteca son la mejor suposición, a juzgar por la escasa información que proporcionó. Cosas para intentar:

1) Actualice ambas máquinas a través del administrador de paquetes y vuelva a intentarlo

2) Ejecute ldd [binary] para ver todas las bibliotecas utilizadas por el programa en cuestión. Ejecute algo como md5sum en ellos en ambas máquinas para averiguar si hay diferencias.

En general, hice la experiencia de que valgrind es realmente malo para detectar el acceso a la memoria no válida en la pila, por lo que esta podría ser una causa oculta. Si todo lo demás falla, es posible que desee intentar usar clang y tratamiento sanitizer. Puede encontrar cosas valgrind no atrapa, y viceversa.


Valgrind hace que el entorno de ejecución sea más determinista, pero no elimina toda la aleatoriedad. Tal vez la otra máquina tiene bit versiones diferentes de bibliotecas instaladas, o cualquier cosa externa que esté usando (archivos, red ...) es diferente, la ejecución del código no tiene que ser exactamente la misma.

Debería mirar la traza de pila y analizar el código donde ocurre el error. Si no es obvio desde el trazado de la pila solo, puede iniciar valgrind con --vgdb=full parámetro --vgdb=full . Pausará la ejecución una vez que ocurra el error e imprimirá instrucciones sobre cómo adjuntar gdb . O simplemente puede ejecutar el programa bajo depurador directamente; usted escribió que se bloquea incluso sin valgrind.