GNU/Linux >> Belajar Linux >  >> Linux

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

Pilihan lainnya adalah menggunakan pengontrol ICE/JTAG, dan GDB. Solusi 'perangkat keras' ini terutama digunakan dengan sistem tersemat,

tetapi misalnya Qemu menawarkan fitur serupa:

  • mulai qemu dengan stub 'remote' gdb yang mendengarkan 'localhost:1234' :qemu -s ... ,

  • kemudian dengan GDB Anda membuka file kernel vmlinux dikompilasi dengan informasi debug (Anda dapat melihat utas milis ini di mana mereka membahas unoptimasi kernel).

  • menghubungkan GDB dan Qemu:target remote localhost:1234

  • lihat live Anda inti:

    (gdb) where
    #0  cpu_v7_do_idle () at arch/arm/mm/proc-v7.S:77
    #1  0xc0029728 in arch_idle () atarm/mach-realview/include/mach/system.h:36
    #2  default_idle () at arm/kernel/process.c:166
    #3  0xc00298a8 in cpu_idle () at arch/arm/kernel/process.c:199
    #4  0xc00089c0 in start_kernel () at init/main.c:713
    

sayangnya, debugging ruang pengguna sejauh ini tidak dimungkinkan dengan GDB (tidak ada informasi daftar tugas, tidak ada pemrograman ulang MMU untuk melihat konteks proses yang berbeda, ...), tetapi jika Anda tetap berada di ruang kernel, itu cukup nyaman.

  • info threads akan memberi Anda daftar dan status CPU yang berbeda

EDIT:

Anda bisa mendapatkan rincian lebih lanjut tentang prosedur dalam PDF ini:

Men-debug sistem Linux menggunakan GDB dan QEMU.


Saat men-debug kernel Linux, kita dapat menggunakan beberapa alat, misalnya, debugger (KDB, KGDB), dumping while crash (LKCD), tracing toolkit (LTT, LTTV, LTTng), instrumen kernel khusus (dprobes, kprobes). Di bagian berikut saya mencoba meringkas sebagian besar dari mereka, semoga ini bisa membantu.

LKCD Alat (Linux Kernel Crash Dump) memungkinkan sistem Linux untuk menulis isi memorinya saat terjadi kerusakan. Log ini dapat dianalisis lebih lanjut untuk akar penyebab crash. Referensi terkait LKCD

  • http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/lkcd.pdf
  • https://www.novell.com/coolsolutions/feature/15284.html
  • https://www.novell.com/support/kb/doc.php?id=3044267

Ups ketika kernel mendeteksi masalah, ia mencetak pesan Ups. Pesan seperti itu dihasilkan oleh pernyataan printk di penangan kesalahan (arch/*/kernel/traps.c). Buffer cincin khusus di kernel yang digunakan oleh pernyataan printk. Oops berisi informasi seperti, CPU tempat terjadinya Oops, isi register CPU, jumlah Oops, deskripsi, stack back trace, dan lain-lain. Sumber daya tentang kernel Ups

  • https://www.kernel.org/doc/Documentation/oops-tracing.txt
  • http://madwifi-project.org/wiki/DevDocs/KernelOops
  • https://wiki.ubuntu.com/DebuggingKernelOops

Probe Dinamis adalah salah satu alat debugging populer untuk Linux yang dikembangkan oleh IBM. Alat ini memungkinkan penempatan "penyelidikan" di hampir semua tempat di sistem, baik di ruang pengguna maupun kernel. Probe terdiri dari beberapa kode (ditulis dalam bahasa khusus yang berorientasi tumpukan) yang dijalankan saat kontrol mencapai titik tertentu. Sumber daya terkait Pemeriksaan Dinamis tercantum di bawah

  • http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/dprobesltt.pdf
  • http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.107.6212&rep=rep1&type=pdf

Linux Trace Toolkit adalah tambalan kernel dan sekumpulan utilitas terkait yang memungkinkan pelacakan peristiwa di kernel. Jejak mencakup informasi waktu dan dapat membuat gambaran yang cukup lengkap tentang apa yang terjadi selama periode waktu tertentu. Resource LTT, LTT Viewer, dan LTT Next Generation

  • http://elinux.org/Linux_Trace_Toolkit
  • http://www.linuxjournal.com/article/3829
  • http://multivax.blogspot.com/2010/11/introduction-to-linux-tracing-toolkit.html

MEMWATCH adalah alat pendeteksi kesalahan memori open source. Ia bekerja dengan mendefinisikan MEMWATCH dalam pernyataan gcc dan dengan menambahkan file header ke kode kita. Melalui ini kita dapat melacak kebocoran memori dan kerusakan memori. Referensi terkait MEMWATCH

  • http://www.linuxjournal.com/article/6059

ftrace adalah kerangka penelusuran yang bagus untuk kernel Linux. ftrace melacak operasi internal kernel. Alat ini termasuk dalam kernel Linux di 2.6.27. Dengan berbagai plugin pelacaknya, ftrace dapat ditargetkan pada titik pelacakan statis yang berbeda, seperti peristiwa penjadwalan, interupsi, I/O yang dipetakan memori, transisi status daya CPU, dan operasi yang terkait dengan sistem file dan virtualisasi. Juga, pelacakan dinamis panggilan fungsi kernel tersedia, secara opsional dapat dibatasi ke subset fungsi dengan menggunakan glob, dan dengan kemungkinan untuk menghasilkan grafik panggilan dan menyediakan penggunaan tumpukan. Anda dapat menemukan tutorial ftrace yang bagus di https://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_rostedt.pdf

ltrace adalah utilitas debug di Linux, digunakan untuk menampilkan panggilan yang dilakukan aplikasi ruang pengguna ke pustaka bersama. Alat ini dapat digunakan untuk melacak panggilan fungsi perpustakaan dinamis apa pun. Itu memotong dan merekam panggilan perpustakaan dinamis yang dipanggil oleh proses yang dieksekusi dan sinyal yang diterima oleh proses itu. Itu juga dapat mencegat dan mencetak panggilan sistem yang dijalankan oleh program.

  • http://www.ellexus.com/getting-started-with-ltrace-how-does-it-do-that/?doing_wp_cron=1425295977.1327838897705078125000
  • http://developerblog.redhat.com/2014/07/10/ltrace-for-rhel-6-and-7/

KDB adalah debugger dalam kernel dari kernel Linux. KDB mengikuti antarmuka gaya shell yang sederhana. Kita dapat menggunakannya untuk memeriksa memori, register, daftar proses, dmesg, dan bahkan menyetel breakpoint untuk berhenti di lokasi tertentu. Melalui KDB kita dapat mengatur breakpoint dan menjalankan beberapa kontrol dasar kernel run (Meskipun KDB bukan debugger tingkat sumber ). Beberapa sumber berguna tentang KDB

  • http://www.drdobbs.com/open-source/linux-kernel-debugging/184406318
  • http://elinux.org/KDB
  • http://dev.man-online.org/man1/kdb/
  • https://www.kernel.org/pub/linux/kernel/people/jwessel/kdb/usingKDB.html

KGDB dimaksudkan untuk digunakan sebagai debugger tingkat sumber untuk kernel Linux. Ini digunakan bersama dengan gdb untuk men-debug kernel Linux. Diperlukan dua mesin untuk menggunakan kgdb. Salah satu mesin ini adalah mesin pengembangan dan yang lainnya adalah mesin target. Kernel yang akan di-debug dijalankan pada mesin target. Harapannya adalah bahwa gdb dapat digunakan untuk "membobol" kernel untuk memeriksa memori, variabel, dan melihat melalui informasi tumpukan panggilan yang mirip dengan cara pengembang aplikasi menggunakan gdb untuk men-debug aplikasi. Dimungkinkan untuk menempatkan breakpoint dalam kode kernel dan melakukan beberapa langkah eksekusi terbatas. Beberapa sumber berguna tentang KGDB

  • http://landley.net/kdocs/Documentation/DocBook/xhtml-nochunks/kgdb.html

Menurut wiki, kgdb digabungkan ke dalam kernel di 2.6.26 yang dalam beberapa tahun terakhir. kgdb adalah debugger jarak jauh, jadi Anda mengaktifkannya di kernel lalu Anda memasang gdb ke dalamnya. Saya katakan entah bagaimana karena tampaknya ada banyak opsi - lihat menghubungkan gdb. Mengingat bahwa kgdb sekarang ada di pohon sumber, menurut saya ke depan inilah yang ingin Anda gunakan.

Jadi sepertinya Linus menyerah. Namun, saya akan menekankan argumennya - Anda harus tahu apa yang Anda lakukan dan mengetahui sistemnya dengan baik. Ini adalah tanah kernel. Jika terjadi kesalahan, Anda tidak mendapatkan segfault , Anda mendapatkan apa saja dari beberapa masalah yang tidak jelas di kemudian hari hingga seluruh sistem turun. Di sini jadilah naga. Lanjutkan dengan hati-hati, Anda telah diperingatkan.


Linux
  1. Apa itu Perintah Chown di Linux dan Cara Menggunakannya

  2. Apa Itu Podman Dan Bagaimana Cara Menginstal Podman Di Linux

  3. Bagaimana cara melihat perintah linux yang paling sering saya gunakan?

  1. Flatpak di Linux:Apa Itu dan Bagaimana Menginstal Aplikasi dengannya

  2. Apa itu memori tinggi dan memori rendah di Linux?

  3. Sumber entropi apa yang digunakan oleh kernel Linux?

  1. Apa itu FirewallD Dan Bagaimana Menerapkannya Di Linux

  2. Apa itu NFS dan bagaimana cara menginstalnya di Linux

  3. Linux – Apa Memori Tinggi dan Memori Rendah Di Linux?