Linux çekirdeği canlı hata ayıklama, nasıl yapılır ve hangi araçlar kullanılır?

Linux çekirdeğinde canlı hata ayıklama yapmak için kullanılan en yaygın ve neden nadir olmayan yöntemler ve araçlar nelerdir? Linus'u benim için biliyorum. karşı Linux çekirdeği için hata ayıklama bu tür ya da en az oldu ve bu nedenle o yıllarda bu anlamda çok şey yapılmadı, ama dürüst olmak gerekirse 2000 yılından bu yana çok zaman geçti ve bu zihniyet Linux projesi ile ilgili değişti ve ne güncel yöntemler canlı hata ayıklama yapmak için kullanılır eğer ilgileniyorum şu anda Linux çekirdeğinde(yerel veya uzak)?

belirtilen teknikler ve araçlar hakkında izlenecek yollar ve öğreticiler Referanslar açığız.

47
tarihinde sordu Shinnok 2011-02-09 13:53:01
kaynak

10 ответов

başka bir seçenek / / JTAG kontrolcü ve GDB kullanmaktır. Bu 'donanım' çözümü özellikle gömülü sistemler,

ile kullanılır

ancak örneğin qemu benzer özellikler sunar:

  • localhost' da dinleyen bir gdb 'remote' saplama ile qemu'yu Başlat:1234' : qemu -s ... ,

  • sonra gdb ile çekirdek dosyasını vmlinux açın. hata ayıklama bilgileri ile (bir göz atabilirsiniz bu posta listesi iş parçacığı nerede çekirdeğin unoptimization tartışmak).

  • gdb ve Qemu'yu bağlayın: target remote localhost:1234

  • see you're live kernel:

    (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
    

ne yazık ki, gdb (görev yok liste bilgileri, farklı süreç bağlamları görmek için hiçbir MMU yeniden programlama,...), ama uzayda kalırsanız, bu oldukça kullanışlıdır.

  • info threads size farklı CPUs
  • listesini ve durumlarını verecektir

Düzenle:

bu PDF prosedürü hakkında daha fazla bilgi alabilirsiniz:

Gdb ve QEMU kullanarak Linux sistemleri hata ayıklama .

25
cevap Kevin 2016-12-30 01:29:49
kaynak

göre , , kgdb son birkaç yıl içinde olan 2.6.26 çekirdeğe birleştirildi. kgdb bir uzaktan hata ayıklayıcı , yani çekirdek etkinleştirmek o zaman bir şekilde gdb eklemek. Bir şekilde çok seçenek var gibi görünüyor - bağlantı gdb bölümüne bakın . kgdb şimdi kaynak ağacında olduğu göz önüne alındığında, bunun ileri gittiğini söyleyebilirim ne kullanarak olmak istiyorum.

bu yüzden Linus verdi gibi görünüyor. Bununla birlikte, argümanını vurgulardım-ne yaptığınızı bilmelisiniz ve sistemi iyi bilmelisiniz. Burası kernel land. Bir şey ters giderse, segfault almazsınız, daha sonra tüm sistemden gelen bazı belirsiz problemlerden bir şey elde edersiniz. İşte ejderhalar. Dikkatli olun, uyarıldınız.

20
cevap 2011-02-09 14:15:23
kaynak

Linux çekirdeğini hata ayıklarken, örneğin hata ayıklayıcıları (KDB, KGDB), çökerken (lkcd), izleme araç seti (LTT, LTTV, LTTng), özel çekirdek aletleri (dprobes, kprobes) gibi çeşitli araçları kullanabiliriz. Aşağıdaki bölümde, bunların çoğunu kullanmaya çalıştım, umarım bunlar yardımcı olacaktır.

LKCD (Linux Kernel Crash Dump) aracı, bir çökme oluştuğunda Linux sisteminin belleğinin içeriğini yazmasına izin verir. Bu günlükleri olabilir kazanın kök nedeni için daha fazla analiz edildi. Lkcd

ile ilgili kaynaklar

Oops çekirdek bir sorun algıladığında, bir Oops mesajı yazdırır. Böyle bir mesaj, hata işleyicisindeki printk deyimleri (arch/*/kernel/) tarafından oluşturulur.orta.) Çekirdekte printk deyimleri tarafından kullanılan özel bir halka arabelleği. Oops gibi bilgileri içerir, CPU nerede Oops oluştu, CPU kayıtları içeriği, Oops sayısı, açıklama, yığın geri izleme ve diğerleri. Çekirdek Oops ile ilgili kaynaklar

dinamik sondalar IBM tarafından geliştirilen Linux için popüler hata ayıklama aracı biridir. Bu araç bir "prob" yerleştirilmesini sağlar" sistemdeki hemen hemen her yerde, hem kullanıcı hem de çekirdek alanında. Sonda, kontrol verilen noktaya geldiğinde yürütülen bazı kodlardan (özel, yığın odaklı bir dilde yazılmış) oluşur. Aşağıda listelenen dinamik Probe ilişkin kaynaklar

Linux Trace Toolkit bir çekirdek yama ve çekirdek olayların izlemesine izin ilgili programları bir dizi. İzleme zamanlama bilgileri içerir ve belirli bir süre içinde ne makul tam bir resim oluşturabilirsiniz. Ltt, LTT Görüntüleyici ve LTT Yeni Nesil kaynakları

MEMWATCH bir açık kaynak bellek hata algılama aracıdır. Tarafından çalışır GCC ifadesinde MEMWATCH tanımlama ve kodumuza bir üstbilgi dosyası ekleyerek. Bu sayede bellek sızıntılarını ve bellek bozulmalarını izleyebiliriz. MEMWATCH

ile ilgili kaynaklar

ftrace Linux çekirdeği için iyi bir izleme çerçevesidir. ftrace çekirdeğin iç işlemlerini izler. Bu araç dahil 2.6.27'de Linux çekirdeği. Çeşitli izleyici eklentileri ile ftrace, zamanlama olayları, kesmeler, bellek eşlemeli G / Ç, CPU güç durumu geçişleri ve dosya sistemleri ve sanallaştırma ile ilgili işlemler gibi farklı statik izleme noktalarında hedeflenebilir. Ayrıca, çekirdek fonksiyon çağrılarının dinamik takibi, isteğe bağlı olarak globs kullanarak işlevlerin bir alt kümesine kısıtlanabilir ve çağrı grafikleri oluşturma ve yığın kullanımını sağlama imkanı ile kullanılabilir. Sen iyi bir öğretici bulabilirsiniz ftrace at https://events.linuxfoundation.org/slides/2010/linuxcon_japan/linuxcon_jp2010_rostedt.pdf

ltrace Linux'ta bir hata ayıklama aracıdır, paylaşılan kütüphanelere bir kullanıcı alanı uygulaması yapan çağrıları görüntülemek için kullanılır. Bu araç, herhangi bir dinamik kitaplık işlev çağrısını izlemek için kullanılabilir. Bu yakalar ve yürütülen işlem ve tarafından çağrılır dinamik kütüphane çağrıları kaydeder bu işlem tarafından alınan sinyaller. Ayrıca kesmek ve program tarafından yürütülen sistem çağrılarını yazdırabilirsiniz.

KDB , Linux çekirdeğinin çekirdek içi hata ayıklayıcısıdır. KDB basit kabuk tarzı arayüzü izler. Bellek, kayıt, işlem listeleri, dmesg ve hatta belirli bir yerde durdurmak için kesme noktalarını ayarlamak için kullanabilirsiniz. KDB aracılığıyla kesme noktalarını ayarlayabilir ve bazı temel çekirdek çalıştırma kontrolünü yürütebiliriz ( KDB kaynak seviyesi hata ayıklayıcı olmasa da). KDB

ile ilgili çeşitli kullanışlı kaynaklar

KGDB bir kaynak düzeyi hata ayıklayıcı olarak kullanılmak üzere tasarlanmıştır Linux çekirdeği için. Bir Linux çekirdeği hata ayıklamak için gdb ile birlikte kullanılır. Kgdb kullanmak için iki makine gereklidir. Bu makinelerden biri bir geliştirme makinesidir ve diğeri hedef makinedir. Hata ayıklanacak çekirdek hedef makinede çalışır. Beklenti, gdb'nin bellek, değişkenleri incelemek ve bir uygulama geliştiricisinin bir uygulamayı hata ayıklamak için gdb'yi kullanma biçimine benzer çağrı yığını bilgilerine bakmak için çekirdeğe "girmek" için kullanılabilmesidir. Yerleştirmek mümkündür çekirdek kodundaki kesme noktaları ve bazı sınırlı yürütme adımları gerçekleştirin. KGDB

ile ilgili çeşitli kullanışlı kaynaklar
20
cevap Md Mahbubur Rahman 2015-03-02 15:17:41
kaynak

"canlı" hata ayıklama için başka iyi bir araç kprobes / dinamik sondalar.

bu, belirli adresler yürütüldüğünde çalışan küçük küçük modülleri dinamik olarak oluşturmanıza olanak tanır-bir kesme noktası gibi.

bunların büyük avantajı:

  1. sistemi etkilemezler-yani bir konum vurulduğunda-kodu excecutes - tüm çekirdeği durdurmaz.
  2. yok kgdb
  3. gibi birbirine bağlı iki farklı sisteme (hedef ve hata ayıklama) ihtiyacınız var

bir kesme noktasına vurmak ve veri değerlerinin ne olduğunu görmek veya şeylerin değiştirilip değiştirilmediğini kontrol etmek gibi şeyler yapmak en iyisidir. Eğer "kod adım" istiyorsanız-bunu yapmaz.

ilavesi-2018:

başka bir çok güçlü yöntem basitçe rolls-up birçok araç (gibi) hangi tür "perf" olarak adlandırılan bir programdır Dinamik sondalar) ve diğerleri (oprofile gibi) değiştirir/depricates tür.

özellikle, perf probe komutu, sisteme dinamik sondalar kolayca oluşturmak/eklemek için kullanılabilir; bundan sonra perf record , probun perf report (veya perf script ) aracılığıyla raporlama için vurulduğu zaman sistemi ve rapor bilgilerini (ve geri çekimleri) örnekleyebilir. Çekirdekte iyi hata ayıklama sembolleriniz varsa, çekirdeği bile almadan sistemden büyük bir ıntel alabilirsiniz. Bir man perf yap (Google veya sisteminizde) bu araç hakkında daha fazla bilgi için veya üzerinde bu büyük sayfayı görmek:

http://www.brendangregg.com/perf.html

13
cevap Brad 2018-10-01 16:45:26
kaynak

aslında şaka, Linux'un 2.2.12, xmon , ancak sadece powerpc mimarisi için bir çekirdek hata ayıklayıcısına sahip olmasıdır (aslında ppc o zamanlar).

bu bir kaynak düzeyi hata ayıklayıcı değil ve neredeyse tamamen belgesiz, ama yine de.

http://lxr.linux.no/linux-old + v2.2.12 / arch / ppc/xmon / xmon.c # L119

4
cevap mpe 2011-02-10 15:44:55
kaynak

çekirdek kodunu yazan biri olarak kgdb'yi hiç kullanmadım ve sadece nadiren kprobes vb.kullandığımı söylemek zorundayım.

hala bazı stratejik printks atmak için en iyi yaklaşımdır. Daha son zamanlarda, trace_printk dmesg spam olmadan bunu yapmak için iyi bir yoldur.

3
cevap mpe 2011-02-10 15:52:16
kaynak

Qemu + Gdb adım adım yordam Ubuntu üzerinde test 16.10 host

sıfırdan hızlı bir şekilde başlamak için en az tam otomatik QEMU + Buildroot örneği yaptım: https://github.com/cirosantilli/linux-kernel-module-cheat önemli adımlar aşağıda kaplıdır.

önce bir kök dosya sistemi rootfs.cpio.gz alın . Bir ihtiyacınız varsa, düşünün:

sonra Linux çekirdeği:

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

başka bir terminalde, start_kernel den hata ayıklamaya başlamak istediğinizi varsayarak:

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'

ve biz bitti!!

çekirdek modülleri için bkz.: QEMU ile Linux çekirdek modüllerini nasıl hata ayıklayabilirim?

Ubuntu 14.04, gdb 7.7.1, hbreak için

, break yazılım kesme noktaları göz ardı edildi. Dava değil artık 16.10. Ayrıca bakınız: https://bugs.launchpad.net/ubuntu / + kaynak / qemu-kvm / + hata / 901944

dağınık disconnect ve ne hata etrafında çalışmak için sonra geliyor:

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

ilgili konu:

Ayrıca bakınız:

bilinen sınırlamalar:

3
kaynak

KGDB + QEMU adım adım

KGDB, çekirdeğin kendisini bir ana GDB'DEN ayıklamanıza izin veren bir çekirdek alt sistemidir.

benim QEMU + Buildroot örnek gerçek donanım olmadan bunun bir tat almak için iyi bir yoldur: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1969cd6f8d30dace81d9848c6bacbb8bad9dacd8#kgdb

artıları ve eksileri vs diğer yöntemler:

  • advantage vs QEMU:
    • donanım satıcıları
    • cihazları için doğru yazılım modelleri serbest bırakmak sevmiyorum gibi sık sık cihazınız için yazılım öykünme yok
    • gerçek donanım yolu daha hızlı qemu
  • advantage vs JTAG:
  • kurulumu daha kolay ekstra JTAG donanımına gerek yok
  • : vs QEMU ve JTAG: daha az görünürlük ve daha müdahaleci. KGDB, ana bilgisayarla iletişim kurabilmesi için çekirdeğin belirli bölümlerine dayanır. Yani örneğin panikte bozulur, önyükleme sırasını görüntüleyemezsiniz.

ana adımlar şunlardır:

  1. ile çekirdek derlemek:

    CONFIG_DEBUG_KERNEL=y
    CONFIG_DEBUG_INFO=y
    
    CONFIG_CONSOLE_POLL=y
    CONFIG_KDB_CONTINUE_CATASTROPHIC=0
    CONFIG_KDB_DEFAULT_ENABLE=0x1
    CONFIG_KDB_KEYBOARD=y
    CONFIG_KGDB=y
    CONFIG_KGDB_KDB=y
    CONFIG_KGDB_LOW_LEVEL_TRAP=y
    CONFIG_KGDB_SERIAL_CONSOLE=y
    CONFIG_KGDB_TESTS=y
    CONFIG_KGDB_TESTS_ON_BOOT=n
    CONFIG_MAGIC_SYSRQ=y
    CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
    CONFIG_SERIAL_KGDB_NMI=n
    

    bunların çoğu zorunlu değildir, ancak test ettiğim şey budur.

  2. QEMU komutuna Ekle:

    -append 'kgdbwait kgdboc=ttyS0,115200' \
    -serial tcp::1234,server,nowait
    
  3. Linux çekirdek kaynak ağacının kökünden Gdb'yi çalıştırın:

    gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
    
  4. GDB'DE:

    (gdb) c
    

    ve önyükleme bitmelidir.

  5. in QEMU:

    echo g > /proc/sysrq-trigger
    

    ve GDB kırılmalıdır.

  6. artık işimiz bitti, GDB'Yİ her zamanki gibi kullanabilirsiniz:

    b sys_write
    c
    

Ubuntu 14.04'te test edildi.

KGDB + Ahududu Pi

yukarıdaki gibi aynı kurulum neredeyse bir Ahududu Pi 2, Raspbian Jessie 2016-05-27 üzerinde çalıştı.

sadece kolayca Pi, QEMU adımları yapmak öğrenmek zorunda Googlable:

  • yapılandırma seçeneklerini ekleyin ve de açıklandığı gibi çekirdeği yeniden derleyin https://www.raspberrypi.org/documentation/linux/kernel/building.md varsayılan çekirdek yapısındaki maalesef eksik seçenekler vardı, özellikle hata ayıklama sembolleri yoktu, bu nedenle yeniden derlemeye ihtiyaç duyuluyordu.

  • Düzenle cmdline.txt önyükleme bölümü ve Ekle:

    kgdbwait kgdboc=ttyAMA0,115200
    
  • gdb seri ile bağlayın:

    arm-linux-gnueabihf-gdb -ex 'file vmlinux' -ex 'target remote /dev/ttyUSB0'
    

    seri aşina değilseniz, bu göz atın: https://www.youtube.com/watch?v=da5Q7xL_OTo tek ihtiyacınız olan ucuz bir adaptör bu gibi . KGDB'Yİ denemeden önce çalıştığından emin olmak için seri üzerinden bir kabuk alabildiğinizden emin olun.

  • do:

    echo g | sudo tee /proc/sysrq-trigger
    

    bir SSH oturumunun içinden, seri zaten GDB tarafından alındığından.

bu kurulumla, sys_write bir kesme noktası koyabildim, program yürütülmesini duraklattım, kaynak listeledim ve devam ettim.

ancak, bazen next sys_write GDB'DE next yaptığımda bu hata mesajını birkaç kez asıp bastım:

Ignoring packet error, continuing...

bu yüzden kurulumumda bir şeylerin yanlış olup olmadığından emin değilim, ya da eğer bunun nedeni, bazı arka plan sürecinin daha karmaşık Raspbian görüntüsünde ne yaptığı bekleniyor.

Linux önyükleme seçenekleriyle Çoklu işlem yapmayı denediğim ve devre dışı bıraktığım söylendi, ancak henüz denemedim.

2
kaynak

kullanıcı modu Linux (UML)

https://en.wikipedia.org/wiki/User-mode_Linux

başka bir sanallaştırma adım hata ayıklama çekirdek kodu sağlayan başka bir yöntem.

UML çok ustaca: sadece x86 gibi bir ARCH olarak uygulanır, ancak düşük seviyeli talimatları kullanmak yerine, userland sistemi ile ARCH işlevlerini uygular arıyor.

sonuç bir Linux ana bilgisayarda bir userland süreci olarak Linux çekirdek kodu çalıştırmak mümkün olmasıdır!

önce bir rootfs yapın ve gösterildiği gibi çalıştırın: https://unix.stackexchange.com/questions/73203/how-to-create-rootfs-for-user-mode-linux-on-fedora-18/372207#372207

um defconfig varsayılan olarak CONFIG_DEBUG_INFO=y ayarlar (evet, bir geliştirme şeydir), bu yüzden iyiyiz.

konuk:

i=0
while true; do echo $i; i=$(($i+1)); done

başka bir kabukta ana bilgisayarda:

ps aux | grep ./linux
gdb -pid "$pid"
GDB'DE

:

break sys_write
continue
continue

ve şimdi GDB'DEN sayımı kontrol ediyorsunuz ve kaynak beklendiği gibi görebilirsiniz.

Artıları:

  • tamamen Linux çekirdeği ana hat ağacında bulunan
  • QEMU'NUN tam sistem öykünmesinden daha hafif

Cons:

  • çok invaziv, çekirdeğin kendisinin nasıl derlendiğini değiştirir.

    ancak ARCH özelliklerinin dışındaki daha yüksek seviye API'leri değişmeden kalmalıdır.

  • tartışmasız çok aktif değil: kullanıcı modu linux (UML) projesi durdu mu?

Ayrıca bakınız: https://unix.stackexchange.com/questions/127829/why-would-someone-want-to-run-usermode-linux-uml

1
kaynak

kgdb ve gdb, çekirdeğin hata ayıklanması için neredeyse işe yaramaz çünkü kod çok optimize edilmiştir, orioginal kaynağa hiçbir ilişkisi yoktur ve birçok varuiables optimize edilmiştir. Bu steppijng yapar, dolayısıyla kaynak üzerinden adım imkansız, değişkenleri incelemek imkansızdır ve bu nedenle aolmost pointles.

aslında işe yaramaz daha kötüdür, aslında size yanlış infoprmation verir, bu yüzden gerçek için ollooking kod budur kod çalışıyor.

ve hayır, çekirdekte optimizasyonları kapatamazsınız, derlenmez.

söylemeliyim ki, bir Windows çekirdek ortamından geliyor, iyi hata ayıklayıcı eksikliği korumak için orada önemsiz kod olduğu göz önüne alındığında, anoying.

-4
cevap matt 2013-07-08 18:25:11
kaynak