"add-symbol-file" 使用 gdb 调试内核模块时无法识别 .bss 和 .data 符号
"add-symbol-file" can't recognize .bss & .data symbols when using kgdb to debug kernel modules
我正在尝试将 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
= 4295166156
我用的是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
= (volatile int *) 0xffffffc008f23000 <my_var_1>
(gdb) p &my_var_2
= (volatile int *) 0xffffffc008f233c0 <my_var_2>
(gdb) p my_var_1
= 5
(gdb) p my_var_2
= 0
希望这些信息对您有所帮助。
我正在尝试将 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
= 4295166156
我用的是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
= (volatile int *) 0xffffffc008f23000 <my_var_1>
(gdb) p &my_var_2
= (volatile int *) 0xffffffc008f233c0 <my_var_2>
(gdb) p my_var_1
= 5
(gdb) p my_var_2
= 0
希望这些信息对您有所帮助。