リモートデバッグを行う
特定の 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 をインストールして "アクティベーション回数を減らす" なんて事も少なくなるでしょう...もっとも、経験上それが完全になくなるとは思えませんが。