リモートデバッグを行う
特定の PC でしか発生しない問題を解決するのは容易なことではありません。オンラインソフト等、不特定多数に配布するものは特にやっかいです。
しかしながら、カスタマイズした業務アプリ等、客先でのみ発生する問題を解決するのであれば、方法がない訳ではありません。
Delphiを客先にインストールする
これが最も簡単な方法です。"現地デバッグ"という奴ですね。しかしながら、この方法には問題があります。
- インストールさせてくれない事がある。
- ライブラリや VCL 等の環境整備に手間が掛かる
- Delphi 6 以降だとインストール回数制限がある
- そもそもライセンスに違反しかねない
リモートデバッグ
そこでこの方法を採ります。リモートデバッガはその名の通り、遠隔でデバッグします。TCP/IP 経由でデバッグしますが、実質共有フォルダが必要なので、LAN 内でのみ有効な手段です (そもそもセキュリティの面でインターネット経由でデバッグするようには作られていません)。外部から持ち込まれた PC の接続許可があるのだったら、この方法を採用するのがいいでしょう。
Delphi 4 以降ではリモートデバッグが可能で、Delphi 7 以降だと Professional 版から標準添付されています。気をつけなくてはならないのが Delphi 2005 には、どのエディションにもリモートデバッガが用意されていないという点です。また、BDS 2006 以降のリモートデバッガは Win9x へインストールする事ができない点にも注意が必要です。
注意点です。Delphi 4~7 迄のリモートデバッガはターゲット OS が Win9x であっても動作しますが、BDS 2006 / Delphi 2007 のリモートデバッガはターゲット OS が Windows 2000 以降となっています。Delphi 2009 の場合、そもそも生成バイナリが Win9x では動作しません (中には動作するものもあるかもしれませんが)。
バージョン |
9x 系 |
NT 系 |
Pro 版に添付 |
Delphi 3 またはそれ以前 |
(付属せず) |
Delphi 4 |
○ |
○ |
× |
Delphi 5 |
○ |
○ |
× |
Delphi 6 |
○ |
○ |
× |
Delphi 7 |
○ |
○ |
○ |
Delphi 2005 |
(付属せず) |
BDS 2006 / Turbo Delphi |
× |
○ |
○ |
Delphi 2007 |
× |
○ |
○ |
Delphi 2009 |
× |
○ |
○ |
Delphi 2010 |
× |
○ |
○ |
Delphi XE |
× |
○ |
○ |
Delphi XE2 |
× |
○ |
○ |
Delphi XE3 |
× |
○ |
○ |
Delphi XE4 |
× |
○ |
○ |
Delphi XE5 |
× |
○ |
○ |
Delphi XE6 |
× |
○ |
○ |
Delphi XE7 |
× |
○ |
○ |
リモートデバッガの準備
それでは準備に取り掛かりましょう。リモートデバッガはインストール CD / DVD に収められており、Delphi インストーラのメニューからインストール可能です。しかしながら、アプリケーションのインストールを禁じている会社もあるでしょう。このような場合には "リモートデバッガ導入をファイルコピーで済ませ、用がなくなったら削除する" という手段を採ります。どちらの方法でも可能にするために、まず普通にリモートデバッガをインストールし、ファイルを抽出します。念のために、開発環境がインストールされていない環境 (仮想 PC 等)へインストールして下さい。
BDS 2006 またはそれ以降では "($BDS)\bin" 内に存在するファイルを集めてリモートデバッガとして利用する事が可能なようです。詳しくは "リモート マシンへデバッガをインストールする (DocWiki)" を参照して下さい。"($BDS)\bin" からファイルを抽出する場合にはこのステップは不要です。
- Delphi 4
"%ProgramFiles%\Common Files\Borland Shared\Debugger"
- Delphi 5
"%ProgramFiles%\Borland\Remote Debugger\5.0"
"%ProgramFiles%\Common Files\Borland Shared\Debugger"
- Delphi 6
"%ProgramFiles%\Borland\Remote Debugger\6.0"
"%ProgramFiles%\Common Files\Borland Shared\Debugger"
- Delphi 7
"%ProgramFiles%\Borland\Remote Debugger\7.0"
"%ProgramFiles%\Common Files\Borland Shared\Debugger"
- BDS 2006
"%ProgramFiles%\Borland\BDS\4.0\rdbg"
- Delphi 2007
"%ProgramFiles%\RemoteDebugger"
- Delphi 2009
"%ProgramFiles%\RemoteDebugger"
- Delphi 2010
"%ProgramFiles%\RemoteDebugger"
- Delphi XE
"%ProgramFiles%\RemoteDebugger"
- Delphi XE2
"%ProgramFiles%\Embarcadero\PAServer"
- Delphi XE3
"%ProgramFiles%\Embarcadero\RADPAServer\10.0"
- Delphi XE4
"%ProgramFiles%\Embarcadero\RADPAServer\11.0"
- Delphi XE5
"%ProgramFiles%\Embarcadero\RADPAServer\12.0"
- Delphi XE6
"%ProgramFiles%\Embarcadero\PAServer\14.0"
- Delphi XE7
"%ProgramFiles%\Embarcadero\PAServer\15.0"
デフォルトで、上記の場所へインストールされます。Delphi 2007 ~ XE のリモートデバッガは初期インストールフォルダがバッティングしますので注意して下さい。 インストールが完了したら、インストールフォルダにあるリモートデバッガ用のファイルをバックアップしておきます。
リモートデバッガのインストール / アンインストール (インストーラ使用)
リモートデバッガをインストーラを使ってインストールできる環境ならば特に問題になる事はないハズです。
リモートデバッガのインストール (手動)
- "リモートデバッガの準備" で収集したファイルを同じフォルダに集めて (サブフォルダは作らない)、ターゲット PC にコピーします (例: "C:\RDEBUG")。
-
デバッガ DLL を登録します。Win9x の場合、regsvr32.exe は "%WinDir%\System" にあります。デバッガ DLL はフルパスで登録して下さい。
- Delphi 4 の場合
"regsvr32.exe C:\RDEBUG\bordbk40.dll"
- Delphi 5 の場合
"regsvr32.exe C:\RDEBUG\bordbk50.dll"
- Delphi 6 の場合
"regsvr32.exe C:\RDEBUG\bordbk60.dll"
- Delphi 7 の場合
"regsvr32.exe C:\RDEBUG\bordbk70.dll"
- BDS 2006 の場合
"regsvr32.exe C:\RDEBUG\bordbk100.dll"
"regsvr32.exe C:\RDEBUG\bordbk100n.dll"
- Delphi 2007 の場合
"regsvr32.exe C:\RDEBUG\bordbk105.dll"
"regsvr32.exe C:\RDEBUG\bordbk105n.dll"
- Delphi 2009 の場合
"regsvr32.exe C:\RDEBUG\bordbk120.dll"
"regsvr32.exe C:\RDEBUG\bordbk120n.dll"
- Delphi 2010 の場合
"regsvr32.exe C:\RDEBUG\bordbk140.dll"
"regsvr32.exe C:\RDEBUG\bordbk140n.dll"
- Delphi XE の場合
"regsvr32.exe C:\RDEBUG\bordbk150.dll"
"regsvr32.exe C:\RDEBUG\bordbk150n.dll"
- Delphi XE2 の場合
"regsvr32.exe C:\RDEBUG\bordbk160.dll"
"regsvr32.exe C:\RDEBUG\bordbk160n.dll"
- Delphi XE3 の場合
"regsvr32.exe C:\RDEBUG\bordbk170.dll"
"regsvr32.exe C:\RDEBUG\bordbk170n.dll"
- Delphi XE4 の場合
"regsvr32.exe C:\RDEBUG\bordbk180.dll"
"regsvr32.exe C:\RDEBUG\bordbk180n.dll"
- Delphi XE5 の場合
"regsvr32.exe C:\RDEBUG\bordbk190.dll"
"regsvr32.exe C:\RDEBUG\bordbk190n.dll"
- Delphi XE6 の場合
"regsvr32.exe C:\RDEBUG\bordbk200.dll"
"regsvr32.exe C:\RDEBUG\bordbk200n.dll"
- Delphi XE7 の場合
"regsvr32.exe C:\RDEBUG\bordbk210.dll"
"regsvr32.exe C:\RDEBUG\bordbk210n.dll"
-
リモートデバッグサーバを起動します。
- Delphi 4 の場合
"C:\RDEBUG\borrdbg.exe -listen"
- Delphi 5 の場合
"C:\RDEBUG\bordbg50.exe -listen"
- Delphi 6 の場合
"C:\RDEBUG\bordbg60.exe -listen"
- Delphi 7 の場合
"C:\RDEBUG\bordbg70.exe -listen"
- BDS 2006 の場合
"C:\RDEBUG\rmtdbg100.exe -listen"
- Delphi 2007 の場合
"C:\RDEBUG\rmtdbg105.exe -listen"
- Delphi 2009 の場合
"C:\RDEBUG\rmtdbg120.exe -listen"
- Delphi 2010 の場合
"C:\RDEBUG\rmtdbg140.exe -listen"
- Delphi XE の場合
"C:\RDEBUG\rmtdbg150.exe -listen"
- Delphi XE2 の場合
"C:\RDEBUG\rmtdbg160.exe -listen"
- Delphi XE3 の場合
"C:\RDEBUG\rmtdbg170.exe -listen"
- Delphi XE4 の場合
"C:\RDEBUG\rmtdbg180.exe -listen"
- Delphi XE5 の場合
"C:\RDEBUG\rmtdbg190.exe -listen"
- Delphi XE6 の場合
"C:\RDEBUG\rmtdbg200.exe -listen"
- Delphi XE7 の場合
"C:\RDEBUG\rmtdbg210.exe -listen"
リモートデバッガのアンインストール (手動)
- リモートデバッグサーバを停止します。
Delphi 4 の場合にはタスクを殺して下さい。それ以外の場合には通知領域にあるアイコン (緑の虫) を右クリックで終了させて下さい。
-
デバッガ DLL を登録解除します。
- Delphi 4 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk40.dll"
- Delphi 5 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk50.dll"
- Delphi 6 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk60.dll"
- Delphi 7 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk70.dll"
- BDS 2006 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk100.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk100n.dll"
- Delphi 2007 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk105.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk105n.dll"
- Delphi 2009 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk120.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk120n.dll"
- Delphi 2010 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk140.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk140n.dll"
- Delphi XE の場合
"regsvr32.exe -u C:\RDEBUG\bordbk150.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk150n.dll"
- Delphi XE2 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk160.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk160n.dll"
- Delphi XE3 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk170.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk170n.dll"
- Delphi XE4 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk180.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk180n.dll"
- Delphi XE5 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk190.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk190n.dll"
- Delphi XE6 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk200.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk200n.dll"
- Delphi XE7 の場合
"regsvr32.exe -u C:\RDEBUG\bordbk210.dll"
"regsvr32.exe -u C:\RDEBUG\bordbk210n.dll"
- "C:\RDEBUG" フォルダを削除します。
リモートデバッガのインストール / アンインストール (手動) が面倒
そう言われてしまうと話が先に進まないのですが (Linux とか触ったら発狂しますよ)...無保証でよければ、"リモートデバッガ インストーラ" を用意してみましたので、使ってみるのもテだと思います。Win9x でもちゃんと動作します。
「手動と言いながらインストーラ?」と思われるかもしれませんが、これはこれで存在意義がありますので、早とちりされぬよう。
リモートデバッグを行う
そんなに難しいものではありません。Delphi のバージョンによりやるべき事が若干違いますが、共通で事前にやる事は、
- ターゲット PC でリモートデバッグサーバを起動
- プロジェクトオプションでデバッグモードを選択
この 2 点です。
~ Delphi 7 の場合
- [プロジェクト | オプション] を開く
- [リンカ]タブにある、"リモートデバッグ情報を含める" にチェックを入れる。
- [プロジェクト | 再構築] を行う
- プロジェクトフォルダに *.EXE と *.RSM が生成される。
- ターゲット PC にこの 2 つをコピーする (例: "C:\RD_TEST")。
- [実行 | 実行時引数] を開く
- [リモート]タブを開く
- "リモートパス" に、ターゲット PC にある EXE をフルパスで指定する。
- "リモートホスト" に、ホスト名またはIPアドレス (\\ は不要)を指定する。
- "読み込み"ボタン を押すか、[実行 | 実行] すれば、ターゲット PC で EXE が実行され、デバッグする事ができます。
デバッグの度に、*.EXE と *.RSM を配布するのが面倒な場合には、
- ターゲット PC のフォルダを共有にする (例: "C:\RD_TEST")。
- [プロジェクト | オプション] を開く
- [ディレクトリ/条件]タブにある、"出力ディレクトリ" にターゲット PC の共有フォルダを指定する。
こうしておくと便利でしょう。但し、これやってる間は 他の PC から共有フォルダアクセスし放題 なのでオススメはしません。
BDS 2006 / Turbo Delphi / Delphi 2007 の場合
- [プロジェクト | オプション] を開く
- [リンカ]にある、"リモートデバッグシンボルを含める" にチェックを入れる。
- [プロジェクト | 再構築] を行う
- プロジェクトフォルダに *.EXE と *.RSM が生成される。
- ターゲット PC にこの 2 つをコピーする (例: "C:\RD_TEST")。
- [実行 | プロセスのロード] を開く
- [リモート]を選択
- "リモートパス" に、ターゲット PC にある EXE をフルパスで指定する。
- "リモートホスト" に、ホスト名または IP アドレス (\\ は不要)を指定する。
- 下にある "読み込み"ボタンを押す と、ターゲット PC で EXE が実行され、デバッグする事ができます。
デバッグの度に、*.EXE と *.RSM を配布するのが面倒な場合には、
- ターゲット PC のフォルダを共有にする (例: "C:\RD_TEST")。
- [プロジェクト | オプション] を開く
- [ディレクトリ/条件]にある、"出力ディレクトリ" にターゲット PC の共有フォルダを指定する。
こうしておくと便利でしょう (以下略)
Delphi 2009 / 2010 / XE の場合
- [プロジェクト | オプション] を開く
- [リンク]にある、"リモートデバッグシンボルを含める" を True にする。
- [プロジェクト | 再構築] を行う
- プロジェクトフォルダに *.EXE と *.RSM が生成される。
- ターゲット PC にこの 2 つをコピーする (例: "C:\RD_TEST")。
- [実行 | プロセスのロード] を開く
- [リモート]を選択
- "リモートパス" に、ターゲット PC にある EXE をフルパスで指定する。
- "リモートホスト" に、ホスト名または IP アドレス (\\ は不要) を指定する。
- 下にある "読み込み"ボタンを押す と、ターゲット PC で EXE が実行され、デバッグする事ができます。
デバッグの度に、*.EXE と *.RSM を配布するのが面倒な場合には、
- ターゲット PC のフォルダを共有にする (例: "C:\RD_TEST")。
- [プロジェクト | オプション] を開く
- [Delphi コンパイラ]にある、"出力ディレクトリ" にターゲット PC の共有フォルダを指定する。
こうしておくと便利でしょう (以下略)
Delphi XE2 以降の場合
FAQ
- リモートデバッグサービスに接続できない場合には、以下を確認して下さい。
- ファイルは揃っているか?
- ファイアーウォールで TCP ポート 8000 をブロックしていないか? (XE2 以降の PAServer 場合、デフォルトで 64211)
- アプリケーションの操作はターゲット PC 上で行う訳ですから、開発環境のインストールされた PC はターゲット PC の傍になくてはなりません。本当に遠隔にある場合には VPN を利用するか、VNC 等を併用する事になります。
- Delphi 5 の場合、アップデートを行ったら、リモートデバッガ用ファイルの borlndmm.dll も更新して下さい (リリースノート)。
- BDS 2006 / Turbo Delphi の場合、アップデート対応のリモートデバッガ が用意されています。
- Delphi 2007 の場合、アップデート対応のリモートデバッガ が用意されています。Windows 7 (64bit) でリモートデバッグする場合には "RAD Studio 2007 Debugger Fix for Windows 7" も必要になるかもしれません。
- Delphi 2009 で作成したアプリケーションを Windows 7 (64bit) でリモートデバッグする場合には "Delphi および C++Builder 2009 Hotfix 2" に含まれるデバッガ DLL が必要になるかもしれません。
- Delphi 2010 の場合、アップデート対応のリモートデバッガ が用意されています。
- BDS 2006 またはそれ以降の場合、"($BDS)\bin" 内にあるデバッガ用の DLL と リモートデバッガのインストーラでインストールされるデバッガ用 DLL のバージョンやタイムスタンプが微妙に異なる事があります。
"($BDS)\bin" からの抽出が許されている ようなので、万全を期すためには "($BDS)\bin" から抽出したファイルによる手動インストールの方がいいのかもしれませんね。
まとめ
どこかで、
- Delphi 7 (Win9x 用)
- Delphi 2007 (ANSI 用)
- 最新の Unicode 版 Delphi (Unicode 用)
という具合に「使い分けろ。持っていなければ早めに買え (特に Delphi 7)」 と言っていた理由の一つがリモートデバッガ機能です。開発環境が Windows 2000 以降にある場合で、"Win9x 環境をリモートデバッグできる Pro 版" というのは "Delphi 7" しかないのです。
今更、Win9x アプリを作成する機会はそうそうないかもしれませんが、過去に作ったアプリケーションのメンテナンスはあるかもしれません。そういった可能性がないわけではない方は速やかに "Delphi 7" を確保すべきです (旧 IDE 製品は 2008/12末 ですべてサポートが切れています)。
リモートデバッグ機能をうまく使えば、客先の障害の出る実機に Delphi をインストールして "アクティベーション回数を減らす" なんて事も少なくなるでしょう...もっとも、経験上それが完全になくなるとは思えませんが。