GNU/Linux >> Belajar Linux >  >> Linux

Debugging Kernel Linux dengan QEMU

Bergantung pada distribusi yang ingin Anda gunakan, ada berbagai cara untuk membuat image sistem file, mis. artikel ini memandu Anda melalui cara yang melelahkan menuju "Linux dari Awal" sistem.

Secara umum , Anda keduanya buat gambar QEMU menggunakan qemu-img , ambil beberapa media instalasi distribusi dan gunakan QEMU dengan media instalasi untuk menyiapkan image (halaman ini menjelaskan proses untuk Debian GNU/Linux) atau gunakan gambar yang disiapkan oleh orang lain.

Bagian dari QEMU Wikibook ini berisi semua informasi yang Anda butuhkan.

Sunting: Seperti yang disarankan oleh jawaban Gilles untuk pertanyaan tertaut, Anda tidak memerlukan sistem file root lengkap untuk pengujian, Anda cukup menggunakan initrd gambar (misalnya, initrd Arch Linux seperti di sini)


Prosedur langkah demi langkah QEMU + GDB diuji pada host Ubuntu 16.10

Untuk memulai dari awal dengan cepat, saya telah membuat contoh QEMU + Buildroot otomatis minimal di:https://github.com/cirosantilli/linux-kernel-module-cheat Langkah-langkah utama dibahas di bawah.

Pertama dapatkan filesystem root rootfs.cpio.gz . Jika Anda membutuhkannya, pertimbangkan:

  • minimal init -only executable image:Distro Linux khusus yang hanya menjalankan satu program, tidak ada yang lain | Unix &Linux Stack Exchange
  • Sistem interaktif Busybox:Apakah implementasi Linux sekecil mungkin? | Unix &Linux Stack Exchange

Kemudian pada kernel Linux:

git checkout v4.9
make mrproper
make x86_64_defconfig
cat <<EOF >.config-fragment
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
                   -initrd rootfs.cpio.gz -S -s

Di terminal lain, misalkan Anda ingin memulai debug dari start_kernel :

gdb \
    -ex "add-auto-load-safe-path $(pwd)" \
    -ex "file vmlinux" \
    -ex 'set arch i386:x86-64:intel' \
    -ex 'target remote localhost:1234' \
    -ex 'break start_kernel' \
    -ex 'continue' \
    -ex 'disconnect' \
    -ex 'set arch i386:x86-64' \
    -ex 'target remote localhost:1234'

dan kita selesai!!

Untuk modul kernel, lihat:Bagaimana cara men-debug modul kernel Linux dengan QEMU? | Stack Overflow

Untuk Ubuntu 14.04, GDB 7.7.1, hbreak dibutuhkan, break breakpoint perangkat lunak diabaikan. Tidak demikian lagi di 16.10. Lihat juga:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

disconnect yang berantakan dan apa yang terjadi setelahnya untuk mengatasi kesalahan:

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000

Utas terkait:

  • https://sourceware.org/bugzilla/show_bug.cgi?id=13984 mungkin bug GDB
  • gdb - Balasan paket 'g' jarak jauh terlalu panjang | Stack Overflow
  • http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org seperti biasa merupakan sumber yang luar biasa untuk masalah ini
  • https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html

Lihat juga:

  • https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging. "dokumentasi" kernel Linux resmi pertama
  • Bagaimana cara men-debug kernel Linux dengan GDB dan QEMU? | Stack Overflow

Batasan yang diketahui:

  • kernel Linux tidak mendukung (dan bahkan tidak dapat dikompilasi tanpa tambalan) dengan -O0 :Bagaimana cara mengoptimalkan kernel Linux dan mengompilasinya dengan -O0? | Stack Overflow
  • GDB 7.11 akan menghabiskan memori Anda pada beberapa jenis penyelesaian tab, bahkan setelah max-completions fix:Interupsi penyelesaian tab untuk binari besar | Stack Overflow Kemungkinan beberapa kotak sudut yang tidak tercakup dalam tambalan itu. Jadi sebuah ulimit -Sv 500000 adalah tindakan bijak sebelum debugging. Meledakkan secara khusus ketika tab saya menyelesaikan file<tab> untuk filename argumen dari sys_execve seperti pada:Bisakah panggilan sistem sys_execve() di kernel Linux menerima jalur absolut atau relatif? | Stack Overflow

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

  2. Men-debug latensi I/O Linux

  3. Mengkompilasi GNU/Linux dengan optimasi -O3

  1. Pelacakan kernel dengan trace-cmd

  2. Bisakah saya membuat Qemu keluar dengan kegagalan pada kepanikan kernel?

  3. Linux Centos dengan stempel waktu dmesg

  1. Instal Linux dengan LVM

  2. Analisis kernel Linux dengan ftrace

  3. Perintah JQ di Linux dengan Contoh