2008-09-30 11 views
6

tenemos un problema con una aplicación que estamos desarrollando. Muy rara vez, como una vez en un centenar, la aplicación se bloquea al inicio. Cuando se produce el bloqueo, todo el sistema se ve afectado, la computadora comienza a emitir un pitido y se congela por completo; la única forma de recuperarlo es apagar la alimentación (estamos usando Windows XP). La rareza de la falla combinada con el hecho de que no podemos entrar en el depurador o incluso generar un stackdump cuando ocurre hace que sea extremadamente difícil de depurar.Registrando/monitoreando todas las llamadas de funciones desde una aplicación

Estoy buscando algo que registre todas las llamadas a un archivo. ¿Existe tal herramienta? No debería ser imposible de implementar, los perfiladores como VTune hacen algo muy similar.

Estamos usando Visual Studio 2008 (C++).

Gracias

A.B.

Respuesta

0

GCC (incluyendo la versión MingGW for Windows development) tiene un interruptor de generación de código llamado -finstrument-functions que le dice al compilador para emitir llamadas especiales a las funciones llamadas __cyg_profile_func_enter y __cyg_profile_func_exit en cada llamada a la función. Para Visual C++, hay opciones similares llamadas /GH y /Gh. Esto hace que el compilador emita llamadas a __penter y __pexit alrededor de las llamadas a funciones.

Estos modos de instrumentación se pueden utilizar para implementar un sistema de registro, implementando las llamadas que el compilador genera para enviarlas a su sistema de archivos local oa otra computadora en su red.

Si es posible, también intentaré ejecutar su sistema usando valgrind o una herramienta de comprobación similar. Esto podría detectar su problema antes de que se salga de control.

2

El único problema con la idea de la tala es que cuando el sistema se bloquea, las últimas entradas de registro aún podría estar en el caché y no tienen la oportunidad de escribir en el disco ...

Si fuera yo lo haría intente ejecutar el programa en una PC diferente: podría ser hardware escamoso o controladores que causen el problema. Un programa de aplicación "no debería" ser capaz de derribar el sistema.

2

Algunas ideas-
Existe una buena posibilidad de que justo antes de su bloqueo haya algún tipo de excepción en la aplicación. si configura su controlador para todas las excepciones no controladas utilizando SetUnhandledExceptionFilter() y escribe un seguimiento de pila en su archivo de registro, puede tener la oportunidad de detectar el bloqueo en acción.
Solo recuerde lavar el archivo después de cada escritura.

Otra opción es usar una herramienta como strace que registra todas las llamadas al kernel (existen varios sabores e implementaciones para eso, así que elija su favorito). Si mira el registro justo antes del fallo, puede encontrar al culpable

+0

Gracias por el enlace directo. – Constantin

3

Las entradas/salidas de la función de registro es un enfoque de bajo nivel para su problema. Sugiero usar la instrumentación del depurador automático (usando la clave del depurador en Opciones de ejecución del archivo de imagen con regedit o usando gflags del paquete que proporciono un enlace a continuación) y tratando de reproducir el problema hasta que se cuelgue.Además, puede tener el historial de llamadas de la función de registro del depurador de los módulos sospechosos utilizando una secuencia de comandos o haber recopilado cualquier otra información.
Pero al no conocer los detalles de su aplicación, es muy difícil sugerir una solución. ¿Es una aplicación de usuario, servicio o un controlador? ¿Qué significa "bloqueos al inicio" - al inicio de Windows o al inicio de la aplicación?
Utilice este debugger package para solucionar problemas.

2

¿Ha considerado usar una segunda máquina como un depurador remoto (a través de la red)? Cuando la aplicación (y el sistema) se bloquea, la segunda máquina aún debe mostrar cierta información útil, sino el punto real del problema. Creo que VC++ tiene esa capacidad, al menos en algunas versiones.

Cuestiones relacionadas