2012-05-01 14 views
7

Quiero grabar operaciones de sincronización, como bloqueos, sempahores, barreras de una aplicación multiproceso, para poder reproducir la aplicación grabada más adelante, con el fin de depurar.¿Cómo puedo reproducir una aplicación multiproceso?

En camino es para proporcionar su propio bloqueo, sempaphore, variables de condición, etc. funciones que también hacen el registro, pero creo que es una exageración, porque abajo deben estar utilizando algunas operaciones de sincronización comunes.

Así que mi pregunta es qué operaciones de sincronización debo registrar para que requiera modificaciones mínimas en mi programa. En otras palabras, ¿cuáles son las funciones o macros en glibc y las llamadas al sistema sobre las cuales se crean todas estas operaciones de sincronización? Para que solo los modifique para el registro y la reproducción.

+0

¿Cómo la grabación de todas las operaciones de sincronización le permitirá "reproducir la aplicación grabada"? Hay mucho más en un programa que el orden de las operaciones de sincronización, especialmente si hay condiciones de carrera debido a la falta de sincronización (que es también el tipo de problema por el que imagino que desearía tener ayuda para la depuración). –

+0

Por el momento, olvídate de las condiciones de carrera. Sé que también son importantes. – pythonic

+0

['strace (1)'] (http://linux.die.net/man/1/strace) podría ser útil, pero no detectará las operaciones de sincronización que ocurren completamente en el espacio de usuario sin hacer la transición al kernel, tales como bloqueos mutex no impugnados –

Respuesta

1

Lo mejor que puedo pensar es la depuración con GDB en el modo 'record':

De acuerdo a esta página: GDB Process Record soporte de hilos está en marcha, pero podría no ser completa todavía.


responder Menos estrictamente su pregunta, puedo sugerir

En otras plataformas, existen varias otras damas de roscado, pero no tienen mucho experiencia con ellos

1

En su caso, un método efectivo de "registrar" llamadas de sistemas en Linux puede ser utilizar el truco LD_PRELOAD, y anular las llamadas al sistema con sus propias versiones de las llamadas que registrarán el uso de la llamada y luego reenviar a la llamada al sistema real.

Se proporciona un ejemplo más extenso here in Linux Journal.

Como puede ver en estos enlaces, la esencia básica del "truco" es que puede hacer que el sistema cargue su propia biblioteca dinámica antes que cualquier otra biblioteca del sistema, como pthreads, etc., y luego enmascarar las llamadas a esas funciones de la biblioteca colocando sus propias versiones de esas funciones como precendente. A continuación, puede, dentro de su función de over-riding, registrar el uso de la función original, así como pasar los argumentos a la llamada real que está intentando iniciar sesión.

Lo bueno de este método es que capturará casi cualquier llamada que pueda hacer, una función que permanece completamente en el usuario de la tierra, así como una función que hará una llamada al kernel.

Cuestiones relacionadas