Xcodeでのリモートデバッグ

Xcodeではリモートデバッグの機能が入っています。Xcodeのヘルプでも解説されています。ただ、ヘルプに書かれている方法ですと、デバッグするプログラムを動かすマシンとデバッガを動かすマシンの両方からアクセスできる、共有フォルダをサーバーに用意する必要があり面倒です。また、サーバーのOSによっては、Xcodeの中間ファイルを作成できないことがあります。共有フォルダを用意しない場合は、ビルドしたバイナリをデバッグするプログラムを走らせるマシンにコピーするとなっています。これはもっと面倒です。
少し調べてみると、共有の場所にあることは必須条件ではなく、デバッグするプログラムが動作するマシンとデバッガを動かすマシン上のどちらからみても、デバッグするプログラムとプロジェクトファイルやソースファイルのファイルパスが一致していればよいということのようです。
それなれば、次のような方法でもできるはずと考えました。

  1. デバッグするプログラムを動かすマシンはヘルプ通りにSSHでログインできるようにする
  2. プロジェクトファイルとソースファイル一式がある、デバッガを動かすマシンは「ファイル共有」を有効にする
  3. デバッグするプログラムを動かすマシン上でデバッガを動かすマシンに「ファイル共有」で接続する
  4. 「ファイル共有」で接続したら、「シンボリックリンク」を「ファイル共有」で接続したマシンに張るようにして、ファイルパスが一致するようにする
  5. ヘルプ通りにリモートデバッグを行う

試してみると、予想通りにうまく動きました。この記事では、防備録も兼ねて上記手順について詳しく記述します。

SSHの準備

ヘルプに従って行います。まず、デバッガを動かすマシン上でターミナルを開き、次のように入力して、SSHのキーを生成します。

画面の指示に従って、秘密鍵と公開鍵を作成します。デフォルトのままであれば、ホームディレクトリに「.ssh」というディレクトリが作成され、その中に秘密鍵(「id_dsa」ファイル)と公開鍵(「id_dsa.pub」ファイル)が作成されます。
なお、Mac OS Xのバージョンによっては、「dsa」タイプの鍵では動作しないことがあります。その場合は、次のように「rsa」タイプの鍵を作成して使用します。

次に公開鍵をログインするマシン(デバッグするプログラムを動かすマシン)にコピーします。デフォルト状態で作成される「.ssh」フォルダは不可視フォルダなのでFinderの「移動」メニューから「フォルダへ移動…」を選択し、フォルダパスに「~/.ssh」と入力します。「.ssh」フォルダに移動するはずですので、公開鍵ファイルをコピーします。
ログインするマシン上では、公開鍵ファイルは「authorized_keys」というファイルに格納します。コピーした公開鍵ファイルをテキストエディタで開き、ログインするマシン上のログインするときに使用するユーザーのホームディレクトリ内の「.ssh」フォルダ内の「authorized_keys」ファイル内にペーストします。このファイルはログインできるユーザーの公開鍵を入れるファイルです。1行に1公開鍵という形で記述します。無ければ、作成してもかまいません。「.ssh」フォルダも無ければ作成してください。Finderでは「.」から始まる名前のフォルダは作成できませんので、フォルダの作成はターミナルから「 mkdir」コマンドで行います。

次に、ログインするマシンの「システム環境設定」から「共有」を開き、「リモートログイン」を有効にします。
ここまでできたら、一度、デバッガを動かすマシンから、SSHで接続してみてください。SSHで接続するには、ターミナルで次のように入力します。

IPアドレスはMac通しであれば、「マシン名.local」でも大丈夫です。社内システムの設定があれば、それを使ってください。
初めてログインするときには、「known_hosts」ファイルに登録してもよいか、聞いてきますので、「yes」と入力します。次にパスワードを入力するようにプロンプトが出ますので、鍵生成の時に使用したパスワードを入力します。このときプロンプトに鍵ファイルのファイルパスが表示されれば、鍵の登録に成功しています。

ファイル共有を有効にする

デバッガを動かすマシンの「ファイル共有」を有効にします。「システム環境設定」から「共有」を開き「ファイル共有」を有効にします。
次に、デバッグするプログラムを動かすマシンからデバッガを動かすマシンにファイル共有で接続します。
接続したら、シンボリックリンクを張ります。
例えば、「/Users/Someone/Documents/MyProject」というフォルダにソースファイル、プロジェクトファイルなど一式が格納され、ビルドされたプログラムも「/Users/Someone/Documents/MyProject/build」以下に保存されるとします。
そして、「ファイル共有」でマウントしているボリューム名が「Someone」だとします。(ルートディレクトリをマウントした場合は「MacintoshHD」など、起動ディスクのボリューム名です)
この場合であれば、デバッグするプログラムを動かすマシン上で、ターミナルを開き、次のように入力します。

ただし、デバッグするプログラムを動かすマシン上に、「/Users/Someone/Documents」フォルダがない場合は、シンボリックリンクを作成する前にこのフォルダを作成しておきます。

Xcodeでの設定

Xcodeでの設定はヘルプ通りです。Xcodeの「グループとファイル」で「実行可能ファイル」の中にある、プログラムをダブルクリックして設定を開き、「デバッグ」タブの「sshを使って実行可能ファイルをリモートデバッグする」にチェックを入れます。
接続先には、先ほどSSHのテストに使ったのと同じものを使用します。入力する構文も同じで次のようにします。

自動的に「使用する標準入出力」が「パイプ」になりますが、そのままにしておきます。

実行

後は普通にデバッグ実行すると、SSHでログインされる先のマシン上でプログラムが起動します。初めて実行するときは、SSHのアカウントを入力するように表示されますので、ユーザー名とパスワードを入力します。

OSのバージョンが違っても大丈夫か?

GDBさえ入っていれば、OSのバージョンが違っても大丈夫です。GDBはXcodeと一緒にインストールされます。
今のところ、私が試したことのある組み合わせは次のようなものです。
デバッガを動かすマシン: Mac OS X 10.4.11
デバッグするプログラムを動かすマシン: Mac OS X 10.3.9, Mac OS X 10.5.0, Mac OS X 10.6.1

ソースを修正して再ビルドしたら起動しなくなった

場合分けはよくわからないのですが、ソースを修正して再ビルドすると「dyld」まわりのエラーが出て起動しなくなることがあります。その場合は、実行ファイルをビルドするターゲットだけ「クリーン」を実行してからビルドすると動くようになります。
私の経験では、フレームワークを内包するプロジェクトでよく起きるような印象です。

関連記事

  1. RKDetailDesign 1.6.3

  2. PostgreSQLのセットアップ

  3. Snow Leopard ServerでのRedmineのバックアップ…

  4. Mac App Store版に乗り換え後の認識エラー?(解決)

  5. ディスプレイの下に空間が出来ました

  6. MOSADeN Online 第19回の原稿アップしました

最近の著書

  1. 基礎から学ぶ SwiftUI

最近の記事

  1. 基礎から学ぶ SwiftUI
  2. 基礎から学ぶ SwiftUI