Xcodeのブレークポイントで響子さんにシャウトしてもらおう

More than 1 year has passed since last update.

Xcode ではブレークポイントの停止時に音を鳴らしたり、特定のデバッガーコマンドを実行したり、シェルを実行したりといったアクションをブレークポイントごとに細かく指定できます。今回はLog Message Actionを使って音声でブレークしたことを通知してみます。ちなみにタイトルの響子さんというのはMac OS Xの標準の読み上げボイスの名前がKyokoなのでアテで書いただけです。Kyokoさん以外にもOtoyaくんやKathyさんなどいろいろあります。

Xcodeのブレークポイント

Xcodeのブレークポイントは開発者であれば使ったことが無い人は居ないでしょう。プログラム実行中に指定した行で実行を中断するためのデバッガーの機能です。設定は簡単。中断したいプログラム行の行番号をクリックするだけ。一度クリックで追加。もう一度クリックで一時的に無効化。削除したい場合は右クリックで「Delete Breakpoint」を選択するか、ドラッグ・アンド・ドロップで左右に追いやる。簡単ですね。また、設定したブレークポイントはブレークポイントナビゲーターで一覧表示できるのでソースコード中に散らばったブレークポイントもここで一元管理できます。

  • Breakpoint Navigator
    151206-0001.png

ブレークポイントの Action 設定

今回はブレークポイントを右クリックで「Edit Breakpoint」を選択し、ブレーク時の Action (挙動)を細かく設定してみましょう。

  • 行数表示部分のブレークポイントを右クリックして「Edit Breakpoint」を選択。
    151206-0001.png

  • ポップビューが表示されるので「Add Action」ボタンをクリック。
    151206-0001.png

  • 「Log Message」をクリック。
    151206-0005.png

Log Message Action で設定できること

Log Message Action は名前の通りログメッセージをコンソールに出す目的で使用されますが、オプションの「Speak message」を選択することによって指定したメッセージを読み上げてくれます。

151206-0005.png

メッセージは固定だけでなく %B でブレークポイントのスコープ名(メソッドの中であればメソッド名的な)、%H でブレークポイントを通過した回数などがパラメータとして用意されています。また、@〜@の中にコードを入れることでランタイムで評価した値を読み上げてもらうことも可能です。

例えば以下のようなメッセージを設定した場合、

%Bで、%H回目のブレーク。ただいま@[NSDate date]@です。

ブレークポイントに停止した際に、次のような文章を読み上げてくれます。

-viewDidLoadで、1回目のブレーク。ただいま2015-12-06 04:31:14 UTCです。

say!

さて冒頭で Kyoko さん以外のボイスを紹介しましたが、残念ながら Log Message Action では声まで変えることはできません。なので、Shell Command で Mac OS X 標準の say コマンドを呼び出しメッセージを読み上げるようにします。方法は簡単で、ActionをShell Commandに変更し次のように設定すれば、say コマンドに文字列が渡ります。このとき -v オプションで名前を指定すれば Otoya や Kathy の声で読み上げてくれます。

  • コマンド
    /usr/bin/say
  • オプション
    -v, Otoya, "%Bで、%H回目のブレーク。ただいま@[NSDate date]@です。"

151206-0005.png

ところでsayコマンドのボイスですが、いつのまにか他のボイスが選択できなくなっていました。選択するには追加ダウンロードが必要で、システム環境設定→「音声入力と読み上げ」→「テキスト読み上げ」→「システムの声」から、事前に追加ダウンロードしておく必要があります。

151206-0011.png

使いドコロ

ここまで読んで全然実用的じゃ無いじゃん!って思った方。いえいえ。意外と使いドコロありますよ。
ブレークポイントって実機でテストしているとiPhoneの画面に集中しててbreakしてることに気付かないことってありませんか?
そういう時に響子さんにシャウトしてもらえば良いんです。しかもブレークポイントってポーズさせないことも出来るんです。普通だとあまり意味がないですが、ブレイクせずにシャウトだけしておけば、アニメーションとか複数の通信シーケンスを邪魔せず、ブレークポイントの通過を知らせてくれます。このロジックちゃんと通ってんのかな?って不安になるような時でもコードカバレッジを手軽に確認できるのは良いですね。

151206-0011.png

以上、ネタに走ったつもりが意外とまじめな実用ネタでつまらなくなっちゃいましたが、お試しあれ!