Dapatkah saya menggunakan GDB untuk men-debug proses yang sedang berjalan?

110

Di bawah linux, dapatkah saya menggunakan GDB untuk men-debug proses yang sedang berjalan?

Justin Ethier
sumber

Jawaban:

88

Iya. Gunakan attachperintah. Lihat tautan ini untuk informasi lebih lanjut. Mengetik help attachdi konsol GDB memberikan yang berikut:

(gdb) help attach

Lampirkan ke proses atau file di luar GDB. Perintah ini menempel pada target lain, dengan jenis yang sama seperti targetperintah " " terakhir Anda (" info files" akan menampilkan tumpukan target Anda). Perintah tersebut dapat mengambil argumen id proses, nama proses (dengan id proses opsional sebagai sufiks), atau file perangkat. Untuk id proses, Anda harus memiliki izin untuk mengirim sinyal ke proses, dan itu harus memiliki uid efektif yang sama seperti debugger. Saat menggunakan " attach" ke proses yang ada, debugger menemukan program yang sedang berjalan dalam proses tersebut, mencari pertama di direktori kerja saat ini, atau (jika tidak ditemukan di sana) menggunakan jalur pencarian file sumber (lihat perintah " directory"). Anda juga dapat menggunakan perintah " file" untuk menentukan program, dan memuat tabel simbolnya.


CATATAN: Anda mungkin mengalami kesulitan untuk melampirkan ke proses karena peningkatan keamanan di kernel Linux - misalnya melampirkan turunan satu shell dari yang lain.

Anda mungkin harus mengaturnya /proc/sys/kernel/yama/ptrace_scopetergantung pada kebutuhan Anda. Banyak sistem sekarang default 1atau lebih tinggi.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
Carl Norum
sumber
8
Tautannya rusak :( Dari sudut pandang saya, saya suka jawaban seperti yang ini dari J. Polfer . Cheers;)
olibre
Saya telah memperbaiki tautannya.
Attie
apakah ini juga bekerja untuk pid dari proses pada target jarak jauh?
Bionix1441
Anda harus menjalankan server debug pada target jarak jauh; setelah itu harus sama.
Carl Norum
Bendera dapat diubah menggunakan echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki
108

Anda dapat melampirkan ke proses yang sedang berjalan dengan gdb -p PID.

Nikolai Fetissov
sumber
24

Iya. Anda dapat melakukan:

gdb program_name program_pid

Pintasannya adalah (dengan asumsi hanya satu contoh yang berjalan):

gdb program_name `pidof program_name`
J. Polfer
sumber
Saya tidak tahu apa fungsinya tetapi itu pasti tidak berhasil untuk saya. Dikatakan bahwa <program_pid> tidak ada.
Burung Hantu
2
Saya menemukan bahwa ini bekerja paling baik karena memuat tabel simbol selain melampirkan ke proses. Perlu dicatat bahwa ini program_nameberfungsi jika Anda berada di direktori yang sama dengan biner. Saya pikir jalur ke biner akan berfungsi jika Anda berada di direktori yang berbeda.
KarateSnowMachine
Apakah Anda tidak lupa -pdi depan program_id? Juga, mungkin perlu menjalankan gdb dengan sudo untuk melampirkan ke proses yang sedang berjalan.
mxmlnkn
15

Perintah yang akan digunakan adalah di gdb attach pidmana pid adalah id proses dari proses yang ingin Anda lampirkan.

David Kanarek
sumber
3

Ya kamu bisa. Asumsikan proses foosedang berjalan ...

ps -elf | grep foo

cari nomor PID

gdb -a {nomor PID}
t0mm13b
sumber
5
Distribusi apa yang Anda jalankan? Menggunakan versi terbaru Fedora, 'gdb -a' menampilkan kesalahan "opsi -a ambigu".
Justin Ethier
1
argumen resminya adalah -p / - pid
Mahmoud Al-Qudsi
3

Jika ingin melampirkan proses, proses ini harus dimiliki oleh pemilik yang sama. Akar dapat melampirkan ke proses apa pun.

Milan Kerslager
sumber
2

ps -elf sepertinya tidak menampilkan PID. Saya sarankan menggunakan sebagai gantinya:

ps -ld | grep foo
gdb -p PID
Nino Pereira
sumber
2

Cara termudah adalah dengan memberikan id proses .

gdb -p `pidof your_running_program_name`

Silakan dapatkan daftar lengkap opsi dalam man gdbperintah.

Jika ada beberapa proses untuk program yang sama yang sedang berjalan, maka perintah berikut akan mencantumkan prosesnya.

ps -C program -o pid h
<number>

Kemudian proses keluaran id (angka) dapat digunakan sebagai argumen ke gdb.

gdb -p <process id>
shuva
sumber