Wie debugge ich ein Kernelmodul, in dem ein NULL-Zeiger angezeigt wird?


9

Ich habe ein benutzerdefiniertes Kernelmodul, das ich aus diesem Patch kompiliert habe und das die logitech G19Tastatur unter anderen Geräten der G-Serie unterstützt. Ich habe es gut gegen Ubuntus Maverick-Kernel-Master-Zweig (2.6.35) kompiliert.

Ich kann das Modul booten und laden, aber ich gerate in eine wirklich seltsame Situation. Sobald ich das Modul lade (entweder beim Booten oder über Modprobe), wird ein schwarzer Bildschirm angezeigt und meine Konsole blockiert.

Der seltsame Teil ist, dass es mein System nicht blockiert, sondern nur die aktuelle Konsolensitzung. Ich kann SSH in meine Box und es gibt mir ein Terminal und eine Sitzung. Und ich kann tippen, und ich kann sogar einen Befehl ausführen, der mir die Ausgabe gibt. Es zeichnet dann meine nächste Eingabeaufforderung und sperrt sofort.

Ich sehe darin, dmesgdass es einen Nullzeiger gibt und ich die folgende Stapelverfolgung bekomme:

[  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 ]---

Kann mich jemand in die richtige Richtung weisen, wie ich das debuggen soll?

Die Stapelverfolgung lässt mich glauben, dass es nicht der hid-g15-Treiber ist, sondern der hid-gfb-Treiber, der einen Bildpuffer für das LCD auf der Tastatur erstellt. Dies ist sinnvoll, da es mein Display / meine Konsole blockiert, aber das Durchsuchen des Kernel-Codes nicht wirklich funktioniert. So viel davon sind Assembly- und Makrofunktionen.

Die letzte Funktion auf dem Stacktrace, die meinen neuen Code betrifft, ist gfb_fb_imageblit. Die Gesamtheit dieser Funktion ist

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

Lese ich den Stacktrace falsch? Vermisse ich etwas Irgendwelche Tipps zum Debuggen?


Vor einigen Jahren habe ich einen ähnlichen Fehler im pl2303Modul behoben, indem ich einfach den Code sorgfältig gelesen und die Quelle für den NULL-Zeiger gefunden habe. (Dann wurde diese winzige Korrektur von GregKH, dem Betreuer, vorgenommen.) Vielleicht könnten Sie einen Debugger verwenden, um zu helfen und zu fragen, wie ein Debugger mit dem Kernel verwendet werden soll. Wenden Sie sich auch an die Betreuer des Codes, sie haben möglicherweise Ideen.
imz - Ivan Zakharyaschev

3
Nun, ich kenne andere Leute, bei denen das Modul anscheinend funktioniert. Und ich bin mir nicht sicher, ob der Autor noch da ist. Ich denke, das ist ein guter Punkt bei der Verwendung eines Debuggers mit dem Kernel. Soll ich das als neue Frage stellen oder einfach warten, bis ich hier weitere Antworten bekomme?
Falmarri

Wenn Sie sich nur darum kümmern, dass das Modul verwendet werden kann (und sich und der Community nicht unbedingt helfen, indem Sie das Modul so reparieren, dass es mit Ihrem Kernel funktioniert), versuchen Sie es mit derselben Kernelversion und -konfiguration wie "andere Personen".
imz - Ivan Zakharyaschev

@imz: Nun, ich habe nur eine Erwähnung gesehen, dass es tatsächlich verwendet wird, und ich kenne nicht den genauen Kernel und die Konfiguration, die sie verwendet haben, nur, dass es mit dem Erdmännchen-Kernel erstellt wurde. Ich würde es gerne lernen, also werde ich wahrscheinlich anfangen, dies zu debuggen, wenn ich etwas Zeit habe.
Falmarri

Wenn Sie das Debuggen selbst durchführen, können Sie hier letztendlich eine der besten Antworten auf Ihre Frage veröffentlichen!
imz - Ivan Zakharyaschev

Antworten:


10

Das Wichtigste zuerst: Debuggen Sie das Modul? Sehen Sie nur, ob Sie es in gdb laden können. Es zeigt Sie möglicherweise direkt auf eine Linie, die die relevante Variable verwendet (oder in der Nähe davon).

Oh, und vielleicht finden Sie diesen Artikel hilfreich


Nun, ich habe einige Debugging-Schritte durchlaufen und bin dem Stacktrace gefolgt. Aber als ich meinen Computer neu startete und die Module neu lud, funktionierte es einfach. Ich weiß also nicht, was los war.
Falmarri

Gutes Geschäft.
Ich bin

1
Funktioniert es nur mit dem Debugger? Hast du noch etwas geändert?
vonbrand

7

Ich bin einer der Autoren dieses Patches, sorry, es ist so fehlerhaft :)

Um solche Nullzeiger zu finden, füge ich im Allgemeinen nur printks ein, bis ich den Zeiger finde, der null (= 0) ist, und lese dann den Quellcode, bis ich herausfinde, warum.

In diesem Fall weiß ich jedoch, dass Sie die Framebuffer-Konsole deaktivieren müssen, da sonst dieser böse Fehler auftritt, der nur ausgelöst wird, wenn die Konsole sichtbar ist. Oder es könnte der Fehler sein, der ausgelöst wird, wenn Sie die Tastatur ausstecken und das Modul weiterhin versucht, in den jetzt ungültigen Puffer zu schreiben.

Sie sollten sich den neuen Code auf github ansehen , den ich gerade zu bereinigen versuche, um das Kompilieren mit beliebigen Kerneln zu vereinfachen, und der einige Fehlerbehebungen enthält.

Schauen Sie auch in unserem IRC # lg4l auf freenode vorbei.


Hey, danke für die Antwort. Ich habe nicht erwartet, dass der Patch fehlerfrei ist. Tatsächlich hatte ich gehofft, ich könnte einen bedeutenden Beitrag dazu leisten. Tatsächlich denke ich, dass ich einige gute Informationen für euch habe, auch wenn es vielleicht alt ist, da ich in letzter Zeit nicht die Gelegenheit hatte, viel daran zu arbeiten. Ich werde bei irc vorbeischauen, wenn ich die Chance bekomme.
Falmarri
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.