Windows 7上のVMware Playerにgdbでリモート接続する方法

Pocket

この記事は、
Windows 7上のVMware Playerにgdbでリモート接続する方法
Windows 7上のVMware PlayerでLinuxのデバイスドライバをリモートデバッグする方法(1) - デバッグするカーネルモジュールを用意する
Windows 7上のVMware PlayerでLinuxのデバイスドライバをリモートデバッグする方法(2) - リモートデバッグする
Windows 7上のVMware PlayerでLinuxのデバイスドライバをリモートデバッグする方法(3) - 自動化する
の1つです。

1. 用意するもの

Windows 7上のVMware Playerで、Linuxのデバイスドライバをリモートデバッグしてみました。デバッグするのに少しコツが必要なので紹介します。

64bitのデバッグをしてみたかったので、全部64bitでそろえてみました。Windows 7は、x64版です。VMware Playerは、32bitと64bitの区別がないようでした。Cygwinは、setup-x86_64.exeをつかって、64bit版をインストールしました。gdbのみ使います。Windows上のgdbとしては、MinGW-x64の物もあるのですが、Ctrl-CでゲストOSの実行を止められないのでCygwinのものを使いました。バージョンによっては、Mingwの物でもいいかもしれません。ゲストOSとしては、Ubuntu 13.10 64bit版をインストールしました。

Windows 7 x64 (ホスト)
VMware Player 6.0.1
Cygwin 64bit
Ubuntu 13.10 64bit (ゲスト)

Cygwinは、32bitでもいいと思いますが、確かめていません。

2. VMware Playerの設定

WindowsにVMware PlayerとCygwinをインストールします。その後、VMware PlayerにUbuntuをインストールします。
全部インストールが終わったところで、ゲストOSの設定ファイルの.vmxファイルに以下の設定を追加します。

debugStub.listen.guest64 = "TRUE"
debugStub.listen.guest64.remote = "TRUE"
debugStub.hideBreakpoints = "TRUE"
monitor.debugOnStartGuest64 = "TRUE"

これでVMware Playerを起動すると、サーバーとして通信していいかを聞くダイアログボックスが現れると思います。許可します。これで、ポート8864番でgdbの接続を待ってくれます。複数のゲストを同時に立ち上げたときは、ポートの番号が8865、8866と増えていきます。もし、32bitのゲストOSの場合は、guest64のところがguest32になって8832番になります。

3. gdbの接続の確認

ゲストOSを起動します。そうしたら、Cygwinのコンソールで、gdbを起動します。そのgdbの中で以下のコマンドを打ち込みます。

(gdb) set architecture i386:x86-64
(gdb) target remote localhost:8864

コマンドは、短縮が可能で以下でもいいです。

(gdb) set archi i386:x86-64
(gdb) tar rem :8864

set architectureは、これからデバッグするゲストOSのモジュールが64bitの物であることを指示します。target remoteは、VMware Playerにポート番号8864番で接続してくださいという命令です。

(gdb) set architecture i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) tar rem :8864
Remote debugging using :8864
0xffffffff8104d386 in ?? ()
(gdb)

こんな風に、0xffffffffなんとかと出て、ゲストOSの実行が止まってフリーズしたら成功です。

4. ゲストOS実行の再開

Cygwinのコンソールで、cまたは、continueと打ち込みます。

(gdb) c

とすると、ゲストOSが動き出して操作できるようになると思います。

また、CygwinのコンソールでCtrlキーとCキーを同時に押すと、また0xfffffffffなんとかとでて止まります。

(gdb) c
Continuing.

Program received signal SIGINT, Interrupt.
0xffffffff8104d386 in ?? ()
(gdb)

5. 終了の仕方

gdbで接続している状態で、gdbをquitしてしまうと、ゲストOSが強制終了してしまいます。まず、gdbの接続を切断します。disconnectと打つと次のようになります。disconnectの短縮形はdisconまで打ち込んでください。disだけだと、disableと混同してしまいます。

(gdb) disconnect
Ending remote debugging.
(gdb)

その後でゲストOSを終了します。

6. 再接続の仕方

gdbは、再接続することもできます。

(gdb) tar rem :8865

と打ち込みます。このとき、VMware Player 6.0.1には1度disconnectした後で、ポートが8865になるバグがあるようです。最新の.logファイルで確認することができます。

2014-04-09T16:47:19.737+09:00| vmx| W110: Debug stub: VMware Player is listening for debug connection on port 8865.

一度8865番になると、その後は変わらないようです。その場合は、

(gdb) disconnect
Ending remote debugging.
(gdb) tar rem :8865

とすることでもう1度つなげることができます。

なお、32bitの場合は、8832が8833番になるようです。.logファイルで確認してください。

次のようにすると終了できます。

(gdb) disconnect
Ending remote debugging.
(gdb) quit

次の記事に続きます。
Windows 7上のVMware PlayerでLinuxのデバイスドライバをリモートデバッグする方法(1) - デバッグするカーネルモジュールを用意する

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください