【问题标题】:"add-symbol-file" can't recognize .bss & .data symbols when using kgdb to debug kernel modules使用 gdb 调试内核模块时,“add-symbol-file”无法识别 .bss 和 .data 符号
【发布时间】:2021-03-02 22:25:30
【问题描述】:

我正在尝试将 gdb 8.3.1 用于 RPI-4 板上的内核模块。

当我使用命令add-symbol-file 添加.bss.data 部分时,它不起作用。

内核版本为 5.4,CONFIG_DEBUG_INFO 已开启。 我在下面列出了简单的代码、dmesg 和 kgdb 信息。 如果您有任何想法,请给我一些建议。

模块代码:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

volatile int my_var_1=5;
volatile int my_var_2;

static int __init my_test_init(void)
{
        printk("&my_var_1 = %lx\n", &my_var_1);
        printk("my_var_1 = %lx\n", my_var_1);
        printk("&my_var_2 = %lx\n", &my_var_2);
        printk("my_var_2 = %lx\n", my_var_2);

        return 0;
}

static void __exit my_test_exit(void)
{
        printk("my_test_exit\n");

}

module_init(my_test_init);
module_exit(my_test_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("This is a test module");

dmesg 输出:

pi@raspberrypi:~$ dmesg
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[    0.000000] Linux version 5.4.83-v8+ (ken@ken-Inspiron-5458) (gcc version 7.5.0 (Linaro GCC 7.5-2019.12)) #3 SMP PREEMPT Wed Jan 20 05:57:0
0 CST 2021
[    0.000000] Machine model: Raspberry Pi 4 Model B Rev 1.4
...
[  923.192915] &my_var_1 = ffffffc008fa0000
[  923.192919] my_var_1 = 5
[  923.192923] &my_var_2 = ffffffc008fa03c0
[  923.192926] my_var_2 = 0
pi@raspberrypi:~$ sudo su
root@raspberrypi:/home/pi# cat /sys/module/my_test/sections/.bss
0xffffffc008fa03c0
root@raspberrypi:/home/pi# cat /sys/module/my_test/sections/.data
0xffffffc008fa0000
root@raspberrypi:/home/pi# [ 1095.449458] sysrq: DEBUG
Entering kdb (current=0xffffffc010ebf780, pid 0) on processor 0 due to Keyboard Entry
[0]kdb>

kgdb: bt, 它识别文本:

(gdb) bt
#0  arch_kgdb_breakpoint () at ../arch/arm64/include/asm/kgdb.h:21
#1  kgdb_breakpoint () at ../kernel/debug/debug_core.c:1138
#2  0xffffffc0101c45e4 in sysrq_handle_dbg (key=<optimized out>) at ../kernel/debug/debug_core.c:901
#3  0xffffffc01069305c in __handle_sysrq (key=103, check_mask=true) at ../drivers/tty/sysrq.c:556
#4  0xffffffc010693184 in handle_sysrq (key=103) at ../drivers/tty/sysrq.c:588
#5  0xffffffc0106b9b64 in uart_handle_sysrq_char (port=<optimized out>, ch=<optimized out>) at ../include/linux/serial_core.h:469
#6  pl011_fifo_to_tty (uap=0xffffff81f4879080) at ../drivers/tty/serial/amba-pl011.c:355
#7  0xffffffc0106ba90c in pl011_rx_chars (uap=<optimized out>) at ../drivers/tty/serial/amba-pl011.c:1380
#8  pl011_int (irq=<optimized out>, dev_id=0xffffff81f4879080) at ../drivers/tty/serial/amba-pl011.c:1536
#9  0xffffffc0101513f0 in __handle_irq_event_percpu (desc=0xffffff81f5444400, flags=0xffffffc010003ed4) at ../kernel/irq/handle.c:149
#10 0xffffffc010151688 in handle_irq_event_percpu (desc=0xffffff81f5444400) at ../kernel/irq/handle.c:189
#11 0xffffffc01015172c in handle_irq_event (desc=0xffffff81f5444400) at ../kernel/irq/handle.c:206
#12 0xffffffc010156f98 in handle_fasteoi_irq (desc=0xffffff81f5444400) at ../kernel/irq/chip.c:725
#13 0xffffffc010150114 in generic_handle_irq_desc (desc=<optimized out>) at ../include/linux/irqdesc.h:156
#14 generic_handle_irq (irq=14) at ../kernel/irq/irqdesc.c:644
#15 0xffffffc01015096c in __handle_domain_irq (domain=0xffffff81f5c10800, hwirq=14, lookup=true, regs=0xffffffc010eb3d50)
    at ../kernel/irq/irqdesc.c:681
#16 0xffffffc010081af0 in handle_domain_irq (regs=<optimized out>, hwirq=<optimized out>, domain=<optimized out>)
    at ../include/linux/irqdesc.h:174
#17 gic_handle_irq (regs=0xffffffc010eb3d50) at ../drivers/irqchip/irq-gic.c:364
#18 0xffffffc010083cbc in el1_irq () at ../arch/arm64/kernel/entry.S:670
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

kgdb: 打印

(gdb) monitor lsmod
Module                  Size  modstruct     Used by
my_test                16384  0xffffffc008fa0040    0  (Live) 0xffffffc008f9e000 [ ]
(gdb) add-symbol-file ~/Study/Linux_Drv/My_Test/my_test.ko 0xffffffc008f9e000 -s .bss 0xffffffc008fa03c0 -s .data 0xffffffc008fa0000
add symbol table from file "/home/ken/Study/Linux_Drv/My_Test/my_test.ko" at
        .text_addr = 0xffffffc008f9e000
        .bss_addr = 0xffffffc008fa03c0
        .data_addr = 0xffffffc008fa0000
(y or n) y  <== gdb understand the sections above
Reading symbols from /home/ken/Study/Linux_Drv/My_Test/my_test.ko...
(gdb) p my_var_1
Cannot access memory at address 0x0 <== gdb still not recognize the sections
(gdb) p my_var_2
Cannot access memory at address 0x0
(gdb) x /2x 0xffffffc008fa0000
0xffffffc008fa0000 <my_var_1>:  0x00000005  0x00000000 <== my_var_1 exist but gdb can't find out
(gdb) x /2x 0xffffffc008fa03c0
0xffffffc008fa03c0 <my_var_2>:  0x00000000  0x00000000 <== my_var_2 exist but gdb can't find out
(gdb) p jiffies      <==inline symbol could be recognized
$3 = 4295166156

【问题讨论】:

  • Stack Overflow 上的代码可以使用Ctrl+K{} 轻松格式化。无需在每行末尾插入&lt;br/&gt;
  • 您好 Tsyvarev,感谢您的信息。下次我会尝试这种方式分享我的信息。

标签: c linux debugging linux-kernel gdb


【解决方案1】:

我用的是gdb10.1,问题解决了。

(gdb) add-symbol-file /home/ken/Study/Linux_Drv/My_Test/my_test.ko 0xffffffc008f21000 -s
.bss 0xffffffc008f233c0 -s .data 0xffffffc008f23000
add symbol table from file "/home/ken/Study/Linux_Drv/My_Test/my_test.ko" at
.text_addr = 0xffffffc008f21000
.bss_addr = 0xffffffc008f233c0
(y or n) y
Reading symbols from /home/ken/Study/Linux_Drv/My_Test/my_test.ko...

我打印了变量,现在可以正常工作了。

(gdb) p &my_var_1
$1 = (volatile int *) 0xffffffc008f23000 <my_var_1>
(gdb) p &my_var_2
$2 = (volatile int *) 0xffffffc008f233c0 <my_var_2>
(gdb) p my_var_1
$3 = 5
(gdb) p my_var_2
$4 = 0

希望这些信息对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 2017-07-20
    • 2015-11-18
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多