Làm cách nào để gỡ lỗi mô-đun hạt nhân trong đó con trỏ NULL xuất hiện?


9

Tôi có một mô-đun hạt nhân tùy chỉnh mà tôi đã biên dịch từ bản vá này để thêm hỗ trợ cho logitech G19bàn phím trong số các thiết bị dòng G khác. Tôi đã biên dịch nó tốt với nhánh chính của maverick kernel (2.6.35).

Tôi có thể khởi động và tải mô-đun, nhưng tôi đang gặp phải một tình huống thực sự kỳ lạ. Ngay khi tôi tải mô-đun (khi khởi động hoặc thông qua modprobe), tôi nhận được một màn hình đen và bảng điều khiển của tôi bị khóa.

Điều kỳ lạ là nó không khóa hệ thống của tôi, đó chỉ là phiên giao diện điều khiển hiện tại. Tôi có thể SSH vào hộp của mình và nó cung cấp cho tôi thiết bị đầu cuối và phiên. Và tôi có thể gõ, và tôi thậm chí có thể chạy một lệnh và nó cho tôi đầu ra. Sau đó nó rút ra lời nhắc tiếp theo của tôi và ngay lập tức khóa lại.

Tôi thấy trong dmesgđó có một con trỏ null và tôi nhận được stacktrace sau:

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

Bất cứ ai có thể chỉ cho tôi đi đúng hướng như làm thế nào để đi về gỡ lỗi này?

Ngăn xếp khiến tôi tin rằng đó không phải là trình điều khiển hid-g15 mà là trình điều khiển hid-gfb, tạo ra bộ đệm khung cho màn hình LCD trên bàn phím. Điều này có ý nghĩa vì nó khóa màn hình / bảng điều khiển của tôi nhưng việc đào sâu vào mã kernel không thực sự đi đâu cả. Rất nhiều trong số đó là lắp ráp và các chức năng vĩ mô.

Hàm cuối cùng trên stacktrace liên quan đến mã mới của tôi là gfb_fb_imageblit. Toàn bộ chức năng đó là

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

Tôi đang đọc stacktrace sai? Tui bỏ lỡ điều gì vậy? Bất kỳ lời khuyên về cách gỡ lỗi này?


Cách đây vài năm, tôi đã giải quyết một lỗi tương tự trong pl2303mô-đun bằng cách đọc kỹ mã và tìm nguồn cho con trỏ NULL. (Sau đó, bản sửa lỗi nhỏ này được GregKH, người bảo trì thực hiện.) Có lẽ, bạn có thể sử dụng trình gỡ lỗi để giúp bạn, hỏi cách sử dụng trình gỡ lỗi với kernel. Cũng liên hệ với những người duy trì mã, họ có thể có ý tưởng.
imz - Ivan Zakharyaschev

3
Vâng, điều tôi biết là những người khác dường như có mô-đun làm việc. Và tôi không chắc tác giả vẫn ở đây. Tôi đoán đó là một điểm tốt về việc sử dụng trình gỡ lỗi với kernel. Tôi có nên hỏi nó như một câu hỏi mới hay chỉ đợi cho đến khi tôi nhận được nhiều câu trả lời hơn ở đây?
Falmarri

Nếu bạn chỉ quan tâm đến việc mô-đun có thể sử dụng được (và không nhất thiết phải giúp bản thân và cộng đồng bằng cách sửa mô-đun hoạt động với kernel của bạn), thì hãy thử nó với cùng một phiên bản kernel và cấu hình như "người khác" sử dụng.
imz - Ivan Zakharyaschev

@imz: Chà, tôi chỉ thấy một đề cập đến nó thực sự đang được sử dụng và tôi không biết chính xác kernel và cấu hình mà họ đã sử dụng, chỉ có điều nó được xây dựng với kernel meerkat. Tôi muốn tìm hiểu mặc dù vậy có lẽ tôi sẽ bắt đầu gỡ lỗi này khi tôi có thời gian.
Falmarri

Nếu bạn tự mình gỡ lỗi, cuối cùng bạn sẽ có thể đăng một trong những câu trả lời hay nhất cho câu hỏi của bạn tại đây!
imz - Ivan Zakharyaschev

Câu trả lời:


10

Điều đầu tiên trước tiên, gỡ lỗi các mô-đun? Chỉ cần xem nếu bạn có thể tải nó lên trong gdb, nó có thể chỉ cho bạn thẳng vào một dòng sử dụng biến có liên quan (hoặc gần với nó).

oh, và bạn có thể thấy này bài viết hữu ích


Vâng, tôi đã trải qua một số bước gỡ lỗi và làm theo stacktrace. Nhưng khi tôi khởi động lại máy tính và tải lại các mô-đun, nó chỉ hoạt động. Vì vậy, tôi không biết những gì đã sai.
Falmarri

Món hời. Vui mừng vì nó hoạt động vì bất kỳ lý do gì
RobotHumans

1
Nó chỉ hoạt động với trình gỡ lỗi? Bạn có thay đổi gì nữa không?
vonbrand

7

Tôi là một trong những tác giả của bản vá đó, xin lỗi vì nó rất có lỗi :)

Nói chung để tìm con trỏ null như thế này tôi chỉ cần chèn printks cho đến khi tôi tìm thấy con trỏ là null (= 0), sau đó tôi đọc mã nguồn cho đến khi tôi tìm hiểu tại sao.

Tuy nhiên trong trường hợp này tôi biết rằng bạn phải vô hiệu hóa bảng điều khiển bộ đệm khung hoặc bạn sẽ gặp phải lỗi khó chịu này, nó chỉ được kích hoạt khi bảng điều khiển hiển thị. Hoặc đó có thể là lỗi được kích hoạt khi bạn rút phích cắm bàn phím và mô-đun vẫn cố ghi vào bộ đệm hiện không hợp lệ.

Bạn nên kiểm tra mã mới trên github , cái mà tôi đang cố gắng dọn sạch ngay bây giờ, để dễ biên dịch hơn với các kernel tùy ý và có khá nhiều sửa lỗi.

Ngoài ra, ghé qua IRC của chúng tôi, # lg4l trên freenode.


Này, cảm ơn vì đã phản hồi. Tôi không mong đợi bản vá sẽ không có lỗi. Trong thực tế, tôi đã hy vọng tôi có thể đóng góp ý nghĩa cho nó. Thực tế tôi nghĩ rằng tôi có một số thông tin tốt cho các bạn, mặc dù nó có thể đã cũ vì tôi không có cơ hội làm việc nhiều trong thời gian gần đây. Tôi sẽ dừng lại bởi irc khi tôi có cơ hội.
Falmarri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.