GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara membaca, memahami, menganalisis, dan men-debug kepanikan kernel Linux?

Berikut adalah dua alternatif untuk addr2line . Dengan asumsi Anda memiliki toolchain target yang tepat, Anda dapat melakukan salah satu hal berikut:

Gunakan objdump :

  1. cari vmlinux Anda atau .ko file di bawah direktori root kernel, lalu bongkar file objek :

    objdump -dS vmlinux > /tmp/kernel.s
    
  2. Buka file perakitan yang dihasilkan, /tmp/kernel.s . dengan editor teks seperti vim . Buka unwind_backtrace+0x0/0xf8 , yaitu mencari alamat unwind_backtrace + offset . Terakhir, Anda telah menemukan bagian yang bermasalah di kode sumber Anda.

Gunakan gdb :

IMO, opsi yang lebih elegan adalah menggunakan satu-satunya gdb . Dengan asumsi Anda memiliki toolchain yang sesuai di mesin host Anda:

  1. Jalankan gdb <path-to-vmlinux> .
  2. Jalankan di prompt gdb:list *(unwind_backtrace+0x10) .

Untuk informasi tambahan, Anda dapat memeriksa sumber daya berikut:

  1. Trik Debugging Kernel.
  2. Men-debug Kernel Linux Menggunakan Gdb

Di unwind_backtrace+0x0/0xf8 apa itu +0x0/0xf8 singkatan dari?

Angka pertama (+0x0 ) adalah offset dari awal fungsi (unwind_backtrace pada kasus ini). Angka kedua (0xf8 ) adalah panjang total fungsi . Dengan adanya dua informasi ini, jika Anda sudah memiliki firasat tentang di mana kesalahan terjadi, ini mungkin cukup untuk mengonfirmasi kecurigaan Anda (Anda dapat mengetahui (secara kasar) seberapa jauh Anda menjalankan fungsi tersebut).

Untuk mendapatkan baris sumber yang tepat dari instruksi yang sesuai (umumnya lebih baik daripada firasat), gunakan addr2line atau metode lain di jawaban lain.


Ini hanya backtrace biasa, fungsi tersebut dipanggil dalam urutan terbalik (yang pertama dipanggil dipanggil oleh yang sebelumnya dan seterusnya):

unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150

bdi_register+0xec/0x150 adalah simbol + offset/panjang ada informasi lebih lanjut tentang itu di Memahami Kernel Ups dan bagaimana Anda dapat men-debug kernel oops. Juga ada tutorial luar biasa tentang Men-debug Kernel

Catatan:seperti yang disarankan di bawah ini oleh Eugene, Anda mungkin ingin mencoba addr2line terlebih dahulu, masih memerlukan gambar dengan simbol debugging, misalnya

addr2line -e vmlinux_with_debug_info 0019594c(+offset)


Linux
  1. Variabel Lingkungan Linux:Cara Membaca dan Mengatur di VPS Linux

  2. Cara memutakhirkan Kernel di Desktop Linux

  3. Debugging langsung kernel Linux, bagaimana melakukannya dan alat apa yang digunakan?

  1. Bagaimana menangani kepanikan kernel Linux

  2. Linux – Bagaimana Cara Men-debug Masalah Suspend-to-ram Di Linux?

  3. Bagaimana cara men-debug kernel Linux dengan GDB dan QEMU?

  1. Bagaimana cara membuat kode modul kernel Linux?

  2. Bagaimana cara membaca halaman manual Linux?

  3. Bagaimana cara mengkonfigurasi kernel Linux lebih awal untuk mem-boot ulang saat panik?