Pregunta

Me enfrento a un problema grave con mi programa, que se reproduce sólo en el lugar del cliente.Poner registros no ayuda, ya que dudo que la falla esté ocurriendo en un dll de terceros.Por alguna razón, no pude obtener ayuda del proveedor de la biblioteca.Estoy pensando en producir un volcado en el punto de falla, para poder analizarlo fuera de línea.¿Es esta una práctica recomendada?¿O alguna alternativa?

¿Fue útil?

Solución

Sí, esto es algo que todo programa debería tener y utilizar con la mayor frecuencia posible.

Le sugiero que no utilice bibliotecas de terceros.En su lugar, cree sus propios volcados.Es muy simple y directo.Básicamente necesitas hacer lo siguiente:

Su programa necesita acceder dbghelp.dll.Es una DLL de Windows que le permite crear pilas de llamadas legibles por humanos, etc.El depurador usa este dll para mostrar datos en su proceso.También se encarga de la depuración post mortem, es decir.vertederos de algún tipo.Este dll se puede distribuir de forma segura con su software.Le sugiero que descargue e instale Herramientas de depuración para Windows.Esto le dará acceso a todo tipo de herramientas y a la mejor herramienta. WinDbg.exe y el último dbghelp.dll también se encuentra en esa distribución.

En dbghelp.dll llamas, por ejemplo. MiniDumpWriteDump(), que creará el archivo de volcado y eso es más o menos todo.Ya terminaste.En cuanto tengas ese archivo en tus manos, podrás empezar a utilizarlo.Ya sea en Visual Studio Debugger, que probablemente incluso podría estar asociado con la extensión de archivo .dmp, o en WinDbg.

Ahora, hay algunas cosas en las que pensar mientras lo hace.Al verificar archivos de volcado como este, necesita generar archivos .pdb cuando compila y vincula su ejecutable.De lo contrario, no hay posibilidad de asignar los datos del volcado a datos legibles por humanos, p.para obtener buenas pilas de llamadas y valores de variables, etc.Esto también significa que debes guardar estos archivos .pdb.Debe poder compararlos exactamente con esa misma versión.Dado que los archivos de volcado tienen la misma fecha del ejecutable, el depurador necesita los archivos pdb exactos.No importa si tu código no ha cambiado ni un bit, si los archivos .pdb pertenecen a otra sesión de compilación, estás acabado.

Animo a todos los desarrolladores de Windows Win32 a que visiten el sitio de Oleg Starodumov. DebugInfo.com.Contiene muchos ejemplos y tutoriales y explica cómo configurar y ajustar la generación de archivos de volcado.Por supuesto, hay innumerables formas de excluir ciertos datos, crear su mensaje de depuración personalizado para adjuntarlo al volcado, etc.

Tenga en cuenta que los minivolcados contendrán información muy limitada sobre el estado de la aplicación en el momento de la excepción.La compensación es un archivo pequeño (alrededor de 50-100 kB dependiendo de su configuración).Pero si quieres, puedes crear un lleno dump, que contendrá el estado de toda la aplicación, es decir.globales e incluso objetos del kernel.Estos archivos pueden ser ENORMES y sólo deben usarse en casos extremos.

Si hay aspectos legales, simplemente asegúrese de que sus clientes estén al tanto de lo que está haciendo.Apuesto a que ya tienes algún contrato en el que se supone que no debes revelar secretos comerciales u otros aspectos legales.Si los clientes se quejan, convéncelos de lo importante que es encontrar errores y de que esto mejorará drásticamente la calidad del software.Más o menos mayor calidad a costa de nada.Si no les cuesta nada, ese también es un buen argumento :)

Finalmente, aquí hay otro gran sitio si desea leer más sobre el análisis de volcados de memoria: dumpanalysis.org

Espero que esto ayude.Por favor comenta si quieres que te explique más.

Salud !

Editar:

Solo queria agregar eso MiniDumpWriteDump() requiere que tenga un puntero a una estructura MINIDUMP-EXCEPTION-INFORMATION (con guiones bajos).Pero el Obtener información de excepción () La macro le proporciona esto en el momento de la excepción en su controlador de excepciones (manejo de excepciones estructurado o SEH):

__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}

YourHandlerFunction() será quien se encargue de generar el minivolcado (o alguna otra función en la cadena de llamadas).Además, si tiene errores personalizados en su programa, p.sucede algo que no debería suceder pero técnicamente no es una excepción, puedes usar Levantar excepción() para crear el tuyo propio.

Obtener información de excepción () sólo se puede utilizar en este contexto y en ningún otro lugar durante la ejecución del programa.

Otros consejos

volcados son un método de resolución de problemas bastante comunes y pueden ser muy eficaces, especialmente para los problemas que sólo se reproducen en el sitio del cliente.

Sólo asegúrese de que el cliente / cliente entiende lo que está haciendo y que tiene permiso. Es posible que un volcado de bloqueo puede tener información sensible que un cliente puede no querer (o sea permitido) para dejar salir por la puerta o sobre el alambre.

Mejor que eso hay bibliotecas que cargar realiza una copia de los datos de accidentes.

BugDump y BugSplat

Y no es la manera de Microsoft:

http://msdn.microsoft.com/en-us/library /aa936273.aspx

Renuncia: No soy abogado, ni pretendo ser uno, esto no es un consejo legal

.

Los datos se pueden incluir en los registros y archivos de volcado también dependen de qué dominio está trabajando. Por ejemplo, equipos médicos y sistemas de información para el paciente a menudo contienen datos sensibles sobre los pacientes que no deben ser visibles a personas no autorizadas.

  

regula la Regla de Privacidad HIPAA   el uso y la divulgación de cierta   información en poder de las "entidades cubiertas"   (...) Se establece regulaciones para   el uso y divulgación de Protegida   Información de Salud (PHI). PHI es cualquier   información en poder de una entidad cubierta   que se refiere el estado de salud,   prestación de asistencia sanitaria, o el pago   para el cuidado de la salud que puede estar vinculado a   un individuo. [10] Esto se interpreta   más bien en términos generales e incluye cualquier parte   de la historia clínica de un individuo o   historial de pagos. - Wikipedia

No debería ser posible vincular información de salud a un individuo. El volcado de sucesos y los registros debe ser anónima y despojado de cualquier información sensible, o no se envía a todos.

Tal vez esto no se aplica a su caso específico, por lo que esto es más de una nota general. Creo que se aplica a otros dominios que manejan información sensible, como militar y financiera, y así sucesivamente.

Básicamente, la forma más fácil de producir un archivo de volcado es mediante el uso de adplus. No es necesario cambiar el código.

Adplus es parte de las herramientas de depuración para Windows, como se menciona en el artículo anterior. Adplus es básicamente una enorme automatización de VBScript de windbg.

Lo que hay que hacer para utilizar adplus:

  1. Permite descargar e instalar las herramientas de depuración para Windows en C: \ depuradores
  2. iniciar la aplicación
  3. Abra una línea de comandos y vaya a C: \ depuradores
  4. ejecutar esta línea "adplus -crash your_exe.exe"
  5. reproducir el accidente

obtendrá un minidump con toda la información que necesita. puede abrir el volcado de bloqueo en su depurador favorito. dentro windbg, el comando "analizar -v" me ayudó en al menos el 40% de todos los accidentes que sólo ocurrió en el sitio del cliente y no eran reproducibles en casa.

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