Estoy ejecutando una especie de "caja de arena" en C en Ubuntu: toma un programa, y lo ejecuta de forma segura bajo el usuario nobody
(e intercepta señales, etc.). Además, asigna límites de memoria y tiempo, y mide el uso de tiempo y memoria.
(En caso de que usted es curioso, es por una especie de "juez de línea" para marcar los programas en los datos de prueba)¿Uso de memoria de un proceso hijo?
Actualmente me he adaptado el módulo safeexec de mooshak. Aunque la mayoría de las cosas funcionan correctamente, el uso de la memoria parece ser un problema. (Es muy impreciso)
Ahora he intentado el consejo here y analicé VM desde /proc/pid/stat
, y ahora el problema de precisión está solucionado. Sin embargo, para los programas que terminan muy rápido que no funciona y simplemente devuelve 0.
El programa safeexecparece que funciona de esta manera:
- Se
fork()
s - Usos
execv()
en el proceso hijo para ejecutar el programa deseado - Supervisa el programa desde el proceso principal hasta que finaliza el proceso secundario (usando
wait4
, que devuelve el uso de la CPU, pero no la memoria?)
Por lo tanto, un análisis sintáctico/proc/../stat
del proceso hijo (que ha sido sustituido por el execv)
¿Por qué es VM en /proc/child_pid/stat
veces igual a 0?
¿Es porque el execv() finaliza demasiado rápido, y /proc/child_pid/stat
simplemente no está disponible?
Si es así, ¿hay algún otro modo de obtener el uso de memoria del niño?
(Dado que esto está destinado a juzgar los programas en un límite de tiempo, no puedo pagar algo con una penalización de rendimiento como valgrind)
Gracias de antemano.
Hmm, suena interesante. ¿Alguna forma de rastrear las matrices estáticas/automáticas? –
Wow, ptrace es realmente limpio. ¡Gracias! (Dado que ptrace hace que el proceso hijo se detenga cuando es execv() s, puedo medir el uso de la memoria tal como comienza) –