debugging - Linux 内核的线程感知 gdb

标签 debugging gdb linux-kernel kernel

我正在使用连接到虚拟机串行端口的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它允许您执行常见的线程操作,例如threadbt等,但它依赖于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/

相关文章:

linux - 从源代码构建 Linux 内核 (linux-4.10.10.tar.xz)

amazon-ec2 - gettimeofday() 不使用 vDSO?

linux - 理解从进程内核栈中获取task_struct指针

c - gdb 反向调试 avx2

c - GDB调试中的问题

eclipse - 在 Eclipse 中调试时不显示变量

c++ - 调试难以捉摸的段错误

gdb - 如何在gdb中打印wstring

c++ - 使用 gdb 处理信号

javascript - 在 Javascript 中查找请求 URL