我正在使用连接到虚拟机串行端口的gdb来调试Linux内核。
我想知道是否有任何补丁/插件可以使 gdb 理解一些 Linux 内核的数据结构并使其“线程感知”?
我的意思是在 gdb 下我可以看到有多少个内核线程、它们的状态以及每个线程的堆栈信息。
最佳答案
libvmi
https://github.com/libvmi/libvmi
该项目执行“LibVMI:简化的虚拟机自省(introspection)”,听起来非常接近。
这个项目特别是https://github.com/Wenzel/pyvmidbg使用 libvmi 并提供了在其中调试 Windows 用户态应用程序表单的演示视频,没有内存冲突。
截至 2019 年 5 月,存在两个限制,但截至 2019 年 5 月,这两个限制都可以通过一些工作来克服:https://github.com/Wenzel/pyvmidbg/issues/24
- Linux内存解析尚未完成
- 需要 Xen
该项目的开发者也进一步回答:https://stackoverflow.com/a/56369454/895245
我认为,使用这些库来实现它是当今实现这一目标的最佳方式。
Linaro lkd-python
首先,这个 Linaro 页面声称有一个工作设置:https://wiki.linaro.org/LandingTeams/ST/GDB它允许您执行常见的线程操作,例如thread
、bt
等,但它依赖于GDB fork。我稍后会测试一下。 2016年,https://youtu.be/pqn5hIrz3A8不幸的是,它是用 C 语言实现的,而不是 Python 脚本,这样会更好并且可以避免 fork 。 lkd-python 的草图可以在以下位置找到:https://git.linaro.org/people/lee.jones/kieran.bingham/binutils-gdb.git/log/?h=lkd-python
Linux 内核树内 GDB 脚本 + 我的大脑
然后,我尝试看看可以使用 v4.17 的内核树内 Python 脚本 + 一些手动干预作为原型(prototype)来做什么,但还没有完全实现。
我已经使用这个highly automated QEMU + Buildroot setup进行了测试.
首先按照我在 How to debug the Linux kernel with GDB and QEMU? 中描述的过程进行操作让 GDB 工作。
然后,如所述:How to debug Linux kernel modules with QEMU?运行 GDB:
gdb -ex add-auto-load-safe-path /full/path/to/linux/kernel
这会从 scripts/gdb
加载树内 GDB Python 脚本。
其中一个脚本提供:
lx-ps
其中列出了以下格式的所有线程:
0xffff88000ed08000 1 init
0xffff88000ed08ac0 2 kthreadd
第一个字段是 task_struct
结构的地址,因此我们可以通过以下方式查看整个结构:
p (struct task_struct)*0xffff88000ed08000
理论上,这应该允许我们获得有关该过程的任何我们想要的信息。
现在我想找到电脑。对于ARM,我见过:Find program counter of process in kernel我尝试过:
task_pt_regs((struct thread_info *)((struct task_struct)*0xffffffc00e8f8000))->uregs[ARM_pc]
但是task_pt_regs
是一个#define
并且GDB无法在没有-ggdb3
的情况下看到定义:How do I print a #defined constant in GDB?哪些显然没有设置?
梦想:GDB 线程感知 Python 扩展 API
https://sourceware.org/pipermail/gdb/2017-March/046559.html
目前,我认为使用 python 实现这一点的唯一方法是实现您想要支持的每个命令的自定义版本:
- xxx-线程:列表
- xxx-thread:更改当前线程
- xxx-p:打印当前线程
但我们真正想要的是拥有一个 GDB api,其中 python 脚本仅提供所有 GDB 命令透明工作所需的最少参数(线程信息
、线程 N
等等)。
API 基本上只需要:
- 列出话题
- 更改为线程
- 提供给定线程的寄存器
我认为,其他一切都可以基于这些而发挥作用。然后,Linux 内核将能够维护自己的树内 Python 提供程序,该提供程序适用于 Linux 内核,并且类似地适用于任何其他操作系统。
关于debugging - Linux 内核的线程感知 gdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9561546/