Bagaimana cara menentukan instruksi apa yang sedang dijalankan suatu proses?


8

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.


Saya cukup yakin Anda dapat men-debug proses Anda dalam eksekusi dengan gdbatau ddd. Bahkan dalam perakitan, dan tanpa simbol debug.
Valmiky Arquissandas

Jawaban:


10

Anda dapat melakukan ini dengan gdb: perintah nidan simenjalankan satu instruksi pada satu waktu. Perintah nmenjalankan baris kode berikutnya, untuk sebagian besar nilai "selanjutnya". Untuk n(dan yang sesuai s) Anda harus mengkompilasi sehingga simbol debugging muncul di executable.

Jawaban stackoverflow ini memberikan beberapa metode untuk melakukan ini lebih atau kurang secara visual.

The gdbperintah: display/i $pcmenunjukkan Anda instruksi sebelum dijalankan. display $pcperlihatkan baris kode sebelum natau sjalankan.


Gunakan gdb -p <pid>untuk melampirkan ke proses.
Ángel

6

Jalankan ps -lpada ID proses dan periksa kolom S("negara"). Jika statusnya adalah R, maka proses Anda mengeksekusi kode. Jika proses tetap dalam keadaan Rdan stracetidak 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 keadaan D, 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 1234mana 1234ID proses. Perintah ini smemungkinkan 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.