Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GDBでデバッグ
前のエントリで、ソースファイルをWindowsのPleiades 4.3 Keplerで管理/編集しつつVMware Player上の
Ubuntuのネイティブなx86 Linux GCCを実行してビルドしてみました。その後、試行錯誤していたところ、
VMware Player上のUbuntuのネイティブなx86 Linux GCCでビルドしたプログラムをWindowsのPleiades
4.3 KeplerからVMware Player上のUbuntuで実行させてデバッグ出来るようになりました。(といっても、
まだ、起動/ブレークポイント設定/実行/ブレークぐらいしか試していませんが。) (追記 : 実行中断が出来
ませんでした。実用するには無理がありそうです。) やっていることが分かり難いですが、今回は、以下の
組み合わせになります。

デバッグの構成は、以下のようにしました。



また、GDBとの通信用にVMware Playerでハードウェア仮想化されたCOMポートを2つ追加して、Ubuntuで
使えるようにしています。COMポートを追加したのは、JScriptで名前付きパイプを思ったようには扱えなか
ったからです。(名前付きパイプをうまく扱えるプログラミング環境であれば、理屈上は、今回追加した2つを
追加せずに出来る筈だと思っています。)



使用したバッチファイルやスクリプトは、以下の通りです。JScriptで名前付きパイプを思ったようには扱え
なかったので、スクリプトを3つに分割して'|'で並列実行させる、という小細工を使っています。
やっていることは、以下の通りです。(今のところ非常に荒っぽくパス変換しています。)
(1) Eclipseから標準入力でvmw-gdb.batが受け取ったデータをVMware PlayerのCOMポートでGDBへ渡す。
(2) GDBからVMware PlayerのCOMポートでvmw-gdb.batが受け取ったデータを標準出力でEclipseへ渡す。
(3) vmw-gdb.batに渡された引数に共有フォルダのWindows側のパスが含まれるのでUbuntu見えに変換する。
(4) Eclipseから標準入力でvmw-gdb.batが受け取ったデータ内のWindows側のパスをUbuntu見えに変換する。
(5) GDBからVMware PlayerのCOMポートでvmw-gdb.batが受け取ったデータ内のUbuntu側のパスをWindows
見えに変換する。
ファイル: vmw-gdb.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo2.js \\.\pipe\vmware-serial-port2 | cscript -nologo %~dp0\vmwshdo5.js \\.\pipe\vmware-serial-port "gdb %* < /dev/ttyS2 > /dev/ttyS3" | cscript -nologo %~dp0\vmwshdo3.js \\.\pipe\vmware-serial-port3
ファイル: vmwshdo2.js (標準入力をVMware PlayerのCOMポート(名前付きパイプ)へ転送)
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, stdin, pipeout, pipein, stdout, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
// ★★★★メンテしやすい方法へ要修正★★★★
var WindowsPath = /E:\/work\/workspace\/kensa_VMWCGPJ/g;
var UbuntuPath = "/home/ubuntu/kensa_VMWCGPJ";
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
stdin = WScript.StdIn;
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while(1)
{
try
{
pipeout = f.OpenAsTextStream(ForAppending, TristateFalse);
break;
}
catch(e)
{
WScript.Sleep(100); // ms
}
}
while(1)
{
while( stdin.AtEndOfStream )
{
WScript.Sleep(100); // ms
}
str =stdin.ReadLine();
// パス区切り文字を変更する
str = str.replace(/\\\\/g, "/");
// Windows側→Ubuntu側のパス変換を行う(やり方が非常に荒っぽい)
str = str.replace(WindowsPath, UbuntuPath);
pipeout.WriteLine(str);
}
pipeout.Close();
WScript.Quit(0)
ファイル: vmwshdo3.js (VMware PlayerのCOMポート(名前付きパイプ)を標準出力へ転送)
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, stdin, pipeout, pipein, stdout, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
// ★★★★メンテしやすい方法へ要修正★★★★
var UbuntuPath = /\/home\/ubuntu\/kensa_VMWCGPJ/;
var WindowsPath = "E:/work/workspace/kensa_VMWCGPJ";
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
stdout = WScript.StdOut;
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while(1)
{
try
{
pipein = f.OpenAsTextStream(ForReading, TristateFalse);
break;
}
catch(e)
{
WScript.Sleep(100); // ms
}
}
while(1)
{
while( pipein.AtEndOfStream )
{
WScript.Sleep(100); // ms
}
str = pipein.ReadLine();
// Ubuntu側→Windows側のパス変換を行う(やり方が非常に荒っぽい)
str = str.replace(UbuntuPath, WindowsPath);
stdout.WriteLine(str);
}
pipein.Close();
WScript.Quit(0)
ファイル: vmwshdo5.js (VMware Player上のUbuntuでのGDBの起動処理、スクリプト終了処理)
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, ts, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
// ★★★★メンテしやすい方法へ要修正★★★★
var WindowsPath = /E:\/work\/workspace\/kensa_VMWCGPJ/g;
var UbuntuPath = "/home/ubuntu/kensa_VMWCGPJ";
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
var VMwareExecuteCommand = "";
for (i = 1; i < WScript.Arguments.length; i++)
{
VMwareExecuteCommand += WScript.Arguments(i) + " ";
}
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
// コマンドの送信(実行終了の目印に[[[END]]]が来るよう"; echo [[[END]]]"を付加して送信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForAppending, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
str = VMwareExecuteCommand;
// パス区切り文字を変更し、最後に"; echo [[[END]]]"を付加する
str = str.replace(/\\/g,"/") + "; echo [[[END]]]";
// Windows側→Ubuntu側のパス変換を行う
str = str.replace(WindowsPath, UbuntuPath);
ts.WriteLine(str);
ts.Close();
// 実行結果の受信(実行終了の目印の[[[END]]]が来るまで受信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForReading, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while (1)
{
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
// しまった。ブロッキングリードだから最大リトライ回数チェックは無駄だった。
str = ts.ReadLine();
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
if (str.search(/exit ; echo \[\[\[END\]\]\]$/) != -1)
{
// exitコマンドでは目印の[[[END]]]が来ないので待たずに終了
break;
}
if (str.search(/^\[\[\[END\]\]\]/) != -1)
{
// コマンドの実行終了の目印の[[[END]]]が来たら終了
break;
}
if (str.search(/ ; echo \[\[\[END\]\]\]$/) == -1 && str.search(/^[ \t]*$/) == -1)
{
// コマンドのエコーバックと空行を除きコマンドの実行結果を画面に表示する
WScript.Echo(str);
}
}
ts.Close();
WScript.Quit(0)
Ubuntuのネイティブなx86 Linux GCCを実行してビルドしてみました。その後、試行錯誤していたところ、
VMware Player上のUbuntuのネイティブなx86 Linux GCCでビルドしたプログラムをWindowsのPleiades
4.3 KeplerからVMware Player上のUbuntuで実行させてデバッグ出来るようになりました。(といっても、
まだ、起動/ブレークポイント設定/実行/ブレークぐらいしか試していませんが。) (追記 : 実行中断が出来
ませんでした。実用するには無理がありそうです。) やっていることが分かり難いですが、今回は、以下の
組み合わせになります。
GCC | VMware Player上のx86 Ubuntuで実行 |
Pleiades 4.3 Kepler | Windowsで実行 |
GDB | VMware Player上のx86 Ubuntuで実行 |
'kensa'プログラム | VMware Player上のx86 UbuntuのGDBで実行 |

デバッグの構成は、以下のようにしました。



また、GDBとの通信用にVMware Playerでハードウェア仮想化されたCOMポートを2つ追加して、Ubuntuで
使えるようにしています。COMポートを追加したのは、JScriptで名前付きパイプを思ったようには扱えなか
ったからです。(名前付きパイプをうまく扱えるプログラミング環境であれば、理屈上は、今回追加した2つを
追加せずに出来る筈だと思っています。)



使用したバッチファイルやスクリプトは、以下の通りです。JScriptで名前付きパイプを思ったようには扱え
なかったので、スクリプトを3つに分割して'|'で並列実行させる、という小細工を使っています。
やっていることは、以下の通りです。(今のところ非常に荒っぽくパス変換しています。)
(1) Eclipseから標準入力でvmw-gdb.batが受け取ったデータをVMware PlayerのCOMポートでGDBへ渡す。
(2) GDBからVMware PlayerのCOMポートでvmw-gdb.batが受け取ったデータを標準出力でEclipseへ渡す。
(3) vmw-gdb.batに渡された引数に共有フォルダのWindows側のパスが含まれるのでUbuntu見えに変換する。
(4) Eclipseから標準入力でvmw-gdb.batが受け取ったデータ内のWindows側のパスをUbuntu見えに変換する。
(5) GDBからVMware PlayerのCOMポートでvmw-gdb.batが受け取ったデータ内のUbuntu側のパスをWindows
見えに変換する。
ファイル: vmw-gdb.bat
内容:
@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo2.js \\.\pipe\vmware-serial-port2 | cscript -nologo %~dp0\vmwshdo5.js \\.\pipe\vmware-serial-port "gdb %* < /dev/ttyS2 > /dev/ttyS3" | cscript -nologo %~dp0\vmwshdo3.js \\.\pipe\vmware-serial-port3
ファイル: vmwshdo2.js (標準入力をVMware PlayerのCOMポート(名前付きパイプ)へ転送)
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, stdin, pipeout, pipein, stdout, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
// ★★★★メンテしやすい方法へ要修正★★★★
var WindowsPath = /E:\/work\/workspace\/kensa_VMWCGPJ/g;
var UbuntuPath = "/home/ubuntu/kensa_VMWCGPJ";
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
stdin = WScript.StdIn;
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while(1)
{
try
{
pipeout = f.OpenAsTextStream(ForAppending, TristateFalse);
break;
}
catch(e)
{
WScript.Sleep(100); // ms
}
}
while(1)
{
while( stdin.AtEndOfStream )
{
WScript.Sleep(100); // ms
}
str =stdin.ReadLine();
// パス区切り文字を変更する
str = str.replace(/\\\\/g, "/");
// Windows側→Ubuntu側のパス変換を行う(やり方が非常に荒っぽい)
str = str.replace(WindowsPath, UbuntuPath);
pipeout.WriteLine(str);
}
pipeout.Close();
WScript.Quit(0)
ファイル: vmwshdo3.js (VMware PlayerのCOMポート(名前付きパイプ)を標準出力へ転送)
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, stdin, pipeout, pipein, stdout, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
// ★★★★メンテしやすい方法へ要修正★★★★
var UbuntuPath = /\/home\/ubuntu\/kensa_VMWCGPJ/;
var WindowsPath = "E:/work/workspace/kensa_VMWCGPJ";
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
stdout = WScript.StdOut;
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while(1)
{
try
{
pipein = f.OpenAsTextStream(ForReading, TristateFalse);
break;
}
catch(e)
{
WScript.Sleep(100); // ms
}
}
while(1)
{
while( pipein.AtEndOfStream )
{
WScript.Sleep(100); // ms
}
str = pipein.ReadLine();
// Ubuntu側→Windows側のパス変換を行う(やり方が非常に荒っぽい)
str = str.replace(UbuntuPath, WindowsPath);
stdout.WriteLine(str);
}
pipein.Close();
WScript.Quit(0)
ファイル: vmwshdo5.js (VMware Player上のUbuntuでのGDBの起動処理、スクリプト終了処理)
内容:
// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, ts, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
// ★★★★メンテしやすい方法へ要修正★★★★
var WindowsPath = /E:\/work\/workspace\/kensa_VMWCGPJ/g;
var UbuntuPath = "/home/ubuntu/kensa_VMWCGPJ";
var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
var VMwareExecuteCommand = "";
for (i = 1; i < WScript.Arguments.length; i++)
{
VMwareExecuteCommand += WScript.Arguments(i) + " ";
}
fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
f = fso.GetFile(VMwareSerialPortPipe);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプが見つからなかった
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
// コマンドの送信(実行終了の目印に[[[END]]]が来るよう"; echo [[[END]]]"を付加して送信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForAppending, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
str = VMwareExecuteCommand;
// パス区切り文字を変更し、最後に"; echo [[[END]]]"を付加する
str = str.replace(/\\/g,"/") + "; echo [[[END]]]";
// Windows側→Ubuntu側のパス変換を行う
str = str.replace(WindowsPath, UbuntuPath);
ts.WriteLine(str);
ts.Close();
// 実行結果の受信(実行終了の目印の[[[END]]]が来るまで受信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
ts = f.OpenAsTextStream(ForReading, TristateFalse);
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
// 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
while (1)
{
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
try
{
// しまった。ブロッキングリードだから最大リトライ回数チェックは無駄だった。
str = ts.ReadLine();
break;
}
catch(e)
{
if( i == VMwareSerialMaxRetry - 1 ){
WScript.Quit(1);
}
WScript.Sleep(100); // ms
}
}
if (str.search(/exit ; echo \[\[\[END\]\]\]$/) != -1)
{
// exitコマンドでは目印の[[[END]]]が来ないので待たずに終了
break;
}
if (str.search(/^\[\[\[END\]\]\]/) != -1)
{
// コマンドの実行終了の目印の[[[END]]]が来たら終了
break;
}
if (str.search(/ ; echo \[\[\[END\]\]\]$/) == -1 && str.search(/^[ \t]*$/) == -1)
{
// コマンドのエコーバックと空行を除きコマンドの実行結果を画面に表示する
WScript.Echo(str);
}
}
ts.Close();
WScript.Quit(0)
- 関連記事
-
- OSエミュレータ | WindowsバイナリをLinux上で実行するWineというソフトウェアを試してみた
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + KPIT ARM-RZでビルド→失敗
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + Visual C++でビルド→失敗
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Keplerでソースコードをプロジェクト間で共有
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + Cygwin GDBでデバッグ
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + Cygwin GCCでビルド
- RZマイコン基板(CEV-RZ/A1L) | 'kensa'プログラムをPleiades Kepler + MinGW GCCでビルド→失敗
- Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GDBでデバッグ
- Win/Linuxクロス開発 | Pleiades Kepler + VMware Player上のx86 Linux GCCでビルド
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (3)
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (2)
- RZマイコン基板(CEV-RZ/A1L) | Pleiades Kepler + Windows版Linaro ARM Linux GCCでビルド (1)
- RZマイコン基板(CEV-RZ/A1L) | Windows版Linaro ARM Linux GCCで'kensa'プログラムをビルド
- RZマイコン基板(CEV-RZ/A1L) | Windows版Linaro ARM Linux GCCを使えば事足りるのかも
- RZマイコン基板(CEV-RZ/A1L) | CEV Linux SDK V2.00.00がリリースされていた
2013/12/12 blog-entry-383 category: Pleiades & CrossGCC
| h o m e |