読者です 読者をやめる 読者になる 読者になる

git merge some-branch したらXcodeのブレークポイント機能が死んだ / GitとXcodeの併用について

xcode
  • Xcode version 3.1.2
  • git version 1.6.2
  • ターゲット
    • 親実行ファイル
    • 子実行ファイル
    • 子実行ファイル *
    • ユニットテスト実行ファイル

みたいなプロジェクト。

ビルド->実行すると

Unable to set breakpoint (null). Make sure to build the file (null) with debugging symbols.
:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\
:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\
:do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\
:le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\
Undefined command: "". Try "help".
Undefined command: "". Try "help".
Undefined command: "". Try "help".
Undefined command: "". Try "help".

みたいなのが大量に吐かれる。 宇都宮隆か!(並のHackerにはできないツッコミ)
これはー、デバッガの知識が要りそうだなー。
ブレークポイント無効とか直接実行すれば起動できるが、もう既にgdbなしではひとりでお買い物にもいけない状態なので困る。
一応PROJECT.xcodeproj 以下が怪しいのではないかと思ってみてみる。

PROJECT.xcodeproj
|-- USER.mode1v3
|-- USER.pbxuser
`-- project.pbxproj

3ファイルのみの構成。それぞれの役割を知りたい。

project.pbxproj

カレントプロジェクトの設定が保存されている。
このグループは実際はこのパスにありますよー、とか
このバージョンのSDK使いますよー、とかXcode上から設定できるものが収まっていた。

USER.mode1v3

Xcodeプロジェクト自体に関連づけられているplistファイルというかんじだった。あんまりユーザーが意図的にいじるものではなさそう。

USER.pbxuser

project.pbxprojのユーザー固有の値を設定するファイルかなあ。
適当に git grep breakpoint としたらなんか以下のように大量に定義されていた

        07B640D10FAAF2830073B91A /* ItemViewController.m:135 */ = {
isa = PBXFileBreakpoint;
actions = (
);
breakpointStyle = 0;
continueAfterActions = 0;
countType = 0;
delayBeforeContinue = 0;
fileReference = 07384B640FA748F1009A52CC /* ItemViewController.m */;
functionName = "-loadview";
hitCount = 0;
ignoreCount = 0;
lineNumber = 135;
location = "PROJECT";
modificationTime = 263541762.269287;
state = 2;
};

実際はこの設定かファイル全体のパースエラーが生じて、デバッガに投げるコマンドが不正になってエラーが返ってくる? と推測してみた。
"Unable to set breakpoint (null) "とかでてるし。

stringsファイルは,テキストエンコーディングUnicode (UTF-16) で,そのままだとsvnにバイナリとみなされちゃう。stringsファイルは,UTF-8に変換しても実用上問題ないのだけど,Appleもどこかの文書で Unicode (UTF-16) にするように指示していた (ように記憶している。ソースは失念) し,Xcode.appやnibtool, genstringsなどが生成するstringsファイルはデフォルトでUTF-16なので,そのままUTF-16で通したい。svnにバイナリと認識されても,まあ不都合はないけど,なんとなく美しくないなあ…と。
なるほど。git側の知識も必要そうだなー。

PROJECT.xcodeproj 内のファイルを管理対象から除外しておく

参考
iPhoneアプリをgitで管理する場合の.gitignore - Hello, world! - s21g

build/ は以前から除外済み。

ただ、そうするとビルドディレクトリを変更したいときに困る。その場合は <username>.pbxuser を default.pbxuser にリネームして svn add するとよい。
ユーザー設定がない時はdefault.pbxuser を見てくれるということかな。
なのでユーザー名を指定した。

.gitignore-myiPhoneOSProject.sample
*.xcodeproj/USER.mode1*
*.xcodeproj/USER.pbxuser
build/

.pbxuserを一旦退避させて初期化を試みる

実行。

Re-enabling shared library breakpoint 1
Re-enabling shared library breakpoint 2
Re-enabling shared library breakpoint 4
Re-enabling shared library breakpoint 5
Re-enabling shared library breakpoint 6
Re-enabling shared library breakpoint 7

なんだろうこれは。3でアホになったのだろうか。
初期化前は起動しなかったが、今回アプリケーションは起動した。
ブレークポイントを示す青いチェックがまだのこっている。キャッシュクリーン? -> かわらず
試しにAppDelegate.mの冒頭にブレークポイントを貼ってみる。-> ちゃんと効いた。
ということは .pbxuser 以外のファイルにカスが残っているのか。

再作成された.pbxuseと diff取ってみる。-> よくわからんげ。

つづく。