Bisakah seseorang mengambil aplikasi yang sedang berjalan dari terminal?

26

Kadang saya perlu menjalankan aplikasi dari terminal untuk debugging. Jika saya yakin bug akan muncul sesaat setelah meluncurkan aplikasi, saya dapat menjalankan aplikasi ini dari Terminal.

Namun, bug terjadi secara tidak terduga, dan hanya saya yang perlu memonitor aplikasi kereta dari Terminal (untuk melihat hasilnya).

Bisakah saya mengambil aplikasi dari terminal, yang tidak diluncurkan menggunakan Terminal? Kalau begitu bagaimana?

Benjamin
sumber
Saya akhirnya mengambil jawaban Michał Šrajer karena itu adalah yang paling instruktif. Tetapi semua jawaban Anda hanya baik dan dihargai juga. Tepuk tangan.
Benjamin
Pesan kesalahan sebelumnya (ke stderr) ditulis untuk ~/.xsession-errorsjika Anda meluncurkannya melalui GUI.
Lekensteyn

Jawaban:

30

Setiap proses di linux memiliki direktori khusus /proc/{pid}/fd/. 0 adalah stdin, 1 adalah stdout dan 2 adalah stderr. Jadi, dengan asumsi Anda hanya tertarik pada hasil diagnostik Anda dapat menentukan proses pid, dan kemudian di terminal lakukan:

untuk melihat stdout:

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

untuk melihat stderr:

cat /proc/{pid of process}/fd/2
Michał Šrajer
sumber
OK saya agak bingung, ketika saya menjalankannya cat /proc/1840/fd/1sepertinya mengembalikan output dari proses lain daripada yang saya ambil. (1840 saat ini untuk Skype menurut System Monitor) Ini menunjukkan output dari program lain juga ...: |
Benjamin
9

Atau Anda bisa menggunakan straceseperti ini

sudo strace -p $pid_of_the_process
mengatur
sumber
6

Anda dapat melampirkan dengan gdbproses yang sedang berjalan.

Sintaksnya adalah

gdb program pid

Oke, Anda tidak dapat melihat kode sumber, jika informasi debug dilucuti, yang merupakan standar untuk aplikasi yang digunakan. Tetapi Anda mungkin dapat melihat pesan stdout / stderr dan debugger, segfaults.

enzotib
sumber
Saya mencobanya tetapi tidak berhasil. Misalnya Monitor Sistem menunjukkan Cairo-Dock ID adalah 1452, jadi saya menjalankan gdb program 1452(saya juga mencoba gdb 1452), tetapi mengembalikan "1452: Tidak ada file atau direktori."
Benjamin
Yang pertama harus bekerja. Apa yang dikembalikan?
enzotib
Ini adalah apa yang dikembalikan sepenuhnya setelah meminta 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
Saya mengatakan yang pertama, dengan itu gdb program pid. Saya pikir output yang Anda tunjukkan adalah darigdb pid
enzotib
Maaf, kesalahan saya. Program `gdb 3385 (lagi Skype) mengembalikan ini .
Benjamin
5

Anda mungkin mencari retty. Anda juga bisa mencari "pasang tty". Pada dasarnya itu selesai menggunakan ptracesehingga Anda bahkan bisa menggulung sendiri.

nc3b
sumber