いろいろわからないことが [日常のあれやこれや]
また会社で使う設備用のアプリケーションを久しぶりに書かないといけなくなった。以前書いた残骸を寄せ集めてきてでっち上げようと考えたんだけど、最近はSwiftばかり書いていてObjective-Cをすっかり忘れているのと、homebrewでインストールしたライブラリなんかも使っていて、それらやOS本体とのバージョンが合わなくなってきた。
改めてバージョンを統一して古いコードをコンパイルしようとすると全然通らない。ほんの1年足らずなんだけどまるで浦島太郎である。細かいところをちくちく修正しながらやってるとどうもわからないところがでてきた....
まずcodesignに悩まされる。新しいプロジェクトを作って最初にコンパイルするとこんなダイアログが出る。 Xcodeは知ってるはずなのに、と思いながら「常に許可」ボタンを押す。とすぐ同じところに同じダイアログが出る。ボタンを押し続けても終わらない。そのうちどうやら無限にダイアログが出続けているようで、ボタンの反応がなくなる。しかたないのでXcodeを終了するんだけど、ダイアログは消えない。違うプロセスが出しているらしい。psコマンドやらアクティビティモニタで探してもよくわからない。どうしようもなくなってリブートする。新しいプロジェクトを作るたびにこれを儀式のようにやらないといけない。なにが問題なのかよくわからない。
codesignはまえから苦しんでた。特にhomebrewでインストールしたダイナミックライブラリ(dyld)をアプリバンドルにembedする方法がいまだにわからない。ずっと前のworkaroundのまま本質的な解決に至っていない。
homebrewで入れたライブラリはcodesignされていない。だから自前のsignatureをつけるんだけど、このworkaroundに従うとembedするときに@rpathを書き換えるということをする。するとcodesignしたあとにバイナリが書き換えられた、ということになるので、実行すると「invalid codesign」でクラッシュする。embedしたあとそのバイナリにcodesignしないといけない。
そりゃ当たり前だろ、と言われればそうなんだけど、これがframeworkにembedしてあってそれをアプリバンドルに取り込もうとするとなぜかまた「invalid codesign」になる。frameworkをバンドルに入れるたびに、何も書き変わってないのにも関わらず、frameworkのライブラリにcodesignしなおさないといけない。全然わからない。
開発時点ではcodesignを回避する、ってことできないの?? 別にいいじゃん、他人に迷惑かけるわけじゃないんだし。
まあ、そんなこんなで、やっと実行できるようになって、Instrumentsでリークがないか確かめようとすると、Instrumentsからだとまた「invalid codesign」になる。何にも書き換えてないぜ。どうも必要なライブラリの違うpathに乗っているバイナリをリンクしようとしているらしい。なんでXcodeからとInstrumentsからでpathのたどり方が変わるのかわからない。しかたないので、Xcodeからアプリを立ち上げて、Instrumentsに移ってアプリに接続する、というめんどうなことをしている。その場合当然、接続前のリークは検出できない。
やっとInstrmentsでAllocationsを見ることができると、以前はちゃんとARCが効いていたのに、全く同じソースでぶりぶりリークする。GigEカメラのアプリだと1.4MBあるヒープが1秒に30個とられてそれが解放されなくてどんどん溜まって、もたもたしていると実メモリを食い尽くしてマウスやキーボードに反応しなくなって、強制リブートするしかなくなる。
他にも数msecごとぐらいに48バイトのmallocがリークしてたりする。こういうのって気が付きにくいけど長時間動作させていると実メモリをじわじわ圧迫していく。
調べると、ひとつめの1.4MBリークはObjective-Cのオブジェクトをスレッドを跨いでやりとりするとそのオブジェクトが解放されていないことがわかった。全部の作業をメインスレッドでやるとリークはなくなる。ARCに頼っているので、オブジェクトを手動でリリースする手段がない。どうなってんだ?
このへん、仕様が変わったの?
誰か教えて。
一方の、48バイトのリークの方はいまだに原因がわからない。コールスタックには僕の書いたメソッドがでてこない。一見僕と関係ないように見える。でも違うソースのアプリでは起きなかったりする。ぜんぜんわからん。困った。
改めてバージョンを統一して古いコードをコンパイルしようとすると全然通らない。ほんの1年足らずなんだけどまるで浦島太郎である。細かいところをちくちく修正しながらやってるとどうもわからないところがでてきた....
まずcodesignに悩まされる。新しいプロジェクトを作って最初にコンパイルするとこんなダイアログが出る。 Xcodeは知ってるはずなのに、と思いながら「常に許可」ボタンを押す。とすぐ同じところに同じダイアログが出る。ボタンを押し続けても終わらない。そのうちどうやら無限にダイアログが出続けているようで、ボタンの反応がなくなる。しかたないのでXcodeを終了するんだけど、ダイアログは消えない。違うプロセスが出しているらしい。psコマンドやらアクティビティモニタで探してもよくわからない。どうしようもなくなってリブートする。新しいプロジェクトを作るたびにこれを儀式のようにやらないといけない。なにが問題なのかよくわからない。
codesignはまえから苦しんでた。特にhomebrewでインストールしたダイナミックライブラリ(dyld)をアプリバンドルにembedする方法がいまだにわからない。ずっと前のworkaroundのまま本質的な解決に至っていない。
homebrewで入れたライブラリはcodesignされていない。だから自前のsignatureをつけるんだけど、このworkaroundに従うとembedするときに@rpathを書き換えるということをする。するとcodesignしたあとにバイナリが書き換えられた、ということになるので、実行すると「invalid codesign」でクラッシュする。embedしたあとそのバイナリにcodesignしないといけない。
そりゃ当たり前だろ、と言われればそうなんだけど、これがframeworkにembedしてあってそれをアプリバンドルに取り込もうとするとなぜかまた「invalid codesign」になる。frameworkをバンドルに入れるたびに、何も書き変わってないのにも関わらず、frameworkのライブラリにcodesignしなおさないといけない。全然わからない。
開発時点ではcodesignを回避する、ってことできないの?? 別にいいじゃん、他人に迷惑かけるわけじゃないんだし。
まあ、そんなこんなで、やっと実行できるようになって、Instrumentsでリークがないか確かめようとすると、Instrumentsからだとまた「invalid codesign」になる。何にも書き換えてないぜ。どうも必要なライブラリの違うpathに乗っているバイナリをリンクしようとしているらしい。なんでXcodeからとInstrumentsからでpathのたどり方が変わるのかわからない。しかたないので、Xcodeからアプリを立ち上げて、Instrumentsに移ってアプリに接続する、というめんどうなことをしている。その場合当然、接続前のリークは検出できない。
やっとInstrmentsでAllocationsを見ることができると、以前はちゃんとARCが効いていたのに、全く同じソースでぶりぶりリークする。GigEカメラのアプリだと1.4MBあるヒープが1秒に30個とられてそれが解放されなくてどんどん溜まって、もたもたしていると実メモリを食い尽くしてマウスやキーボードに反応しなくなって、強制リブートするしかなくなる。
他にも数msecごとぐらいに48バイトのmallocがリークしてたりする。こういうのって気が付きにくいけど長時間動作させていると実メモリをじわじわ圧迫していく。
調べると、ひとつめの1.4MBリークはObjective-Cのオブジェクトをスレッドを跨いでやりとりするとそのオブジェクトが解放されていないことがわかった。全部の作業をメインスレッドでやるとリークはなくなる。ARCに頼っているので、オブジェクトを手動でリリースする手段がない。どうなってんだ?
このへん、仕様が変わったの?
誰か教えて。
一方の、48バイトのリークの方はいまだに原因がわからない。コールスタックには僕の書いたメソッドがでてこない。一見僕と関係ないように見える。でも違うソースのアプリでは起きなかったりする。ぜんぜんわからん。困った。
2021-05-01 21:12
nice!(0)
コメント(0)
コメント 0