¿Se puede recoger una aplicación en ejecución desde la terminal?

26

En algún momento necesito ejecutar una aplicación desde la terminal para la depuración. Si estoy seguro de que el error ocurrirá poco después de iniciar la aplicación, puedo ejecutar esta aplicación desde la Terminal.

Sin embargo, los errores ocurren inesperadamente, y solo necesito monitorear la aplicación con errores desde la Terminal (para ver su salida).

¿Puedo entonces recoger una aplicación desde la terminal, que no se inició usando Terminal? ¿Si es así, cómo?

Benjamín
fuente
Eventualmente recogí la respuesta de Michał Šrajer porque fue la más instructiva. Pero todas sus respuestas fueron buenas y apreciadas también. Aclamaciones.
Benjamin
Los mensajes de error anteriores (a stderr) se escriben ~/.xsession-errorssi lo inició a través de GUI.
Lekensteyn

Respuestas:

30

Cada proceso en Linux tiene un directorio especial /proc/{pid}/fd/. 0 es stdin, 1 es stdout y 2 es stderr. Entonces, suponiendo que solo esté interesado en la salida de diagnóstico, puede determinar el proceso pid, y luego en el terminal hacer:

para ver stdout:

cat /proc/{pid of process}/fd/1

para ver stderr:

cat /proc/{pid of process}/fd/2
Michał Šrajer
fuente
OK, estoy un poco confundido, cuando ejecuto cat /proc/1840/fd/1parece que devuelve resultados de otros procesos que el que recogí. (1840 es actualmente para Skype según System Monitor) Muestra también la salida de otros programas ...: |
Benjamin
9

O puedes usar straceasí

sudo strace -p $pid_of_the_process
organizar
fuente
6

Puede adjuntarlo gdba un proceso en ejecución.

La sintaxis es

gdb program pid

Ok, no puede ver el código fuente si la información de depuración se elimina, que es el valor predeterminado para las aplicaciones implementadas. Pero probablemente pueda ver mensajes stdout / stderr y depuradores, segfaults.

enzotib
fuente
Lo intenté pero no funcionó. Por ejemplo, System Monitor muestra que Cairo-Dock ID es 1452, por lo que ejecuto gdb program 1452(también lo intenté gdb 1452), pero devuelve "1452: No existe tal archivo o directorio".
Benjamin
El primero debería funcionar. ¿Qué devolvió?
enzotib
Esto es lo que devuelve completamente después de pedir pid 1840 (Skype):GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... 1840: No such file or directory.
Benjamin
Dije el primero, que con gdb program pid. Creo que la salida que gdb pid
mostraste
Perdón mi error. `El programa gdb 3385 (nuevamente Skype) devuelve esto .
Benjamin
5

Es probable que estés buscando retty. También puede buscar "adjuntar tty". Básicamente se hace usando ptracepara que puedas incluso rodar el tuyo

nc3b
fuente