NULL işaretçisinin göründüğü bir çekirdek modülünde nasıl hata ayıklayabilirim?


9

Diğer G serisi cihazlar arasında klavye desteği sağlayan bu yamadan derlediğim özel bir çekirdek modülüm var logitech G19. Ubuntu'nun maverick çekirdeğinin ana dalına (2.6.35) karşı gayet iyi derledim.

Modülü önyükleyebilir ve yükleyebilirim, ama gerçekten garip bir durumla karşılaşıyorum. Modülü yükler yüklemez (önyüklemede veya modprobe ile), siyah bir ekran alıyorum ve konsolum kilitleniyor.

Garip kısmı, sistemimi kilitlememesi, sadece mevcut konsol oturumu. Kutuma SSH koyabilirim ve bana bir terminal ve bir oturum verir. Ve yazabilirim ve hatta bir komut çalıştırabilirim ve bana çıktıyı verir. Sonra bir sonraki istemi çizer ve hemen kilitlenir.

dmesgBoş bir işaretçi olduğunu görüyorum ve aşağıdaki yığın izini alıyorum:

[  956.215836] input: Logitech G19 Gaming Keyboard as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.1/1-2.1.2/1-2.1.2:1.1/input/input5
[  956.216023] hid-g19 0003:046D:C229.0004: input,hiddev97,hidraw3: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:1d.7-2.1.2/input1
[  956.216065] input: Logitech G19 as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.1/1-2.1.2/1-2.1.2:1.1/input/input6
[  956.216128] Registered led device: g19_97:orange:m1
[  956.216146] Registered led device: g19_97:orange:m2
[  956.216178] Registered led device: g19_97:orange:m3
[  956.216198] Registered led device: g19_97:red:mr
[  956.216216] Registered led device: g19_97:red:bl
[  956.216235] Registered led device: g19_97:green:bl
[  956.216259] Registered led device: g19_97:blue:bl
[  956.216872] Console: switching to colour frame buffer device 40x30
[  956.216899] BUG: unable to handle kernel NULL pointer dereference at 000000000000001c
[  956.216903] IP: [<ffffffffa040b21b>] sys_imageblit+0x21b/0x4ec [sysimgblt]
[  956.216911] PGD 273554067 PUD 2726ca067 PMD 0 
[  956.216914] Oops: 0000 [#1] SMP 
[  956.216917] last sysfs file: /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.1/1-2.1.2/1-2.1.2:1.1/usb/hiddev1/uevent
[  956.216921] CPU 5 
[  956.216922] Modules linked in: hid_g19(+) led_class hid_gfb fb_sys_fops sysimgblt sysfillrect syscopyarea btrfs zlib_deflate crc32c libcrc32c ufs qnx4 hfsplus hfs minix ntfs vfat msdos fat jfs xfs exportfs reiserfs snd_hda_codec_atihdmi snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_seq_midi snd_rawmidi snd_seq_midi_event snd_seq snd_timer snd_seq_device ioatdma snd i5000_edac soundcore snd_page_alloc psmouse edac_core i5k_amb shpchp serio_raw dca ppdev parport_pc lp parport usbhid hid floppy e1000e
[  956.216953] 
[  956.216956] Pid: 3147, comm: modprobe Not tainted 2.6.35-26-generic #46 DSBF-DE/System Product Name
[  956.216959] RIP: 0010:[<ffffffffa040b21b>]  [<ffffffffa040b21b>] sys_imageblit+0x21b/0x4ec [sysimgblt]
[  956.216963] RSP: 0018:ffff8802766db738  EFLAGS: 00010246
[  956.216965] RAX: 0000000000000000 RBX: ffff880273e71000 RCX: ffff880272e93b40
[  956.216968] RDX: 0000000000000007 RSI: 0000000000000010 RDI: ffff880272e93b40
[  956.216970] RBP: ffff8802766db7d8 R08: 0000000000000000 R09: ffff880272e93b98
[  956.216972] R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000
[  956.216974] R13: 0000000000000010 R14: 0000000000000008 R15: ffff8802766db8c8
[  956.216977] FS:  00007fcae7725700(0000) GS:ffff880001f40000(0000) knlGS:0000000000000000
[  956.216979] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[  956.216981] CR2: 000000000000001c CR3: 000000026ba26000 CR4: 00000000000006e0
[  956.216983] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  956.216986] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[  956.216988] Process modprobe (pid: 3147, threadinfo ffff8802766da000, task ffff8802696a16e0)
[  956.216990] Stack:
[  956.216991]  ffff8802766db778 ffffffff810746ae ffff8802766db700 ffff88026b2cadc0
[  956.216994] <0> ffff8802766db778 ffffffff812beef9 ffff8802f66db947 ffff8802766db94f
[  956.216998] <0> ffff8802766db848 00000000812bf22e ffff880272e93b40 ffffffff812feb40
[  956.217001] Call Trace:
[  956.217011]  [<ffffffff810746ae>] ? send_signal+0x3e/0x90
[  956.217018]  [<ffffffff812beef9>] ? put_dec+0x59/0x60
[  956.217023]  [<ffffffff812feb40>] ? fbcon_resize+0xd0/0x230
[  956.217027]  [<ffffffffa04175da>] gfb_fb_imageblit+0x1a/0x30 [hid_gfb]
[  956.217031]  [<ffffffff813051b9>] soft_cursor+0x1c9/0x270
[  956.217034]  [<ffffffff81304e8b>] bit_cursor+0x65b/0x6c0
[  956.217037]  [<ffffffff812c1796>] ? vsnprintf+0x316/0x5a0
[  956.217043]  [<ffffffff81061045>] ? try_acquire_console_sem+0x15/0x60
[  956.217046]  [<ffffffff81300ca8>] fbcon_cursor+0x1d8/0x340
[  956.217049]  [<ffffffff81304830>] ? bit_cursor+0x0/0x6c0
[  956.217054]  [<ffffffff81368139>] hide_cursor+0x29/0x90
[  956.217057]  [<ffffffff8136b078>] redraw_screen+0x148/0x240
[  956.217060]  [<ffffffff8136b42e>] bind_con_driver+0x2be/0x3b0
[  956.217063]  [<ffffffff8136b569>] take_over_console+0x49/0x70
[  956.217066]  [<ffffffff812ff7fb>] fbcon_takeover+0x5b/0xb0
[  956.217069]  [<ffffffff81303ca5>] fbcon_event_notify+0x5c5/0x650
[  956.217076]  [<ffffffff8158e7f6>] notifier_call_chain+0x56/0x80
[  956.217080]  [<ffffffff8108510a>] __blocking_notifier_call_chain+0x5a/0x80
[  956.217084]  [<ffffffff81085146>] blocking_notifier_call_chain+0x16/0x20
[  956.217089]  [<ffffffff812f366b>] fb_notifier_call_chain+0x1b/0x20
[  956.217092]  [<ffffffff812f4c8c>] register_framebuffer+0x1ec/0x2e0
[  956.217098]  [<ffffffff814084f8>] ? usb_init_urb+0x28/0x40
[  956.217101]  [<ffffffffa041790f>] gfb_probe+0x21f/0x4f0 [hid_gfb]
[  956.217107]  [<ffffffffa0425778>] g19_probe+0x558/0xedc [hid_g19]
[  956.217115]  [<ffffffff811c059c>] ? sysfs_do_create_link+0xec/0x210
[  956.217128]  [<ffffffffa00330c7>] hid_device_probe+0x77/0xf0 [hid]
[  956.217131]  [<ffffffff81388aa2>] ? driver_sysfs_add+0x62/0x90
[  956.217134]  [<ffffffff81388bc8>] really_probe+0x68/0x190
[  956.217138]  [<ffffffff81388d35>] driver_probe_device+0x45/0x70
[  956.217140]  [<ffffffff81388dfb>] __driver_attach+0x9b/0xa0
[  956.217143]  [<ffffffff81388d60>] ? __driver_attach+0x0/0xa0
[  956.217146]  [<ffffffff81388008>] bus_for_each_dev+0x68/0x90
[  956.217149]  [<ffffffff81388a3e>] driver_attach+0x1e/0x20
[  956.217151]  [<ffffffff813882fe>] bus_add_driver+0xde/0x280
[  956.217154]  [<ffffffff81389140>] driver_register+0x80/0x150
[  956.217157]  [<ffffffff8158e7f6>] ? notifier_call_chain+0x56/0x80
[  956.217161]  [<ffffffffa042a000>] ? g19_init+0x0/0x20 [hid_g19]
[  956.217166]  [<ffffffffa0032913>] __hid_register_driver+0x53/0x90 [hid]
[  956.217169]  [<ffffffff81085115>] ? __blocking_notifier_call_chain+0x65/0x80
[  956.217173]  [<ffffffffa042a01e>] g19_init+0x1e/0x20 [hid_g19]
[  956.217178]  [<ffffffff8100204c>] do_one_initcall+0x3c/0x1a0
[  956.217184]  [<ffffffff8109bd9b>] sys_init_module+0xbb/0x200
[  956.217192]  [<ffffffff8100a0f2>] system_call_fastpath+0x16/0x1b
[  956.217195] Code: 83 e1 fc 48 89 4d c8 eb d3 8b 83 14 01 00 00 83 f8 04 74 09 83 f8 02 0f 85 7b 01 00 00 48 8b 4d b0 48 8b 83 00 04 00 00 8b 51 10 <44> 8b 04 90 8b 51 14 8b 3c 90 44 8b 4d ac 45 85 c9 75 16 41 b9 
[  956.217218] RIP  [<ffffffffa040b21b>] sys_imageblit+0x21b/0x4ec [sysimgblt]
[  956.217221]  RSP <ffff8802766db738>
[  956.217223] CR2: 000000000000001c
[  956.217227] ---[ end trace 95d6c6d6913ccc79 ]---

Herkes bu hata ayıklama hakkında nasıl doğru yönde bana işaret edebilir?

Stacktrace, bunun hid-g15 sürücüsü değil, klavyedeki LCD için bir çerçeve arabelleği oluşturan hid-gfb sürücüsü olduğuna inanmamı sağlıyor. Bu, ekranımı / konsolumu kilitlediğinden, ancak çekirdek kodunu kazmaktan hiçbir yere gitmediği için mantıklı. Bunların çoğu montaj ve makro işlevleridir.

Yeni kodumu içeren yığın izlemedeki son işlev gfb_fb_imageblit. Bu işlevin tamamı

   struct gfb_data *par = info->par;
   sys_imageblit(info, image);
   gfb_fb_update(par);

Yığın izini yanlış mı okuyorum? Bir şey mi kaçırıyorum? Bu hata ayıklama ile ilgili ipuçları var mı?


Birkaç yıl önce, pl2303kodu dikkatlice okuyarak ve NULL işaretçisinin kaynağını bularak modüldeki benzer bir hatayı çözdüm. (Sonra bu küçük düzeltme, koruyucu GregKH tarafından alındı.) Belki de, size yardımcı olması için bir hata ayıklayıcı kullanabilirsiniz, çekirdeğin bir hata ayıklayıcıyı nasıl kullanacağınızı sorun. Ayrıca kodun destekçileri ile iletişime geçin, fikirleri olabilir.
imz - Ivan Zakharyaschev

3
Şey, görünüşe göre modülü çalıştıran diğer insanları biliyorum. Ve yazarın hala etrafta olduğundan emin değilim. Sanırım bu, çekirdekle bir hata ayıklayıcı kullanma konusunda iyi bir nokta. Bunu yeni bir soru olarak sormalı mıyım yoksa burada daha fazla cevap alana kadar beklemeli miyim?
Falmarri

Sadece modülün kullanılabilir olmasına önem veriyorsanız (ve modülün çekirdeğinizle çalışmasını düzelterek kendinize ve topluluğa yardım etmeniz gerekmez), o zaman bunu "diğer kişiler" ile aynı çekirdek sürümü ve yapılandırmayla deneyin.
imz - Ivan Zakharyaschev

@imz: Aslında kullanıldığına dair sadece bir söz gördüm ve kullandıkları tam çekirdeği ve yapılandırmayı bilmiyorum, sadece meerkat çekirdeği ile inşa edildiğini. Yine de öğrenmek istiyorum, bu yüzden biraz zamanım olduğunda muhtemelen hata ayıklamaya başlayacağım.
Falmarri

Hata ayıklamayı kendiniz yaparsanız, sonuç olarak sorunuza en iyi cevaplardan birini buraya gönderebilirsiniz!
imz - Ivan Zakharyaschev

Yanıtlar:


10

İlk önce, modül hata ayıklama? Sadece gdb bu kadar yük eğer görmek olabilir düz (kapat kendisine veya) İlgili değişkeni kullanan bir çizgide sizi etmektedir.

oh, ve bu makaleyi faydalı bulabilirsin


Bazı hata ayıklama adımlarından geçtim ve yığın izini takip ettim. Ancak bilgisayarımı yeniden başlattığımda ve modülleri yeniden yüklediğimde işe yaradı. Yani, neyin yanlış olduğunu bilmiyorum.
Falmarri

İyi anlaşma. Sevindim ne olursa olsun çalışıyor
RobotHumans

1
Sadece hata ayıklayıcı ile çalışır mı? Başka bir şey değiştirdin mi?
vonbrand

7

Ben o yamanın yazarlarından biriyim, üzgünüm çok buggy :)

Genel olarak bu gibi boş işaretçiler bulmak için ben sadece boş işaretçi (= 0) bulana kadar printks yerleştirin, sonra nedenini bulana kadar kaynak kodunu okudum.

Ancak bu durumda framebuffer konsolunu devre dışı bırakmanız gerektiğini biliyorum ya da sadece konsol görünür olduğunda tetiklenen bu kötü hatayı alırsınız. Veya klavyeyi prizden çektiğinizde tetiklenen hata olabilir ve modül hala geçersiz tampon belleğe yazmaya çalışır.

Şu anda temizlemeye çalıştığım, keyfi çekirdeklere karşı derlemeyi kolaylaştırmak ve birkaç hata düzeltmesi olan github'daki yeni kodu kontrol etmelisiniz .

Ayrıca, IRC, freenode üzerinde # lg4l ile bırakın.


Hey, cevap verdiğiniz için teşekkürler. Yama hata ücretsiz olmasını beklemiyorduk. Aslında buna anlamlı katkıda bulunabileceğimi umuyordum. Aslında, son zamanlarda bu konuda fazla çalışma şansım olmadığı için eski olsa da, sizin için bazı iyi bilgilerim olduğunu düşünüyorum. Şansım olduğunda irc ile duracağım.
Falmarri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.