Xcode におけるオブジェクトのデバッグ

オブジェクトのビルドに関する管理は完了しました。そして、今度はそれを実行する楽しみがあります。そして・・Maxがクラッシュしてしまう。このクラッシュを速やかに修正するために、オブジェクトをデバッガ上で走らせたいのではないでしょうか。このセクションでは、Xcodeによるデバッグを確実に成功させるためのポイントについて述べてみましょう。

オブジェクトのためのパッチを作る

まず最初に、Max/MSPのレギュラーバージョンはそのコピープロテクションの問題があるため、デバッガ内で実行することができないことを知っておいて下さい。そのため、デバッガの中でオブジェクトを使用するためのパッチを作る必要があります。これはなかなか扱いにくい問題です。あなたのオブジェクトがロード時にクラッシュを引き起こし、しかも、それがサーチパス内にあるため、パッチを作ることも、セーブすることもできません!そこで、あなたのオブジェクトをサーチパスの外に出し、Maxを起動してオブジェクトボックスにあなたのオブジェクトの名前をタイプします。この場合、エラーが表示され、オブジェクトボックスは動作しないのですが、パッチを保存することはできます。残念なことに、このニセモノのオブジェクトには、いかなるメッセージを接続することもできません。

このことから、開発するオブジェクトのインスタンスを最初に得ようとする場合、そのオブジェクトが存在するパッチを作っておき、デバッガの中で MaxMSP Runtime によってそのパッチを開く必要があります。そして、特定のメッセージに関してのデバッグを行いたい場合には、あなたのオブジェクトがロード可能な段階までこぎつけた後、パッチを(ロードされるオブジェクトがサーチパス内にある状態で)MaxMSPで開き、メッセージボックスを追加して保存した後、デバッガ内のMaxMSP Runtimeで再度開いて下さい。この一連の作業は、確かに、ちょっと不便なものですが、ソースコードレベルのデバッグによって取り扱わなければならない多くのプログラミング上の問題に比べれば、一般的に言ってさほどのことではないでしょう。

もう1つの他のアイデアは、あなたのオブジェクトのために良いヘルプファイルを作り、デバッグ用のパッチファイルとして使用することです。

訳注:前もってテスト用パッチや、ヘルプファイルを作成する場合には、次のような方法が考えられます。

  • あらかじめ、開発したいオブジェクトと同じ、インレット、アウトレットを持つダミーのサブパッチを、オブジェクトと同じ名前で作ります(inlet、outlet オブジェクトを必要な数だけ配置します)。

  • ダミーのサブパッチをサーチパス内に置いてMaxMSPを起動し、オブジェクトボックスにダミーの名前をタイプします。これで、オブジェクトが存在するようにMaxMSPを「騙す」ことができます。それに対して必要なメッセージボックスやナンバーボックス等を接続し、テスト用パッチとして保存します。

  • このパッチを、デバッグで使用する MaxMSP Runtime のサーチパス内に置くことによって、デバッグ用のパッチとして使用することができます。

MaxMSP Runtime を実行用に設定する

プロジェクトウィンドウを最前面にして、プロジェクトメニューから「新規カスタム実行可能ファイル」を選択します。実行可能ファイルはデバッグをクリックしたときに動作するアプリケーション、もしくは他のコマンドのことです。

「アシスタント」というラベルを持ったウィンドウが現れます。実行可能ファイル名にはMaxMSP Runtime(これはどんな名前でも構いません)といったようなものを設定します。それから、選択... ボタンをクリックし、使おうと思うMaxMSP Runtimeのコピーの場所を指定します。これは、あなたのエクスターナルオブジェクトをそのサーチパス内に持つコピーでなくてはなりません。必要ならば、MaxMSP Runtimeをビルドフォルダにコピー(または、オブジェクトのインストールに関するビルド設定で述べた sysbuild を使用)することもできます。

その次にある「プロジェクトに追加」メニューであなたのプロジェクトファイル名を確認して下さい。

「完了」をクリックして下さい。インフォメーションウィンドウに「MaxMSP Runtime」が実行可能ファイルとして表示されているのがわかるでしょう。ここで設定をカスタマイズすることができますが、すべてのデフォルトの設定はうまく動作します。ウィンドウを閉じて下さい。

注:実行可能ファイルの設定は、すべてメインプロジェクトファイルではなく、プロジェクトのユーザ初期設定ファイル(prject.pbxproj) に保存される点に注意して下さい。そうでなければ、私たちはサンプルプロジェクトの中でこれを用意しました!

デバッガの起動

Xcodeでは、Codewarriorと違ってデバッグコマンドは実際には「ビルドしてデバッグ」を意味します。デバッグの前にオブジェクトのビルドを行わない設定を選択することが可能です。これは、オブジェクトをテストする以前に手動で他の場所にコピーした場合などに、かなり役に立ちます(Xcodeのインストール機能を使ってこういう事態を避けることは少なからずあると思いますが、何らかの理由でそれが不可能になることもあるかも知れません)。Xcodeデバッガのもう1つのすばらしい点は、コンパイラやリンカがビルドした場所以外の所でも、あなたのコードを見つけることができるようであるということです。

設定した実行可能ファイルを起動する前に、ブレークポイント(オブジェクトがロードされるときに、デバッガが停止するような場所)を追加したいと思うことがあるかもしれません。ソースの停止させたい行の左側の狭い列をクリックして下さい。矩形のような矢印が現れます。この矢印がダークグレーの場合、ブレークポイントが設定されたことを示しています。矩形状の矢印をもう一度クリックすると、そのブレークポイントが働かなくなります。また、ブレークポイント上で [control] + クリックを行うと、ブレークポイントを取り除くためのコンテキストメニューが表示されます。

プロジェクトウィンドウを最前面にして、デバッグメニューから「デバッガ」を選択します。「デバッグ」ボタンをクリックします。設定した実行可能ファイルが起動します。必要なら、あなたのオブジェクトを含むパッチをMaxMSP Runtimeから開くことができます。デバッガは、あなたが設定したブレークポイントで停止します。

デバッガを起動する際、時々クラッシュすることがあるので、その点は覚えておいて下さい。このとき、多くの場合「不正なスタック」メッセージ ("corrput stack") が表示されます。私たちの経験では、デバッガを再び起動させれば良くなっているようです。これは PowerPCより Intel の場合により多く起きるようです。

コンソールへの表示

オブジェクト開発中に特に役に立つものの1つに、コンソールへのプリントデバッグやステータスメッセージの表示があります。Max には組み込み関数 cpost() があり、これはMacでもWindowsでも使用できます。しかし、Mac上のオブジェクトだけをデバッグする場合、次の例のように、UNIXの組み込みライブラリ関数 fprintfを stderrに対して使用することができます。

fprintf(stderr, “variable is %ld”,my_variable);

しかし、デバッガ内からコンソールに表示させる場合、標準のコンソールアプリケーションでは出力は表示されません。その代わりに、デバッガのコンソールにリダイレクトされるので、Xcodeデバッガウィンドウのコンソールボタンをクリックして見ることができます。(ボタンが表示されていない場合は、ボタンの並んでいる欄の右端にある矢印をクリックしメニューからコンソールを選択しますーこのユーザインターフェイスはMaxのパッチャーウィンドウをベースにして設計したのでしょうか?)

ブレークポイントで停止する代わりにコンソールへメッセージを表示させる方法があります。これは役に立つかも知れません。