上篇介绍了“GDK7+NanoCode调试学习系列1–环境搭建”,本篇继续学习,将尝试使用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 // 显示模块

  1. 此时Linux的符号已经加载成功(lk是内核缩写),可以执行一下x指令来显示调试符号;

    x lk!printk

    x lk!vprintk_func

  1. 然后可以使用bp/bm下断点了

    bp ffffffff`ab30d0d0

  1. 这里下了vprintk_func函数的断点,在执行前,在设置一下源码路径

    .srcpath+ d:\linux-src\linux-source-5.3.0

  2. 然后执行g跑起来;

  3. 此时,我通过一个helloworld的ko来调用了printk函数,成功断下(需要耐心等待),此时源码路径也自动打开;

    k // 查看栈回溯

    k P // 查看栈回溯,带参数,可以看到fmt的数据

略带遗憾:栈回溯显示的不是很完整,需要进一步完善。

总结:

  1. 下载Linux符号和源码

  2. 中断内核函数

  3. 待续。。。

作者:沈根成  创建时间:2024-03-20 13:23
最后编辑:沈根成  更新时间:2024-04-26 11:30