debugging 用于Linux内核的线程感知gdb

chhkpiq4  于 12个月前  发布在  Linux
关注(0)|答案(3)|浏览(150)

我正在使用gdb连接到一个虚拟机的串口来调试Linux内核。
我想知道,是否有任何补丁/插件,可以使gdb理解一些Linux内核的数据结构,使其“线程意识”?
我的意思是,在gdb下,我可以看到有多少内核线程,它们的状态,以及每个线程的堆栈信息。

hfwmuf9z

hfwmuf9z1#

[*] Libvmi**
https://github.com/libvmi/libvmi
这个项目做了“LibVMI:简化的虚拟机内省”,听起来真的很接近。
这个项目特别是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分支。我稍后会测试它。在2016年,https://youtu.be/pqn5hIrz3A8说,实现是在C中,而不是作为Python脚本不幸的是,这样会更好,避免分叉。lkd-python的草图可以在以下位置找到:https://git.linaro.org/people/lee.jones/kieran.bingham/binutils-gdb.git/log/?h=lkd-python

Linux内核树内GDB脚本+我的大脑

然后,我试图看看在v4.17 +一些手动干预作为原型时,我可以用内核树内Python脚本做些什么,但还没有完全实现。
我已经使用这个高度自动化的QEMU + Buildroot设置进行了测试。
首先按照我在“如何使用GDB和QEMU调试Linux内核?”中描述的过程来使GDB工作。
然后,如:如何使用QEMU调试Linux内核模块?运行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

从理论上讲,这应该可以让我们得到任何我们想要的关于这个过程的信息。
现在我想找到PC.对于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-threads:list
  • xxx-thread:修改当前线程
  • xxx-p:打印当前线程

但我们真正想要的是有一个GDB API,其中Python脚本只为所有GDB命令(thread infothread N等)提供最少的必要参数,以便透明地工作。
API基本上只需要:

  • 列表线程
  • 换螺纹
  • 提供给定线程的寄存器

我认为,其他一切都可以基于这些工作。然后Linux内核将能够维护自己的树内Python提供程序,该程序适用于Linux内核,类似地适用于任何其他操作系统。

tnkciper

tnkciper2#

我不认为GDB理解内核数据结构,这会使它们依赖于版本。GDB使用ptrace来收集任何运行进程的信息。
这就是我所知道的:(

k97glaaz

k97glaaz3#

pyvmidbg开发者
我将添加一些澄清:是的,该项目的目标确实是要有一个跨平台的,客户感知的GDB存根。
大多数实现已经在Windows上完成了,我们知道进程和它们的线程上下文。可以拦截特定进程(演示中的cmd.exe)并单步执行它(目前仅限于1个进程和1个线程),以及附加到新进程的入口点。
关于Linux,我查看了我能找到的内部结构和资源,但我缺乏整体的了解来弄清楚我如何做到:-在调度任务时拦截任务(core/sched.c:switch_to()?)-读取任务状态(Windows的KTRAP_FRAME相当于Linux?)
我在SO上问了一个问题,但没有人回答:/Linux context switch internals: how does a process goes back to userland after the switch?
如果你能帮上忙,我可以指导你完成实施:)
关于虚拟机管理程序支持,目前Libvmi接口中只有Xen完全支持。我在自述文件中添加了一个部分,以描述我们与其他虚拟机管理程序在VMI API方面的情况。
谢谢你,谢谢

相关问题