我一直在尝试学习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
的内存
任何人都可以帮助我解决什么问题以及我还需要添加什么?
答案 0 :(得分:2)
您必须提供模块部分的正确地址。
$ cat /sys/module/YOURMODULE/sections/.text
0xYOURMODULEADDRESS
并加载符号:
(gdb) add-symbol-file hello_driver.ko 0xYOURMODULEADDRESS
您可能需要根据变量所在的部分添加更多部分地址。请参阅gdb中的help add-symbol-file