Linux内核调试警告:未加载符号表

时间:2015-12-29 05:41:20

标签: linux linux-kernel kernel-module

我一直在尝试学习Linux内核调试,并创建了一个带有一些导出符号的示例模块。

int rday_3 = 30; EXPORT_SYMBOL(rday_3);

执行insmod之后,我能够看到我的init模块的dmesg,命令cat /proc/kallsyms给我加载了符号。但是当我运行命令gdb /boot/vmlinuz-3.5.0-23-generic /proc/kcore时,它会发出警告

  

从/boot/vmlinuz-3.5.0-23-generic...读取符号(找不到调试符号)...完成。

     

警告:核心文件可能与指定的可执行文件不匹配。   [新流程1]   核心是由`BOOT_IMAGE = / boot / vmlinuz-3.5.0-23-generic root = UUID = FE4E68E74E689A63 loop = / ubunt'生成的。

     

0 0x00000000 in ?? ()

     

(gdb)whatis rday_3

     

未加载符号表。使用"文件"命令。

然后我在调试模式下在Makefile生成的.ko文件中添加了调试标志。我添加了命令add-symbol-file hello_driver.ko 0x00。我得到了结果

  

(gdb)whatis rday_3

     

type = int

     

(gdb)p rday_3

     

无法访问地址0x0

的内存

任何人都可以帮助我解决什么问题以及我还需要添加什么?

1 个答案:

答案 0 :(得分:2)

您必须提供模块部分的正确地址。

$ cat /sys/module/YOURMODULE/sections/.text
0xYOURMODULEADDRESS

并加载符号:

(gdb) add-symbol-file hello_driver.ko 0xYOURMODULEADDRESS

您可能需要根据变量所在的部分添加更多部分地址。请参阅gdb中的help add-symbol-file