上篇介绍了“GDK7+NanoCode调试学习系列1--环境搭建”(https://blog.csdn.net/henly1217/article/details/107657070);
本篇继续学习,将尝试使用NanoCode来调试Linux内核函数,配合Linux的符号和源代码来中断printk函数。
1. 下载对应版本的Linux符号,按照张银奎老师的步骤(http://advdbg.org/blogs/advdbg_system/articles/7147.aspx)来下载符号,执行到第4步就可以下载linux符号了,Linux符号在/usr/lib/debug/boot目录下,其他ko的符号在/usr/lib/debug/lib/modules/xxxx下。
2. 下载对应版本的Linux源代码,修改/etc/apt/sources.list,这里使用了清华源(https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/);修改完之后,
sudo apt-get update // 更新
apt search linux-source // 查找匹配的
sudo apt install linux-source-x.x.x // 安装相应的源码
cd /usr/src/linux-source-x.x.x // 找到源码包linux-source-x.x.x.tar.bz2
3. 下载完对应的符号和源码包。
注:由于我的Linux内核升级到5.3.0-62-generic版本,
1)下载的Linux符号是(/usr/lib/debug/boot/vmlinux-5.3.0-62-generic),
2)其他ko的符号在(/usr/lib/debug/lib/modules/5.3.0-62-generic)下;
3)源码是(/usr/src/linux-source-5.3.0/linux-source-5.3.0.rar.bz2)
4. 将内核符号(/usr/lib/debug/boot/vmlinux-5.3.0-62-generic)复制到调试主机目录下并改名为vmlinux(比如c:\temp\vmlinux);
5. 和源码包(/usr/src/linux-source-5.3.0/linux-source-5.3.0.rar.bz2)复制到主机,并解压到目录(比如d:\linux-src\linux-source-5.3.0)
1. 启动NanoCode, 选择内核调试,并中断目标Ubuntu系统,可参考上一篇中断Ubuntu(https://blog.csdn.net/henly1217/article/details/107657070#t8);
2. 中断下来之后,开始执行指令:
.sympath+ c:\temp // 添加符号路径
.reload // 重新加载
lm // 显示模块
3. 此时Linux的符号已经加载成功(lk是内核缩写),可以执行一下x指令来显示调试符号;
x lk!printk
x lk!vprintk_func
4. 然后可以使用bp/bm下断点了
bp ffffffff`ab30d0d0
5. 这里下了vprintk_func函数的断点,在执行前,在设置一下源码路径
.srcpath+ d:\linux-src\linux-source-5.3.0
6. 然后执行g跑起来;
7. 此时,我通过一个helloworld的ko来调用了printk函数,成功断下(需要耐心等待),此时源码路径也自动打开;
k // 查看栈回溯
k P // 查看栈回溯,带参数,可以看到fmt的数据
略带遗憾:栈回溯显示的不是很完整,需要进一步完善。
1. 下载Linux符号和源码
2. 中断内核函数
3. 待续。。。