LINUX.ORG.RU

Отладка модуля ядра

 , , ,


0

1

Есть один проектик, являющийся модулем ядра. При работе с ним в ядрах больше 4.1 ядро кричит:

[   74.613547] EPRD : version    : 0.5.0
[  152.947646] EPRD : barriers   : enabled
[  152.947671] EPRD : eprda size : 1073741824
[  152.947703] EPRD : cache size : 1024
[  152.948160] BUG: unable to handle kernel NULL pointer dereference at  
          (null)
[  152.948232] IP: [<          (null)>]           (null)
[  152.948272] PGD 0
[  152.948295] Oops: 0010 [#1] PREEMPT SMP
[  152.948333] Modules linked in: eprd(O) fuse nct6775 hwmon_vid intel_rapl iosf_mbi x86_pkg_temp_thermal intel_powerclamp joydev mousedev coretemp hid_generic kvm_intel usbhid hid r8169 kvm mii crct10dif_pclmul snd_hda_codec_via snd_hda_codec_generic eeepc_wmi asus_wmi i915 evdev sparse_keymap drm_kms_helper drm led_class iTCO_wdt crc32_pclmul iTCO_vendor_support rfkill crc32c_intel snd_hda_intel ghash_clmulni_intel mac_hid cryptd snd_hda_controller serio_raw snd_hda_codec shpchp intel_gtt snd_hda_core snd_hwdep snd_pcm snd_timer i2c_algo_bit i2c_i801 psmouse snd i2c_core pcspkr soundcore mei_me mei lpc_ich video processor button wmi sch_fq_codel ip_tables x_tables ext4 crc16 mbcache jbd2 sr_mod cdrom sd_mod atkbd libps2 ahci libahci libata ehci_pci scsi_mod ehci_hcd usbcore usb_common i8042 serio

[  152.948870] CPU: 1 PID: 1312 Comm: eprda Tainted: G           O    
4.1.5-1-ARCH #1
[  152.948904] Hardware name: System manufacturer System Product 
Name/P8H61-MX, BIOS 0702 03/23/2012
[  152.948973] task: ffff8801ac43f010 ti: ffff88018e850000 task.ti: 
ffff88018e850000
[  152.949013] RIP: 0010:[<0000000000000000>]  [<          (null)>]      
      (null)
[  152.949045] RSP: 0018:ffff88018e853d90  EFLAGS: 00010292
[  152.949068] RAX: ffffffff8161f600 RBX: ffff88018e854000 RCX: ffff88018e853da0
[  152.949096] RDX: 0000000000001000 RSI: ffff8801b866c020 RDI: ffff880084754400
[  152.949124] RBP: ffff88018e853dd8 R08: ffffffff8160a300 R09: ffff8801b866c000
[  152.949152] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000001000
[  152.949179] R13: 0000000000000000 R14: ffff8801b866c000 R15: ffffffffffffffff
[  152.949208] FS:  0000000000000000(0000) GS:ffff8801bfa80000(0000) knlGS:0000000000000000
[  152.949240] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  152.949286] CR2: 0000000000000000 CR3: 000000000180b000 CR4: 00000000000406e0
[  152.949337] Stack:
[  152.949355]  ffffffffa05be0e6 ffff88018e853dd8 0000000000000000 ffff88018e8fe000
[  152.949395]  0000000000000000 ffff8801b866c020 0000000000000000 ffff8801b866c000
[  152.949433]  ffff880096056e00 ffff88018e853eb8 ffffffffa05bf4cb ffff88018e853e70
[  152.949472] Call Trace:
[  152.949491]  [<ffffffffa05be0e6>] ? eprd_file_read+0x46/⁠0xa0 [eprd]
[  152.949521]  [<ffffffffa05bf4cb>] eprd_thread+0x60b/⁠0xb40 [eprd]
[  152.949552]  [<ffffffff810bc6d0>] ? wake_atomic_t_function+0x60/⁠0x60
[  152.949582]  [<ffffffffa05beec0>] ? determine_iotype+0xb0/⁠0xb0 [eprd]
[  152.949612]  [<ffffffff81097818>] kthread+0xd8/⁠0xf0
[  152.949637]  [<ffffffff81097740>] ? kthread_worker_fn+0x170/⁠0x170
[  152.949667]  [<ffffffff8158c322>] ret_from_fork+0x42/⁠0x70
[  152.949692]  [<ffffffff81097740>] ? kthread_worker_fn+0x170/⁠0x170
[  152.949718] Code:  Bad RIP value.
[  152.949748] RIP  [<          (null)>]           (null)
[  152.949771]  RSP <ffff88018e853d90>
[  152.949786] CR2: 0000000000000000
[  152.967569] -⁠-⁠-⁠[ end trace a0ce5363667b9dc4 ]-⁠-⁠-⁠

Собственно, вопрос. Что надо включить в ядре/добавить в код/параметры gcc для того, чтобы выводилось больше информации. Или чтобы можно было с gdb как-нибудь отдебажить работу функций модуля.

С дебагом на таком уровне мало знаком, так что не обессудьте, если вопросы мои глупы.


посмотрите на функцию eprd_file_read

arto ★★ ()
Ответ на: комментарий от arto

Да я бы с радостью, только она не из двух строк состоит, да и вызывается не один раз. Хотя бы номер строки получить было бы здорово. А по возможности - проинспектить получаемые значения.

alextk ()
Последнее исправление: alextk (всего исправлений: 1)
Ответ на: комментарий от alextk

первое, что напрашивается: можно пораскидать по функции printk(«уникальная строчка»), и локализовать строку с ошибкой

// и там что-то с тредом нехорошее происходит

metawishmaster ★★★ ()
Последнее исправление: metawishmaster (всего исправлений: 1)
Ответ на: комментарий от metawishmaster

Окей, как вариант. Попробую.

Только одно «но»: printk сразу flush-ится? Не будет такого, что он не успеет выкинуть текст, зато ошибка случится?

alextk ()
Ответ на: комментарий от alextk

не должно, только '\n' в конце строчки обязателен

ну и фиг знает, если ошибка вызвана тем, что тред уничтожается из другого места, например %)

metawishmaster ★★★ ()
Последнее исправление: metawishmaster (всего исправлений: 2)
Ответ на: комментарий от alextk

Только одно «но»: printk сразу flush-ится? Не будет такого, что он не успеет выкинуть текст, зато ошибка случится?

На практике случается.

Krieger_Od ★★ ()

eprd_file_read+0x46/⁠0xa0

Вот эта строка поможет понять, где вызов был. +0x46 от начала eprd_file_read. Если модуль с отладочной информацией собирал, можно через objdump -S modulename.ko открыть и посчитать, где эти +0x46 от начала <eprd_file_read>.

i-rinat ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.