Linux kernel 如何调试linux内核模块?

Linux kernel 如何调试linux内核模块?,linux-kernel,kernel-module,Linux Kernel,Kernel Module,我遵循这个link()来调试内核模块 但是.init.text部分的内容都是零。因此,我无法看到导致这次碰撞的确切路线 我的/var/log/syslog输出是: Aug 1 18:07:33 manik kernel: [ 149.855117] BUG: unable to handle kernel paging request at 0000000000ef6850 Aug 1 18:07:33 manik kernel: [ 149.855136] IP: [<fffff

我遵循这个link()来调试内核模块

但是
.init.text
部分的内容都是零。因此,我无法看到导致这次碰撞的确切路线

我的
/var/log/syslog
输出是:

Aug  1 18:07:33 manik kernel: [  149.855117] BUG: unable to handle kernel paging request at 0000000000ef6850
Aug  1 18:07:33 manik kernel: [  149.855136] IP: [<ffffffffc07577b0>] register_scard+0x240/0x660 [scard]
Aug  1 18:07:33 manik kernel: [  149.855143] PGD 0
Aug  1 18:07:33 manik kernel: [  149.855146] Oops: 0000 [#1] SMP
Aug  1 18:07:33 manik kernel: [  149.855151] Modules linked in: scard(POE+) kmikohn(OE) fmon(OE) khcd(OE) kcid(OE) kspi(POE) kpwrfail(OE) snd_usb_audio input_leds joydev hid_multitouch snd_usbmidi_lib i2c_ocores intel_rapl x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm mk7i_pci(OE) snd_hda_codec_hdmi irqbypass crct10dif_pclmul crc32_pclmul cryptd snd_soc_rt5640 snd_soc_rl6231 snd_soc_core lpc_ich snd_hda_intel snd_hda_codec snd_compress ac97_bus snd_pcm_dmaengine snd_hda_core ie31200_edac snd_hwdep edac_core shpchp snd_pcm snd_seq_midi snd_seq_midi_event snd_rawmidi snd_seq 8250_fintek snd_seq_device snd_timer dw_dmac dw_dmac_core elan_i2c snd soc_button_array snd_soc_sst_acpi spi_pxa2xx_platform soundcore i2c_designware_platform i2c_designware_core 8250_dw mac_hid parport_pc ppdev lp parport autofs4 nouveau mxm_wmi i915 wmi i2c_algo_bit ttm ahci drm_kms_helper e1000e syscopyarea sysfillrect sysimgblt ptp fb_sys_fops libahci pps_core drm sdhci_acpi i2c_hid sdhci video fjes hid_generic usbhid hid
Aug  1 18:07:33 manik kernel: [  149.855281] CPU: 0 PID: 3749 Comm: modprobe Tainted: P        W IOE   4.4.0-31-generic #50
Aug  1 18:07:33 manik kernel: [  149.855286] Hardware name: ADLINK Technology Inc. Express-HL./SHARKBAY, BIOS 1.14 01/01/2013
Aug  1 18:07:33 manik kernel: [  149.855290] task: ffff880233c844c0 ti: ffff8800b354c000 task.ti: ffff8800b354c000
Aug  1 18:07:33 manik kernel: [  149.855294] RIP: 0010:[<ffffffffc07577b0>]  [<ffffffffc07577b0>] register_scard+0x240/0x660 [scard]
Aug  1 18:07:33 manik kernel: [  149.855302] RSP: 0018:ffff8800b354fc30  EFLAGS: 00010006
Aug  1 18:07:33 manik kernel: [  149.855306] RAX: 0000000000ef6850 RBX: ffff8800b8b59400 RCX: 0000000000000006
Aug  1 18:07:33 manik kernel: [  149.855310] RDX: 0000000000000000 RSI: 0000000000000046 RDI: ffff880240a0dc70
Aug  1 18:07:33 manik kernel: [  149.855314] RBP: ffff8800b354fc60 R08: 000000000000000a R09: 0000000000000786
Aug  1 18:07:33 manik kernel: [  149.855318] R10: ffffea0008cde400 R11: 0000000000000786 R12: 0000000000000000
Aug  1 18:07:33 manik kernel: [  149.855322] R13: ffff8800b8b59400 R14: 0000000000000000 R15: 0000000000000000
Aug  1 18:07:33 manik kernel: [  149.855326] FS:  00007f94b559a700(0000) GS:ffff880240a00000(0000) knlGS:0000000000000000
Aug  1 18:07:33 manik kernel: [  149.855333] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Aug  1 18:07:33 manik kernel: [  149.855337] CR2: 0000000000ef6850 CR3: 00000000b34cd000 CR4: 00000000001406f0
Aug  1 18:07:33 manik kernel: [  149.855341] Stack:
Aug  1 18:07:33 manik kernel: [  149.855343]  ffff8800b8b59480 ffffffff81e11080 ffff880231952a20 0000000000000000
Aug  1 18:07:33 manik kernel: [  149.855351]  ffffffffc0048000 ffff8800b3614a80 ffff8800b354fc88 ffffffffc0048045
Aug  1 18:07:33 manik kernel: [  149.855358]  0000000000000000 0000f42400000010 0000000095f455c1 ffff8800b354fd08
Aug  1 18:07:33 manik kernel: [  149.855366] Call Trace:
Aug  1 18:07:33 manik kernel: [  149.855370]  [<ffffffffc0048000>] ? 0xffffffffc0048000
Aug  1 18:07:33 manik kernel: [  149.855375]  [<ffffffffc0048045>] scard_module_init+0x45/0x1000 [scard]
Aug  1 18:07:33 manik kernel: [  149.855381]  [<ffffffff81002123>] do_one_initcall+0xb3/0x200
Aug  1 18:07:33 manik kernel: [  149.855388]  [<ffffffff811cf630>] ? __vunmap+0xc0/0xe0
Aug  1 18:07:33 manik kernel: [  149.855393]  [<ffffffff811eb813>] ? kmem_cache_alloc_trace+0x183/0x1f0
Aug  1 18:07:33 manik kernel: [  149.855398]  [<ffffffff811ec60a>] ? kfree+0x13a/0x150
Aug  1 18:07:33 manik kernel: [  149.855404]  [<ffffffff8118c763>] do_init_module+0x5f/0x1cf
Aug  1 18:07:33 manik kernel: [  149.855410]  [<ffffffff8110a1c7>] load_module+0x1667/0x1c00
Aug  1 18:07:33 manik kernel: [  149.855415]  [<ffffffff81106770>] ? __symbol_put+0x60/0x60
Aug  1 18:07:33 manik kernel: [  149.855420]  [<ffffffff81213150>] ? kernel_read+0x50/0x80
Aug  1 18:07:33 manik kernel: [  149.855425]  [<ffffffff8110a9a4>] SYSC_finit_module+0xb4/0xe0
Aug  1 18:07:33 manik kernel: [  149.855430]  [<ffffffff8110a9ee>] SyS_finit_module+0xe/0x10
Aug  1 18:07:33 manik kernel: [  149.855435]  [<ffffffff8182dd72>] entry_SYSCALL_64_fastpath+0x16/0x71
Aug  1 18:07:33 manik kernel: [  149.855439] Code: 48 c7 c7 a0 87 75 c0 e8 26 4b a3 c0 48 c7 c7 90 83 75 c0 4c 8b 7b 10 e8 16 4b a3 c0 48 8b 05 d8 7d e8 ff 05 50 08 00 00 4c 01 f8 <44> 8b 28 48 c7 c7 d8 83 75 c0 41 83 e5 08 e8 f4 4a a3 c0 c7 83
Aug  1 18:07:33 manik kernel: [  149.855510] RIP  [<ffffffffc07577b0>] register_scard+0x240/0x660 [scard]
Aug  1 18:07:33 manik kernel: [  149.855516]  RSP <ffff8800b354fc30>
Aug  1 18:07:33 manik kernel: [  149.855518] CR2: 0000000000ef6850
Aug  1 18:07:33 manik kernel: [  149.861630] ---[ end trace 80da0b0ded5071b5 ]---

这一行在32位linux内核上运行良好。上述崩溃发生在64位linux内核4.4.0系列(运行Ubuntu16.0.4 LTS)上。

我假设您尝试运行的模块名为“scard”

如果是这样,您可以尝试使用objdump查看代码中发生以下情况的位置: [552.027690][]scard\u模块初始化+0x45/0x1000[scard]

您应该找到包含此函数的C文件(假设它是scard.C),然后在其o文件上运行objudump:objdump-S[path to scard.o]| less

然后搜索scard_module_init函数,查看十六进制地址并添加0x45-跳到objdump中的此行,您将看到导致异常的最后一条运行的装配线


从回溯中我们可以看到,它应该是一些可能试图访问无效内存的打印。

我假设您尝试运行的模块被称为“scard”

如果是这样,您可以尝试使用objdump查看代码中发生以下情况的位置: [552.027690][]scard\u模块初始化+0x45/0x1000[scard]

您应该找到包含此函数的C文件(假设它是scard.C),然后在其o文件上运行objudump:objdump-S[path to scard.o]| less

然后搜索scard_module_init函数,查看十六进制地址并添加0x45-跳到objdump中的此行,您将看到导致异常的最后一条运行的装配线


从回溯中我们可以看到,它应该是一些可能试图访问无效内存的打印。

另一个分析内核的有用工具是
crash
。它可以用来分析内核内核转储或活动系统。以下是一个很好的开端:


另一个分析内核的有用工具是
crash
。它可以用来分析内核内核转储或活动系统。以下是一个很好的开端:


我使用命令
objdump-S scard.o
生成程序集。但是我找不到符号
scard\u module\u init
@Monku,它位于一个特殊的区域。如果您显示整个模块的源代码,效果会更好。我使用命令
objdump-S scard.o
生成程序集。但是我找不到符号
scard\u module\u init
@Monku,它位于一个特殊的区域。最好显示整个模块的源代码。
uint8_t old_cmd = ioread32( base + SC_REG_ICC_COMMAND );