Step into Kernel (VmWare+WinDbg)

31 de May de 2007 - Fernando Roberto

Agora chega de papinho furado e vamos ao que realmente interessa. Falando sobre Kernel Debugging, já escrevi um post descrevendo os passos necessários para fazer Kernel Debugging com o WinDbg utilizando duas máquinas e um cabo serial. Mas ter duas máquinas dedicadas a essa prática é um luxo que nem todos têm. Assim, em outro post, comentei sobre como instalar e utilizar o SoftIce para depurar drivers em uma única máquina dedicada para o debug. Digo máquina dedicada para debug porquê utilizar sua máquina de desenvolvimento para depurar drivers pode não ser uma das suas melhores idéias. Os mais corajosos e confiantes em seu próprio código ainda se arriscam nessa prática. Bom, eu não posso falar muito, já fiz isso em tempos de vacas magras. De qualquer forma, ainda não fugimos da necessidade de ter duas máquinas para termos um ambiente mínimo de desenvolvimento e teste de drivers. Uma alternativa a esses cenários é a utilização de uma única máquina, mas que tenha memória e CPU suficientes para rodar uma máquina virtual a fim de fazer o debug de Kernel. Neste post vou dar os passos para utilizar uma máquina virtual como cobaia para testar e depurar drivers.

Configurando a máquina virtual

O meio de comunicação natural entre máquinas reais que utilizam o WinDbg para fazer o Kernel Debugging é uma porta serial. Para seguir os mesmos passos, precisamos fazer com que a sua máquina virtual ganhe uma porta serial para fazer esta comunicação possível. Com sua máquina virtual desligada, clique sobre a opção Edit vitual machine settings.


Aparecerá uma janela com a lista dos dispositivos já instalados em sua máquina no tab Hardware. Clique em Add… de forma a adicionar um novo dispositivo e selecione Serial Port na lista de dispositivos que será apresentada na tela a seguir.


Depois de clicar em Next, selecione a opção Output named pipe. Isso fará com que a porta serial na máquina virtual se comunique com a máquina real através de um pipe nomeado. Clicando em OK, serão apresentadas as configurações específicas do pipe nomeado. O nome do pipe será utilizado mais tarde em uma das configurações do WinDbg, então caso você queira utilizar um outro nome que não o sugerido aqui, trate de se lembrar deste mesmo nome mais tarde. Em seguida, mude o valor do segundo combo de forma a indicar que o a outra ponta desta comunicação será uma aplicação, no caso o WinDbg. Depois disso, é só clicar em Finish.


Ao final destas configurações, marque a opção Yield CPU on poll conforme mostra a figura abaixo.

Configurando a máquina TARGET

Feito todo esse “Ziriguidum”, agora teremos que configurar o sistema da máquina TARGET para que ela esteja apta a fazer o Kernel Debugging. Lembre-se que para o Windows que roda dentro da máquina virtual, não existe pipe nomeado, apenas uma porta serial. Se você ainda não sabe o que é uma máquina TARGET nem como configurar uma, então dê um pulo neste post e siga os passos descritos na parte onde uma máquina TARGET é configurada.

Configurando a máquina HOST

Admitindo que sua máquina TARGET já foi configurada, agora teremos que configurar o WinDbg de forma que ele se conecte a uma máquina utilizando o pipe nomeado no lugar de uma porta serial. Para isso, costumo criar um arquivo de batch que contenha a seguinte linha de comando:

start C:\Arquiv~1\Debugg~1\windbg.exe -b -k com:pipe,port=\\.\pipe\com_1,resets=0

Criar um arquivo de batch não é um passo obrigatório, talvez você prefira redigitar tudo na janela Run… a cada vez que o debug for iniciado, mas é tudo uma questão de gosto. Repare que o nome do pipe aparece aqui. Espero que você ainda se lembre daquele nominho que você escolheu.

Conectando…

Agora que temos tudo já configurado, é só conectar e depurar. Nessa história, a máquina virtual é quem cria o pipe nomeado que será aberto pelo WinDbg. Sendo assim se você iniciar o WinDbg com os parâmetros demodntrados antes de iniciar a máquina virtual, você verá a janela abaixo informando que o pipe não foi encontrado.


Por isso a seqüência é primeiro ligar a máquina virtual, selecionar a opção debug no Boot como mostrado abaixo, e somente depois disso é que você deveria inciar o WinDbg com os parâmetros acima descritos.


Quando o WinDbg finalmente conecta na máquina virtual via o pipe nomeado, temos as seguintes mensagens em nosso Command Window dentro do WinDbg.


Daí em diante você já sabe… É pegar os paus mesmo (no bom sentido).

Mais uma vez espero ter ajudado.
Até a próxima. 🙂

7 Responses to “Step into Kernel (VmWare+WinDbg)”

  1. Não me lembro há quanto tempo isso existe, mas pelo menos na última e penúltima versões do Windbg existe a opção de conectar à target machine utilizando a própria interface do depurador. Abra o Windbg e vá em File, Kernel Debug (ou Ctrl + K) e escolha a primeira aba (COM). Nela, podem ser especificados os parâmetros de conexão. Daí é só iniciar a máquina virtual e apertar OK na tela do depurador.

    PS: Se for necessário reiniciar a máquina Target, o Windbg pode ficar meio perdido (isso acontecia quase sempre em versões antigas). Tente utilizar a opção do menu Debug, Kernel Connection, Resynchronize (Ctrl + Alt + R).

    PS2: Muito bons os seus artigos sobre depuração em kernel utilizando máquina virtual! Não se esqueça da sua promessa de descrever a configuração da máquina Target no caso do Windows Vista, que agora usa o aplicativo bcdedit. Por enquanto existe um artigo no Caloni.com sobre esse processo (que por increça que parível ainda funciona no Vista de caixinha), mas pretendo retirá-lo em breve quando terminar minha migração de blog.

    []s

    • Xá comigo Lesma,

      Em minha interminável lista de posts pretendidos, existe um que mostrará como fazer o Kernel Debugging no Windows Vista. Este post cobrirá um ítem adicional, que o é fato de poder desfrutar do debug remoto utilzando portas USB.

      Como você bem sabe, terei algum tempo extra em casa estes próximos dias por conta das mini férias que estou tirando. Vou tentar agilizar esse processo.

      Aguadem…
      Em um browser perto de você. (censura livre)

      Abraço,

  2. Thiago Pedro says:

    Gostei muito de ler seus artigos, mas não tenho conhecimentos técnicos tão avançados na área. Estou iniciando no meio de emulação, gostaria de contar com sua ajuda no seguinte:
    Uso windows 2003 server no Host,instalei o XP no vmware, tenho adaptador bluetooh no windows 2003 que está conectado ao programa e direcionado para comunicação COM7 interface inicial do dispositivo USB.
    Bom, eu quero no XP do vmware encontrar essa porta e através disso fazer os procedimentos de acesso, tipo com o Nokia PC Suíte e etc.
    Desde já agradeço

    • Olá Thiago,

      Se eu entendi direito, você tem um programa que cria uma porta serial COM7 em sua máquina Host (W2k3) e quer que esta esteja disponível para o sistema Guest (WXP). Esta porta serial deve estar sendo criada utilizando uma rotina que regitra um driver como provedor de uma certa interface, no seu caso, a interface serial. Isso faz com que o sistema veja a porta COM7 como uma porta física, o sistema não sabe a diferença.

      Para fazer com que uma porta serial do sistema Host seja acessado pelo sistema Guest, adicione uma porta serial virtual como explicado no post, mas selecione a opção “Use a physical serial port on the host”. Na próxima janela selecione a porta serial COM7 no combo list que será exibido. Finalize a operação clicando em “Finish”.

      Nossa, falando assim até parece que tudo vai dar certo assim de primeira, mas isso vai depender de quão bom o driver é em simular esta porta serial. Testei aqui em casa com um conversor USB/Serial e um message box falando sobre um problema irrecuperável me foi apresentado.

      serial1: Unable to read from the “COM3” serial port: Overlapped I/O operation is in progress.

      Conversores USB/Serial perdem os bits de controle de fluxo, já que o protocolo USB não os implementa. Tentar fazer de conta que estes bits ainda estão lá pode não dar certo em todas as situações do universo.

      Talvêz você tenha mais sorte que eu.

      Have fun!

  3. Ricardo M.Souza says:

    Bom dia.. 🙂
    Acreditando que voce ainda veja este post 🙂 gostaria de fazer a seguinte pergunta a ti.. 🙂
    Instalei o VmWare em um XP professional, agora gostaria de ao ligar o computador assim que o xp fosse para a tela de login, inicia-se o vmware… dando start no na maquina virtual criada.. 🙂
    Sem mais…
    abraços

    • Olá Ricardo,

      Sou notificado sempre que deixam um comentário em qualquer posts, mas não respondendo à sua pergunta, vamos lá.

      Não sou especialista em VMware, eu só as utilizo para testar drivers. Assim, eu poderia chutar algumas tentativas para resolver seu problema, mas talvêz a WMware já tenha previsto essa situação.

      Vou ficar devendo essa.
      Fernando.

  4. […] Configure uma VM para bootar em kernel debug. – Encontre um processo qualquer (vamos usar o notepad pra variar?). – Reabra os símbolos de user […]

Deixe um comentário