Debugging 是否可以使用gdb和嵌套qemu虚拟机同时调试linux用户空间程序和主机管理程序?

Debugging 是否可以使用gdb和嵌套qemu虚拟机同时调试linux用户空间程序和主机管理程序?,debugging,linux-kernel,gdb,virtualization,Debugging,Linux Kernel,Gdb,Virtualization,我想调试在嵌套虚拟化环境中运行的用户应用程序。 因此,我构建了QEMU的静态版本,并使用KVM支持运行它。 我将QEMU运行的第一个VM称为主机VM,然后在主机VM内部运行另一个QEMU,并将其命名为来宾VM。最后,我可以在来宾VM内部运行一个用户应用程序。 环境工作正常,现在的问题是,如何调试这样的环境,如何同时遵循用户应用程序和主机VM中KVM的控制流 到目前为止,我使用内置kvm而不是kvm模块,并使用gdb连接主机VM。在添加符号文件[user runnable binary]并通过“h

我想调试在嵌套虚拟化环境中运行的用户应用程序。 因此,我构建了QEMU的静态版本,并使用KVM支持运行它。 我将QEMU运行的第一个VM称为主机VM,然后在主机VM内部运行另一个QEMU,并将其命名为来宾VM。最后,我可以在来宾VM内部运行一个用户应用程序。 环境工作正常,现在的问题是,如何调试这样的环境,如何同时遵循用户应用程序和主机VM中KVM的控制流

到目前为止,我使用内置kvm而不是kvm模块,并使用gdb连接主机VM。在添加符号文件[user runnable binary]并通过“hb main”设置硬件断点后,控制流可以在用户应用程序的主功能中正确停止,但gdb不能从任何虚拟地址读取任何数据,只返回消息如下:

(gdb) x main                                                                                                                                                                      
0x404091 <main>:        Cannot access memory at address 0x404091
(gdb)x main
0x404091:无法访问地址0x404091处的内存

有人能就如何处理此错误给出一些建议吗?

有趣的是,我从来没有想过在主机中使用gdb实例来调试来宾中的进程。gdb使用ptrace系统调用来访问正在调试的进程的内存。显然,由于进程不是在同一个操作系统下运行的,所以这是行不通的。Gdb有一种方法可以在远程系统上调试,使用串行或网络连接与远程系统进行通信。这就是您要做的:将来宾视为远程系统。@prl感谢您的建议,但我尝试跟踪从来宾用户应用程序到主机kvm管理程序的整个控制流。似乎仅仅将来宾视为远程系统只能让我跟踪应用程序,而不能帮助主机调试。因为主机kvm可以读取当前的cr3和ept,所以主机ptrace可以使用此两级表访问正确的地址。你知道我应该修改哪个文件,或者一些关于ptrace内存访问的文档吗?谢谢!!!