上一篇介绍了“GDK7+NanoCode调试学习系列2–调试Linux内核之中断printk(vprtink_func)”,本篇继续学习,将尝试使用NanoCode来中断Linux驱动i915,配合i915的符号和源代码来中断相关函数。

本调试目标机Linux内核版本为5.3.0-62-generic。

准备工作:

  1. 上一篇已经介绍了如何下载对应版本Linux的符号和源码(如何没有下载,请参考上一篇步骤);

  2. 假设已经下载完Linux符号和源码(请参考上一篇步骤);

  3. 复制Linux源码和符号到主机目录(请参考上一篇步骤);

  4. 复制drm.ko和i915.ko到主机目录,和Linu符号同目录(c:\temp),drm.ko和i915.ko分别为:/usr/lib/debug/lib/modules/5.3.0-62-generic/kernel/drivers/gpu/drm/drm.ko和/usr/lib/debug/lib/modules/5.3.0-62-generic/kernel/drivers/gpu/drm/i915/i915.ko。

开始调试:

  1. 启动NanoCode,选择内核调试,等待“break”按钮变亮,并中断目标Ubuntu系统,可参中断Ubuntu(GDK7+NanoCode调试学习系列1–环境搭建);

  1. 中断下来之后,开始执行指令:

    .sympath+ c:\temp // 添加符号路径
    .srcpath+ d:\linux-src\linux-source-5.3.0 // 添加源码路径

.reload // 重新加载
  1. .reload之后,执行lm l可以看来vmlinux内核符号已经加载。reload不会自动加载所有的符号,一般都是延时加载,或者说自动加载当前堆栈的模块。因为当前模块肯定有vmlinux,所以vmlinux被自动加载了。

  2. 同时,源码文件也被自动打开了。

  1. 此时,我们可以通过x命令来查找i915的符号了,这样i915的符号会被加载了。

    x i915!flush_render // 通配查找flush_render函数
    bp ffffffff`c04a4330 // 下断点
    bl // 列出断点
    lm l // 查看加载的模块

  1. 断点已经设置成功,执行g重新跑起来,很快会被断点中断下来,同时源码也自动打开了。

使用kL查看当前调用堆栈,drm的符号也自动加载了。

  1. 此时,可以使用其他命令来调试了~

总结:

  1. 中断i915函数

  2. 待续。。。

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