Godbach 发表于 2009-02-11 12:57

gdb调试ldd3中的scull.ko的问题

按照LDD3中的介绍,使用GDB调试一下scull.ko,测试结果如下:
# gdb scull.ko
GNU gdb Red Hat Linux (6.5-37.el5rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) add-symbol-file scull.ko 0xd0b85000 \
       -s .altinstr_replacement 0xd0b86642 \
       -s .altinstructions 0xd0b868ec \
       -s .bss 0xd0b89a00 \
       -s .data 0xd0b88400 \
       -s .fixup 0xd0b865f4 \
       -s .gnu.linkonce.this_module 0xd0b88800 \
       -s .rodata.str1.1 0xd0b86645 \
       -s .smp_locks 0xd0b867fc \
       -s .strtab 0xd0b87bd0 \
       -s .symtab 0xd0b87200 \
       -s __ex_table 0xd0b867c4 \
       -s __param 0xd0b86860 \
       -s __versions 0xd0b86900
add symbol table from file "scull.ko" at
      .text_addr = 0xd0b85000
      .altinstr_replacement_addr = 0xd0b86642
      .altinstructions_addr = 0xd0b868ec
      .bss_addr = 0xd0b89a00
      .data_addr = 0xd0b88400
      .fixup_addr = 0xd0b865f4
      .gnu.linkonce.this_module_addr = 0xd0b88800
      .rodata.str1.1_addr = 0xd0b86645
      .smp_locks_addr = 0xd0b867fc
      .strtab_addr = 0xd0b87bd0
      .symtab_addr = 0xd0b87200
      __ex_table_addr = 0xd0b867c4
      __param_addr = 0xd0b86860
      __versions_addr = 0xd0b86900
(y or n) y
Reading symbols from /mnt/hgfs/open_source/open_source/ldd3examples/scull/scull.ko...warning: section .strtab not found in /mnt/hgfs/open_source/open_source/ldd3examples/scull/scull.ko
warning: section .symtab not found in /mnt/hgfs/open_source/open_source/ldd3examples/scull/scull.ko
done.
(gdb) gdb scull_qset
Undefined command: "gdb".Try "help".
(gdb) p scull_qset
$1 = 1000
(gdb) p scull_devices
Cannot access memory at address 0x1024748b


测试的情况来看:可以读取普通的变量,如scull_qset。但是对于scull_devices这个数组的成员,只能读取到成员的地址,没法读取内容。
在加载符号的时候,出现了warning,
warning: section .symtab not found in /mnt/hgfs/open_source/open_source/ldd3examples/scull/scull.ko
不大明白是什么意思?

prolj 发表于 2009-02-11 13:21

/scull.ko...warning: section .strtab not found in /mnt/hgfs/open_source/open_source/ldd3examples/scull/scull.ko
warning: section .symtab not found in /mnt/hgfs/open_source/open_source/ldd3examples/scull/scull.ko
ELF 里面这两个节被去掉了?应该没有strip。

Godbach 发表于 2009-02-11 13:26

回复 #2 prolj 的帖子

LS的意思是执行一下strip?

prolj 发表于 2009-02-11 14:15

意思是没有strip,却少了两个节?
也许Makefile里面什么地方strip了,或者设计者故意设计的ko没有这两个section,猜测,如果Linux内核没有规定ko没有这两个section就应该是在什么地方被去掉了,找找看,共享一下经验

Godbach 发表于 2009-02-11 14:23

原帖由 prolj 于 2009-2-11 14:15 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
意思是没有strip,却少了两个节?
也许Makefile里面什么地方strip了,或者设计者故意设计的ko没有这两个section,猜测,如果Linux内核没有规定ko没有这两个section就应该是在什么地方被去掉了,找找看,共享一 ...

多谢。
首先查看了一下Makefile,应该没有执行strip:
ifneq ($(KERNELRELEASE),)
# call from kernel build system

scull-objs := main.o pipe.o access.o

obj-m        := scull.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) -I../include modules

endif



clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
        $(CC) $(CFLAGS) -M *.c > .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif


我在找找别的原因。。

dreamice 发表于 2009-02-11 16:23

不错,一直没用过GDB调试,呵呵

Godbach 发表于 2009-02-11 16:34

原帖由 dreamice 于 2009-2-11 16:23 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
不错,一直没用过GDB调试,呵呵

呵呵,我也是上周六看LDD3的时候,测试了一下。结果出现了上面的问题。而且用GDB调试还是有很多限制的。

dreamice 发表于 2009-02-11 16:36

回复 #7 Godbach 的帖子

我习惯直接printk,呵呵

Godbach 发表于 2009-02-11 16:58

原帖由 dreamice 于 2009-2-11 16:36 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
我习惯直接printk,呵呵
恩。我实际中也是printk使用的确实更多一些。

ljqy 发表于 2009-07-30 17:16

即便写驱动,调试时我尽量用buildin方式,这样用gdb定位bug比较方便
页: [1] 2
查看完整版本: gdb调试ldd3中的scull.ko的问题