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方面的情况。 谢谢你,谢谢
3条答案
按热度按时间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
该项目的开发人员也在https://stackoverflow.com/a/56369454/895245上做了进一步的回答。
在我看来,使用这些库来实现它是今天实现这一目标的最佳方式。
lkd-python
酒店**首先,这个Linaro页面声称有一个工作设置:https://wiki.linaro.org/LandingTeams/ST/GDB,允许你做常见的线程操作,如
thread
,bt
等,但它依赖于一个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-pythonLinux内核树内GDB脚本+我的大脑
然后,我试图看看在v4.17 +一些手动干预作为原型时,我可以用内核树内Python脚本做些什么,但还没有完全实现。
我已经使用这个高度自动化的QEMU + Buildroot设置进行了测试。
首先按照我在“如何使用GDB和QEMU调试Linux内核?”中描述的过程来使GDB工作。
然后,如:如何使用QEMU调试Linux内核模块?运行GDB:
这将从
scripts/gdb
加载树内GDB Python脚本。其中一个脚本提供:
它列出了所有线程的格式:
第一个字段是
task_struct
结构体的地址,所以我们可以看到整个结构体:从理论上讲,这应该可以让我们得到任何我们想要的关于这个过程的信息。
现在我想找到PC.对于ARM,我已经看到:Find program counter of process in kernel和我尝试:
但是
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实现它的唯一方法是为你想要支持的每个命令实现一个自定义版本:
但我们真正想要的是有一个GDB API,其中Python脚本只为所有GDB命令(
thread info
、thread N
等)提供最少的必要参数,以便透明地工作。API基本上只需要:
我认为,其他一切都可以基于这些工作。然后Linux内核将能够维护自己的树内Python提供程序,该程序适用于Linux内核,类似地适用于任何其他操作系统。
tnkciper2#
我不认为GDB理解内核数据结构,这会使它们依赖于版本。GDB使用ptrace来收集任何运行进程的信息。
这就是我所知道的:(
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方面的情况。
谢谢你,谢谢