NULL 포인터가 나타나는 커널 모듈을 어떻게 디버깅합니까?


9

패치 에서 컴파일 한 커스텀 커널 모듈이 있는데 logitech G19다른 G 시리즈 장치들 사이 에서 키보드를 지원 합니다. 우분투의 매버릭 커널의 마스터 브랜치 (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 ]---

누구든지 이것을 디버깅하는 방법에 대해 올바른 방향으로 나를 가리킬 수 있습니까?

stacktrace는 hid-g15 드라이버가 아니라 hid-gfb 드라이버라고 믿고 키보드의 LCD에 대한 프레임 버퍼를 만듭니다. 내 디스플레이 / 콘솔을 잠그지 만 커널 코드를 파고 들기 때문에 실제로는 아무 의미가 없습니다. 그것의 대부분은 어셈블리와 매크로 함수입니다.

내 새 코드와 관련된 stacktrace의 마지막 기능은 gfb_fb_imageblit입니다. 그 기능의 전체는

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

스택 추적을 잘못 읽습니까? 뭔가 빠졌습니까? 이것을 디버깅하는 방법에 대한 팁이 있습니까?


몇 년 전에 필자 pl2303는 코드를주의 깊게 읽고 NULL 포인터의 소스를 찾아 모듈 의 비슷한 버그를 해결했습니다 . (이 작은 수정 프로그램은 관리자 인 GregKH가 수행했습니다.) 아마도 디버거를 사용하여 커널과 함께 디버거를 사용하는 방법을 물어볼 수 있습니다. 또한 코드 관리자에게 문의하면 아이디어가있을 수 있습니다.
imz-Ivan Zakharyaschev

3
글쎄, 분명히 모듈이 작동하는 다른 사람들을 알고 있습니다. 그리고 저자가 아직 주위에 있는지 확실하지 않습니다. 커널과 함께 디버거를 사용하는 것이 좋은 지적이라고 생각합니다. 새로운 질문으로 물어 보거나 여기에 더 많은 답변을 얻을 때까지 기다려야합니까?
Falmarri

모듈을 사용할 수있는 것만 신경 쓰면 (그리고 커널과 작동하도록 모듈을 수정하여 자신과 커뮤니티를 도울 필요는 없습니다) "다른 사람"과 동일한 커널 버전 및 구성으로 사용해보십시오.
imz-Ivan Zakharyaschev

@ imz : 글쎄, 실제로 사용되는 것에 대한 언급은 하나만 보았고 정확한 커널과 구성을 알지 못했고 meerkat 커널로 빌드되었다는 것만 알았습니다. 그래도 배우고 싶습니다. 시간이있을 때 이것을 디버깅하기 시작할 것입니다.
Falmarri

디버깅을 직접 수행하면 궁극적으로 질문에 대한 가장 좋은 답변 중 하나를 여기에 게시 할 수 있습니다!
imz-Ivan Zakharyaschev

답변:


10

먼저, 모듈을 디버그 하시겠습니까? gdb에로드 할 수 있는지 확인하면 관련 변수를 사용하거나 가까운 변수를 사용하는 선을 똑바로 가리킬 수 있습니다 .

아, 기사가 유용 할 것입니다


글쎄, 나는 디버깅 단계를 거쳐 stacktrace를 따랐다. 그러나 컴퓨터를 재부팅하고 모듈을 다시로드하면 방금 작동했습니다. 그래서 무엇이 잘못되었는지 모르겠습니다.
Falmarri

좋은 거래. 다행이 어떤 이유에서 일하고있어
RobotHumans

1
디버거에서만 작동합니까? 다른 거 변경 했어?
vonbrand

7

나는 그 패치의 저자 중 하나입니다. 죄송합니다. :)

일반적으로 이와 같은 null 포인터를 찾으려면 null (= 0) 포인터를 찾을 때까지 printks를 삽입 한 다음 이유를 찾을 때까지 소스 코드를 읽습니다.

그러나이 경우 프레임 버퍼 콘솔을 비활성화해야한다는 것을 알고 있거나 콘솔이 표시 될 때만 트리거되는이 불쾌한 버그가 발생합니다. 또는 키보드를 분리 할 때 발생하는 버그 일 수 있으며 모듈은 여전히 ​​유효하지 않은 버퍼에 쓰려고 시도합니다.

github 의 새 코드를 확인해야합니다. 지금 정리하려고하고 임의의 커널에 대해 쉽게 컴파일 할 수 있으며 버그 수정이 거의 없습니다.

또한 IRC (Freenode)의 # lg4l을 사용하십시오.


응답 해 주셔서 감사합니다. 패치에 버그가 없을 것으로 예상했습니다. 사실, 나는 그것에 의미있게 기여할 수 있기를 바랐습니다. 사실 나는 최근에 많은 일을 할 기회가 없었기 때문에 나이가 들었더라도 당신들에게 좋은 정보가 있다고 생각합니다. 기회를 잡으면 irc에 들러갑니다.
Falmarri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.