Recientemente, estaba hablando de strace con alguien, y me preguntaban qué sucedería si rastreara un proceso en ejecución justo cuando estaba creando un socket de red o algo similar. ¿Podría esto causar que el programa se bloquee de forma inesperada?
Por lo que he leído sobre ptrace, la llamada al sistema utilizada por strace, no debería poder causar algo así si solo está depurando un hilo. El proceso se detiene cada vez que se llama a una llamada al sistema, pero debería reanudarse más tarde y no darse cuenta. Las señales se ponen en cola mientras no se está ejecutando, así que asumo que sucede algo similar con syscalls/sockets/listen.
¿Puede ptrace usado en el contexto de strace causar fallas extrañas en el proceso?
Respuesta aceptada:
No , strace
no debería causar un bloqueo del programa –
Excepto en este caso algo inusual:
Si tiene un error que depende del tiempo de ejecución o ubicaciones de memoria en tiempo de ejecución .
Puede desencadenar este tipo de “heisenbug ” – pero muy raramente, porque este tipo de error es raro y solo necesita activarse bajo strace u otra instrumentación.
Y cuando encuentra un heisenbug, a menudo es algo bueno.
Con respecto a ptrace()
– la llamada al sistema – eso es justo lo que strace
hace dentro, creo, por lo que es similar. Uno puede hacer algo más que strace
puede cuando se usa ptrace()
directamente.
Su ejemplo sería solo este tipo de error:
En el ejemplo, strace
cambiaría el tiempo de los pasos para crear una conexión de red. Si eso causa un problema, era un "problema esperando a suceder":el tiempo de ejecución cambia constantemente. Con strace
, sólo un poco más. Pero cualquier otra aplicación podría haber cambiado más el tiempo, como iniciar un programa.