Как отладить модуль ядра, в котором появляется указатель NULL?

9

У меня есть специальный модуль ядра, который я скомпилировал из этого патча, который добавляет поддержку logitech G19клавиатуры среди других устройств серии G. Я прекрасно скомпилировал его в основной ветке ядра Ubuntu (2.6.35).

Я могу загрузить и загрузить модуль, но я столкнулся с действительно странной ситуацией. Как только я загружаю модуль (либо при загрузке, либо через modprobe), у меня появляется черный экран, и моя консоль блокируется.

Странная часть в том, что она не блокирует мою систему, это просто текущий сеанс консоли. Я могу SSH в мою коробку, и это дает мне терминал и сеанс. И я могу печатать, и я даже могу запустить команду, и она дает мне вывод. Затем он рисует мой следующий запрос и сразу же блокируется.

Я вижу в dmesgэтом нулевой указатель и получаю следующую трассировку стека:

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

Кто-нибудь может указать мне правильное направление относительно того, как идти об устранении этого?

Эта трассировка заставляет меня поверить, что это не драйвер hid-g15, а драйвер hid-gfb, который создает буфер кадров для ЖК-дисплея на клавиатуре. Это имеет смысл, поскольку он блокирует мой дисплей / консоль, но копаться в коде ядра никуда не денется. Так много в нем функций сборки и макроса.

Последняя функция на StackTrace , что включает в себя мой новый код является gfb_fb_imageblit. Вся эта функция

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

Я неправильно читаю трассировку стека? Я что-то пропустил? Любые советы о том, как отладить это?

Falmarri
источник
Несколько лет назад я исправил аналогичную ошибку в pl2303модуле, просто внимательно прочитав код и найдя источник для указателя NULL. (Затем это крошечное исправление было принято GregKH, сопровождающим.) Возможно, вы могли бы использовать отладчик, чтобы помочь вам, спросить, как использовать отладчик с ядром. Также свяжитесь с разработчиками кода, у них могут быть идеи.
imz - Иван Захарящев
3
Ну, я знаю о других людях, у которых модуль работает. И я не уверен, что автор все еще рядом. Я думаю, что это хороший момент об использовании отладчика с ядром. Должен ли я задать это как новый вопрос или просто подождать, пока я не получу больше ответов здесь?
Фальмарри
Если вы просто заботитесь о том, чтобы модуль был пригоден для использования (и не обязательно помогал себе и сообществу, исправляя модуль для работы с вашим ядром), то попробуйте его с той же версией и конфигурацией ядра, что и у «других людей».
imz - Иван Захарящев
@imz: Ну, я видел только одно упоминание о том, что оно действительно используется, и я не знаю точное ядро ​​и конфигурацию, которые они использовали, только то, что оно было построено с ядром сурикатов. Я хотел бы узнать, хотя, поэтому я, вероятно, начну отлаживать это, когда у меня будет время.
Фалмарри
Если вы пройдете отладку самостоятельно, вы в конечном итоге сможете опубликовать один из лучших ответов на свой вопрос здесь!
imz - Иван Захарящев

Ответы:

10

Перво-наперво, отладить модуль? Просто посмотрите, можете ли вы загрузить его в GDB, он может направить вас прямо на строку, которая использует соответствующую переменную (или близко к ней).

о, и вы можете найти эту статью полезной

RobotHumans
источник
Ну, я прошел некоторые этапы отладки и следил за трассировкой стека. Но когда я перезагрузил компьютер и перезагрузил модули, он просто заработал. Итак, я не знаю, что случилось.
Фалмарри,
Хорошая сделка. Рад, что это работает по любой причине
RobotHumans
1
Работает ли он только с отладчиком? Вы изменили что-нибудь еще?
vonbrand
7

Я один из авторов этого патча, извините, он такой глючный :)

В общем, чтобы найти нулевые указатели, подобные этому, я просто вставляю printks, пока не найду указатель с нулевым значением (= 0), затем читаю исходный код, пока не выясню, почему.

Однако в этом случае я знаю, что вам нужно отключить консоль framebuffer, иначе вы получите эту неприятную ошибку, которая срабатывает только тогда, когда консоль видна. Или это может быть ошибка, возникающая при отключении клавиатуры, и модуль все еще пытается выполнить запись в недопустимый буфер.

Вам следует проверить новый код на github , который я сейчас пытаюсь очистить, чтобы упростить компиляцию с произвольными ядрами, и в котором есть немало исправлений ошибок.

Также зайдите на наш IRC, # lg4l на freenode.

ali1234
источник
Эй, спасибо за ответ. Я не ожидал, что патч будет без ошибок. На самом деле, я надеялся, что смогу внести существенный вклад в это. На самом деле, я думаю, у меня есть кое-какая хорошая информация для вас, ребята, хотя она может быть устаревшей, поскольку у меня не было возможности много работать над этим в последнее время. Я остановлюсь на IRC, когда у меня будет шанс.
Фальмарри,