cygwinを利用した仮想マシンのプログラムのリモートデバッグ

64bitなcygwinでビルドしたから、仮想マシンの32bitなReactOS用のアプリケーションおよびReactOSのDLLをgdbデバッグする方法です。

前提

ホストOS:windows10(64bit)
ホスト環境:cygwin(64bit)
ホストデバッガ:gdb(cygwin用)
ホストのipアドレス:192.168.44.1

仮想マシン:VMware Workstation 12 player
ゲストOS:ReactOS(32bit)
ゲストのipアドレス:192.168.44.129
ゲストデバッガ:gdbserver(windows用)

デバッグ情報付きのReactOSのDLLの準備

ReactOSのCドライブのルート(\)に対応する場所を、ホストの/path/to/sysroot/とした場合、ReactOS上のC:\ReactOS\Sytem32\にあるdllについては、そのdllに対応するデバッグ情報付きのdllを、cygwin上の/path/to/sysroot/ReactOS/System32/に配置します。ドライブレター(C:)に対応するパスはなくても問題はありません。もし、ドライブレターに対応するパスが必要なら、/path/to/sysroot/c/ReactOS/System32/ のように、/cを含めたパスに、デバッグ情報付きのdllを配置します。

gdbの操作

ここでは、cygwinデバッグ情報付きでコンパイルしたhello.exeをReactOS上でデバッグします。

ゲストOSでの操作
ReactOS上でgdbserverを起動し、任意のポートで起動します。ここでは、3333番のポートで待ち受けることにします。

C:\ gdbserver --multi localhost:3333

ホストOSでの操作
cygwin上で、gdbを起動します。

~/ gdb

以下は、gdbでの操作になります。
ReactOSでルートとして利用するcygwinでのディレクトリを指定します。
ReactOSのgdbserverに接続します。cygwinからファイルの転送を行うため、targetには、extended-remoteを指定します。また、ReactOSIPアドレス(ここでは、192.168.44.129)と先ほど指定したポート番号を指定します。
ReactOSのgdbserverに対して、hello.exeを転送します。
ReactOSのgdbserverに対して、実行ファイルとして、hello.exeを指定します。
gdbに対して、実行ファイルとして、hello.exeを読み込みます。
ブレークポイントをmainに設定します。このときに表示されるソースは、cygwinのクロスコンパイラで使用するcrtのソースになります。
実行すると、ブレークポイントで停止します。

(gdb) set sysroot /path/to/sysroot/

(gdb) target extended-remote 192.168.44.129:3333
Remote debugging using 192.168.44.129:3333

(gdb) remote put hello.exe hello.exe
Successfully sent file "hello.exe".

(gdb) set remote exec-file hello.exe

(gdb) file hello.exe
Reading symbols from hello.exe...done.

(gdb) b main
Breakpoint 1 at 0x402a26: file /usr/src/debug/mingw64-i686-runtime-5.0.2-1/crt/crt0_c.c, line 18.

(gdb) r
Starting program: /path/to/hello/hello.exe

Breakpoint 1, main (flags=1, cmdline=0x231dd8, inst=0x2318b8)
    at /usr/src/debug/mingw64-i686-runtime-5.0.2-1/crt/crt0_c.c:18
18        return (int) WinMain (__mingw_winmain_hInstance, NULL,