Saya tahu tentang strace dan ltrace, tapi itu hanya memberi tahu saya apa panggilan sistem dan pustaka panggilan proses yang dieksekusi, masing-masing. Saya ingin tahu persis apa yang sedang dieksekusi oleh suatu proses. Entah perakitan, atau semacam jalan tengah antara C dan perakitan jika itu mungkin. Dengan asumsi biner belum dikompilasi dengan simbol debug, jadi condong ke opsi pertama lebih mungkin.
Use case: proses tampaknya digantung, tidak ada output dari strace atau ltrace. Tentukan apakah proses melakukan "sesuatu". Saya menyadari ini mungkin sulit untuk ditentukan, karena saya membayangkan ini analog dengan memecahkan masalah yang terputus-putus. Namun, dimungkinkan untuk mengumpulkan data yang bermanfaat.
Kasus penggunaan kedua: rasa ingin tahu. Akan menarik untuk membuang seluruh daftar instruksi perakitan ke daftar teks.
Dugaan saya adalah bahwa saya dapat menggunakan gdb untuk melakukan ini, tetapi tidak yakin bagaimana, karena ini kurang tentang debugging program yang saya tulis dan lebih lanjut tentang menggunakan gdb untuk memeriksa kesehatan proses yang sedang berjalan.
OS adalah CentOS 6.
gdb
atauddd
. Bahkan dalam perakitan, dan tanpa simbol debug.Jawaban:
Anda dapat melakukan ini dengan
gdb
: perintahni
dansi
menjalankan satu instruksi pada satu waktu. Perintahn
menjalankan baris kode berikutnya, untuk sebagian besar nilai "selanjutnya". Untukn
(dan yang sesuais
) Anda harus mengkompilasi sehingga simbol debugging muncul di executable.Jawaban stackoverflow ini memberikan beberapa metode untuk melakukan ini lebih atau kurang secara visual.
The
gdb
perintah:display/i $pc
menunjukkan Anda instruksi sebelum dijalankan.display $pc
perlihatkan baris kode sebelumn
ataus
jalankan.sumber
gdb -p <pid>
untuk melampirkan ke proses.Jalankan
ps -l
pada ID proses dan periksa kolomS
("negara"). Jika statusnya adalahR
, maka proses Anda mengeksekusi kode. Jika proses tetap dalam keadaanR
danstrace
tidak menunjukkan itu mengeksekusi panggilan sistem apa pun, maka proses tersebut terperangkap dalam perhitungan yang sangat panjang, mungkin tak terbatas. Jika proses ini dan masih dalam keadaanD
, maka itu diblokir dalam panggilan sistem. Untuk informasi lebih lanjut tentang status proses, lihat Apa yang ditunjukkan oleh proses ini STAT? , Apa yang ditunjukkan oleh kondisi "tidur interupsi"? dan Bagaimana jika 'kill -9' tidak berfungsi? .Jika proses menjalankan perhitungan yang panjang, Anda dapat menggunakan Gdb (atau debugger lain) untuk melihat apa yang dilakukannya. Jika executable tidak memiliki informasi debug (yang biasanya terjadi jika Anda tidak mengkompilasi program terutama untuk itu), maka debugger hanya akan dapat menunjukkan kepada Anda instruksi mesin; jika executable berisi informasi debug, Anda akan dapat melihat nama-nama fungsi dalam tumpukan jejak dan sebagainya. Untuk melampirkan Gdb ke proses, jalankan di
gdb /path/to/executable 1234
mana1234
ID proses. Perintah inis
memungkinkan Anda menjalankan instruksi satu per satu. Kecuali jika Anda seorang programmer dan agak terbiasa dengan apa yang seharusnya dilakukan oleh program tersebut, ada sedikit kemungkinan bahwa Anda akan mendapatkan informasi yang berguna dari Gdb dalam skenario ini.sumber