Tengo un archivo de volcado de núcleo de un proceso que probablemente tiene una fuga de descriptor de archivo (abre archivos y tomas de corriente, pero al parecer a veces se olvida de cerrar algunas de ellas). ¿Hay alguna forma de averiguar qué archivos y conectores se abrió antes de colapsar el proceso? No puedo reproducir fácilmente el bloqueo, por lo que analizar el archivo central parece ser la única forma de obtener una pista sobre el error.archivos de volcado del núcleo en Linux: ¿cómo obtener información sobre los archivos abiertos?
Respuesta
Un volcado del núcleo es una copia de la memoria a la que el proceso tuvo acceso cuando se estrelló. Dependiendo de cómo se está produciendo la fuga, puede haber perdido la referencia a las asas, por lo que puede resultar inútil.
lsof enumera todos los archivos actualmente abiertos en el sistema, puede verificar su salida para encontrar los sockets o archivos filtrados. Sí, necesitarías tener el proceso en ejecución. Puede ejecutarlo con un nombre de usuario específico para discernir fácilmente cuáles son los archivos abiertos del proceso que está depurando.
espero que alguien tiene una mejor información :-)
Usted puede intentar usar strace
para ver la open
, socket
y close
llama al programa hace.
Editar: No creo que pueda obtener la información desde el núcleo; a lo sumo tendrá los descriptores de archivos en alguna parte, pero esto aún no le da el archivo/socket real. (Suponiendo que pueda distinguir los descriptores de archivos abiertos y cerrados, lo cual también dudo).
Otra forma de averiguar qué archivos ha abierto un proceso, de nuevo, solo durante el tiempo de ejecución, es buscar en/proc/PID/fd /, que contiene enlaces simbólicos para abrir archivos.
Si el programa se olvidó de cerrar esos recursos puede ser debido a algo como lo siguiente: pasó
fd = open("/tmp/foo",O_CREAT);
//do stuff
fd = open("/tmp/bar",O_CREAT); //Oops, forgot to close(fd)
ahora no voy a tener el descriptor de fichero para foo en la memoria.
Si esto no sucedió, es posible que pueda encontrar el número de descriptor de archivo, pero una vez más, eso no es muy útil porque están cambiando continuamente, para cuando se depure no sabrá qué archivo que realmente significaba en ese momento.
Realmente creo que deberías depurar este en vivo, con strace, lsof y amigos.
Si hay una manera de hacerlo desde el volcado de memoria, estoy ansioso por saberlo también :-)
Su mejor opción es instalar un manejador de señales por cualquier señal está chocando su programa (SIGSEGV , etc.)
Luego, en el controlador de señal, inspeccione/proc/self/fd, y guarde los contenidos en un archivo. Este es un ejemplo de lo que puede llegar:
Anderson cxC# ls -l /proc/8247/fd
total 0
lrwx------ 1 root root 64 Sep 12 06:05 0 -> /dev/pts/0
lrwx------ 1 root root 64 Sep 12 06:05 1 -> /dev/pts/0
lrwx------ 1 root root 64 Sep 12 06:05 10 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Sep 12 06:05 11 -> socket:[124061]
lrwx------ 1 root root 64 Sep 12 06:05 12 -> socket:[124063]
lrwx------ 1 root root 64 Sep 12 06:05 13 -> socket:[124064]
lrwx------ 1 root root 64 Sep 12 06:05 14 -> /dev/driver0
lr-x------ 1 root root 64 Sep 12 06:05 16 -> /temp/app/whatever.tar.gz
lr-x------ 1 root root 64 Sep 12 06:05 17 -> /dev/urandom
Luego, puede volver a su manejador de la señal, y usted debe obtener un volcado de memoria, como de costumbre.
Si usted tiene un archivo de núcleo y que ha compilado el programa con debuging opciones (-g), se puede ver donde se descargó el núcleo:
$ gcc -g -o something something.c
$ ./something
Segmentation fault (core dumped)
$ gdb something core
Usted puede usar esto para hacer algunos post mortem depuración Algunos comandos de gdb: br imprime la pila, fr salta al marco de pila dado (vea la salida de br).
Ahora, si desea ver qué archivos se abren en un error de segmentación, simplemente maneje la señal SIGSEGV, y en el controlador, simplemente voltee el contenido del directorio/proc/PID/fd (es decir, con el sistema ('ls -l/proc/PID/fs ') o execv).
Con estas informaciones a mano puede encontrar fácilmente qué causó el bloqueo, qué archivos se abren y si el fallo y la fuga del descriptor de archivo están conectados.
Esto realmente no responde a la pregunta, que se trata de usar un archivo central para descubrir archivos abiertos, sin agregar resultados de depuración a un programa existente. Oliver no puede reproducir el problema de todos modos. – craig65535
Una de las formas en que paso a esta información es simplemente ejecutando strings
en el archivo central. Por ejemplo, cuando estaba ejecutando un archivo en un núcleo recientemente, debido a la longitud de las carpetas obtendría una lista de argumentos truncados. Yo sabía que mi carrera habría abierto los archivos del directorio de mi casa, así que acaba de ejecutar:
strings core.14930|grep jodie
pero este es un caso en el que tenía una aguja y un pajar.
Recientemente durante mi solución de problemas y análisis de errores, mi cliente me proporcionó un volcado de núcleo que consiguió genera en su sistema de archivos, el cual salió de la estación con el fin de explorar rápidamente a través del archivo y leer su contenido i utiliza el comando
cadenas core.67545> coredump.txt y más tarde pude abrir el archivo en el editor de archivos.
- 1. Volcado del núcleo en Linux
- 2. ¿Cómo obtener información sobre el sistema de archivos del disco?
- 3. En Linux: configure los archivos máximos abiertos en ilimitados. ¿Posible?
- 4. Identificar los archivos abiertos de un proceso particular en Linux
- 5. IOException: Demasiados archivos abiertos
- 6. ¿Por qué se generan archivos de volcado de núcleo?
- 7. Listar todos los archivos abiertos
- 8. ¿Cómo cambio el límite de archivos abiertos en Linux?
- 9. Generar volcado del núcleo en Android
- 10. obteniendo stacktrace del volcado del núcleo
- 11. ¿Cómo obtener la línea actual de archivos abiertos en python?
- 12. ¿Cómo puedo obtener meta información de archivos en Perl?
- 13. Cierre todos los archivos abiertos en ipython
- 14. ¿Dónde se almacenan los archivos de volcado de núcleo en el iPhone?
- 15. Cómo analizar el volcado del núcleo
- 16. Análisis de volcado del núcleo utilizando gdb
- 17. Cómo causar un volcado del núcleo en C/C++
- 18. JQuery - Arrastrar y soltar archivos - ¿Cómo obtener información del archivo?
- 19. Demasiados archivos abiertos en python
- 20. Volcado de núcleo mínimo (seguimiento de pila + marco actual solamente)
- 21. java.net.SocketException: Demasiados archivos abiertos
- 22. Error "Demasiados archivos abiertos" en pdflatex
- 23. ¿Tiene ActionScript un equivalente a un "volcado del núcleo"?
- 24. Demasiados manejadores de archivos abiertos
- 25. Cerrar archivos abiertos usando C#
- 26. ¿Cómo buscar todos los archivos abiertos en Eclipse?
- 27. ¿cómo obtener una lista de todos los archivos abiertos en el editor de eclipse?
- 28. Solicitar el volcado del he va en java (volcado del núcleo) desde la aplicación
- 29. Cómo habilitar el volcado del núcleo en mi programa C++ de Linux
- 30. Cómo generar el archivo de volcado del núcleo en Ubuntu
¡Es cierto! Me había olvidado de eso. –