By | 2015年5月4日

最近は Tuna をもっぱら作っているのですが、DebggerUI.ideplugin を使いたくて少し試行錯誤したのでメモを残しておこうかなと思います。

そもそも ideplugin とはなんなのか

Xcode の Plugin として、この形式で提供されています。
/Applications/Xcode.app/Contents/PlugIns 以下にあります。

組み込み方

最初は framework みたいに project に追加すれば使えるようになると思ったのですが違うみたいです。
そうすると以下みたいなエラーがでます。

Undefined symbols for architecture x8664:
"
OBJCCLASS$IDEBreakpointEditorPopoverViewController", referenced from:
objc-class-ref in Tuna.o
ld: symbol(s) not found for architecture x86
64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

シンボルがみつからないようですね。

しばらくググると、「Question about linking a framework(ideplugin)」にいきつきました。
これを見る限り、どうやらこのままだと Resource のコピーしか行われないです。

DebuggerUI.ideplugin の場合ですと

  1. /Applications/Xcode.app/Contents/PlugIns/DebuggerUI.ideplugin を project に追加 (Resource のコピー)
  2. /Applications/Xcode.app/Contents/PlugIns/DebuggerUI.ideplugin/Contents/MacOS/DebuggerU を project に追加 (これ重要!)

これでめでたく使えるようになりましたとさ。

余談

使い方はバイナリからヘッダーを出力する class-dump というコマンドを使います。
これでヘッダーを出力して後はヘッダーから使い方を推測して、トライアンドエラーを繰り返します。

class-dump /Applications/Xcode.app/Contents/PlugIns/DebuggerUI.ideplugin

class-dump でヘッダーを出力しているからあれなんですが、型が id だらけなので本当につらいですね。
これをやっていると、はやく型がある世界にもどっていきたい衝動にかられます。

あと、メジャーなクラスだと github で検索すれば使い方がわかるんでいいんですけど
Breakpoint 関連のクラスは全くないのがとても悲しいです。

とはいえ Tuna 自体、着々とバージョンアップしていっているのでよければ使って頂ければと。

ではでは。

追記 2015/07/09 21:30

Alcatraz からインストールするとビルドに失敗してました。
理由としては DebuggerUI.ideplugin が Xcode 上、相対パスになっていたためビルド時に clang: error: no such file or directory: になっていたためです。

というわけで絶対パスに変更して解決しました。
ideplugin を使う際は気をつけないといけませんね。

あと、Alcatraz からインストールして動かない場合は以下のコマンドを実行して挙動を確認することができます。

$ cd "~/Library/Application Support/Alcatraz/Plug-ins/Tuna"
$ xcodebuild clean build