如何使用VirtualBox从另一个VM在一个VM中调试Windows?

时间:2012-09-27 10:33:12

标签: windbg remote-debugging

我正在研究Windows 7的一些启动(登录前)代码,并且希望能够对其进行调试(如果只是为了查看它是如何工作的,因为微软的文档非常糟糕)。

我的环境是Linux主机上的VirtualBox,有三个Windows VM(一个Windows 2008域控制器,一个Windows 7开发机器和一个Windows 7测试机器),我希望能够调试启动过程使用两个虚拟机的虚拟串行连接从开发机器远程测试机器。

[在另一个生命中,我在Windows主机上使用VMware工作站调试了一个Linux VM中的Linux内核驱动程序,因此我知道这种事情可能是可行的。]

我见过有人使用windbg从主机调试VirtualBox VM中的Windows,但是我需要从第二个guest虚拟机执行此操作(因为我的主机是非Windows)。有没有人想出怎么做?

修改 在我发布之前,我曾尝试过这种明显的方法。我在每个VM配置中创建了一个虚拟串行端口,并将它们连接到同一个主机管道,由dev VM(调试器)创建并由测试VM(debugee)使用。然后我跑了

bcdedit /dbgsettings serial debugport:1 baudrate:115200
bcdedit /debug {current} on

在测试VM中关闭它。在dev VM中选择内核调试(在正确的串口上)并重新启动测试VM。一些消息显示没有任何符号可用且测试VM挂起。

我后来发现这篇文章:http://www.benjaminhumphrey.co.uk/remote-kernel-debugging-windbg-virtualbox/(虽然那个人正在使用Windows主机)似乎完全描述了我尝试过的方法,但他的测试虚拟机并没有挂起。我在wndbg窗口中输出的输出与他的输出相同,但在“Windows XP Kernel ...”之前的行停止

我现在不太确定这个问题与VirtualBox有关,更不确定我是否正确使用windbg。任何帮助将不胜感激。

另一个编辑我尝试将测试虚拟机的虚拟串口连接到主机文件,然后在文件中获得一些调试输出。我已经尝试将两个VM的虚拟串行端口设置为指向主机管道并在Dev VM中运行终端(而不是WinDbg),并在终端中获取调试信息。

我想我现在已经确定这绝对是WinDbg而不是VirtualBox的问题(我将删除virtualbox标签并用windbg替换它)但我不确定为什么WinDbg不会说话。

更多信息: 我刚刚升级升级到VirtualBox 4.2.4(不确定版本是否重要)并再次查看了这个。

我重建了测试VM并且更耐心了!

现在似乎测试虚拟机正在运行 - 我最终在windbg窗口中获得了一些输出 - 但调试对象操作系统启动需要大约15 分钟!这对于日常的内核调试显然没有用。我不知道为什么这应该这么慢......如果我在开发虚拟机VM中运行一个简单的终端而不是windbg,那么没有明显的减速(当然,调试信息当然主要是垃圾)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我意识到这是一个helluva necro,但是......

您是否尝试过为内核模式网络调试设置debugee?我认为减速在很大程度上是因为序列是如此g.d.慢。

http://msdn.microsoft.com/en-us/library/windows/hardware/hh439346%28v=vs.85%29.aspx

如果/当M $决定腐蚀该链接时,上述文章的这些部分就是您需要做的设置:

设置目标计算机

要设置目标计算机,请按以下步骤操作:

Verify that the target computer has a supported network adapter.

Connect the supported adapter to a network hub or switch using standard CAT5 or better network cable. Do not use a crossover cable, and do not use a crossover port in your hub or switch.

In an elevated Command Prompt window, enter the following commands, where w.x.y.z is the IP address of the host computer, and n is a port number of your choice:

    bcdedit /debug on
    bcdedit /dbgsettings net hostip:w.x.y.z port:n

bcdedit will display an automatically generated key. Copy the key and store it on a removable storage device like a USB flash drive. You will need the key when you start a debugging session on the host computer.

Note  We strongly recommend that you use an automatically generated key. However, you can create your own key as described later in the Creating Your Own Key section.

If there is more than one network adapter in the target computer, use Device Manager to determine the PCI bus, device, and function numbers for the adapter you want to use for debugging. Then in an elevated Command Prompt window, enter the following command, where b, d, and f are the bus number, device number, and function number of the adapter:
bcdedit /set "{dbgsettings}" busparams b.d.f
Reboot the target computer.

要连接到它,请使用以下步骤:

Using WinDbg

On the host computer, open WinDbg. On the File menu, choose Kernel Debug. In the Kernel Debugging dialog box, open the Net tab. Enter your port number and key. Click OK.

You can also start a session with WinDbg by opening a Command Prompt window and entering the following command, where n is your port number and Key is the key that was automatically generated by bcdedit when you set up the target computer:

windbg -k net:port=n,key=Key

If you are prompted about allowing WinDbg to access the port through the firewall, allow WinDbg to access the port for all the different network types.

Using KD

On the host computer, open a Command Prompt window. Enter the following command, where n is your port number and Key is the key that was automatically generated by bcdedit when you set up the target computer:

kd -k net:port=n,key=Key

If you are prompted about allowing KD to access the port through the firewall, allow KD to access the port for all the different network types.