Objective-C ARCのデバッグの保持

標準のデバッグツールでは不十分な場合があります。

たとえば、iOS 4.1では、シミュレーターでvalgrindを使用できました。 また、Lion x86_64およびiOS 5では、valgrindはすでに動作を停止しています。
これは、64ビットアーキテクチャとシミュレーターの変更によるものです(valgrindでは、
欠陥)。

ARCへの切り替えにより、保持デバッグ方法はなくなりました。

- (id) retain { // Break here to see who is retaining me. return [super retain]; } 



私の場合、clangコンパイラのハックはこの状況から抜け出す方法になりました。

構成:
プラットフォーム:Lion x64_86
Xcode:4.2.1 4D502
クラン:318.0.58 i686

1.コンパイラーのバージョンを調べる

 $ clang --version Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn) ... 

2. Apple Open Sourceからclangバージョンをダウンロードして抽出します

http://opensource.apple.com/tarballs/
クラング/

お使いのバージョンではない可能性があります。この場合、可能な限りダウンロードしてください
おおよそ、より良い方が新しいです。

 $ tar xzvf clang-318.0.45.tar.gz 

3.パッチclang

objc_retainの標準呼び出しをobjc_retain1に置き換えます。

 clang-318.0.45/src/tools/clang/lib/CodeGen/CGObjC.cpp:1554 > "objc_retain1"); 

4. clangを収集します

 make RC_ProjectSourceVersion=1 RC_OS=macos RC_ARCHS=i686 TARGETS=i686 SRCROOT=`pwd` OBJROOT=`pwd`/build/obj DSTROOT=`pwd`/build/dst SYMROOT=`pwd`/build/sym 

アセンブリは権利エラーで失敗します。

 chown: src/apple-gcc/1/clang-318.0.45/build/obj/stage1-install-x86_64/lib/c++: Operation not permitted make[4]: *** [do-installhdrs] Error 1 ... make[1]: *** [install] Error 1 

インストールが機能しなかったのは大丈夫です-主なものはバイナリであり、それらは受信されます。

 build/obj/stage1-install-x86_64/bin/clang 

Appleのスクリプトはユニークです。おそらくこれは、正しいパラメーターを指定することで解決できます。
多分そうではありません(たとえば、gccをビルドするには、build_gccにパッチを適用して無効にする必要がありました
組み立て後のインストール)。

注意! README.TXTで指定された方法を使用してgccまたはllvm-gccをビルドすると、デフォルトでmake installが実行され、オリジナルが上書きされます。
したがって、アクションを実行する前に、/のバックアップコピーを作成する必要があります
開発者/プラットフォーム/ iPhoneSimulator.platform /開発者/ usr /。
Clangは、ビルド構成が異なるためテストされていません(テスト済み
バージョンclang-318.0.45)。

5. clangをインストールします

オリジナルを保存し、新しいものへのシンボリックリンクを作成します(シンボリックリンクのみ、そうでない場合はエラーが発生します)
Developer / usrとstage1-install-x86_64の違い/)。

 $ cd /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin $ mv clang clang.orig $ ln -s clang-318.0.45/build/obj/stage1-install-x86_64/bin/clang 

できた 完全な作業を行うには、clangの2つのバージョンが必要です。 変更なし(なし
パッチ3)-デバッグを必要としないほとんどのファイルを収集します。 そして
変更-ARCがデバッグするファイルを保持します。 選択してください
Xcodeのアセンブリのバージョンは手動である必要があります

 #   $ ln -s clang-318.0.45/build/obj/stage1-install-x86_64/bin/clang #  ,     clang.new $ ln -s clang-318.0.45/build/obj/stage1-install-x86_64/bin/clang.new clang 

コンパイラのすべては明確になりましたが、今はプロジェクト次第です。

関数objc_retain1をプロジェクトファイルに追加します。
(バックトレースを印刷):

 id objc_retain(id o); void *objc_retain1(void *o) { static void *b[10]; static int z = 10; static int n; static char **c; n = backtrace(b, z); c = backtrace_symbols(b, n); NSLog(@"objc_retain(%p):", o); for (int i = 0; i < n; i++) { NSLog(@"%s", c[i]); } return (__bridge void *)objc_retain((__bridge id)o); } 

この関数では、ブレークポイントを設定して、オブジェクトの小さな誘n犯をキャッチできます。

次に、キャッチされないように、変更されていないコンパイラを使用してプロジェクトを収集します
すべてのオブジェクトを保持します(元のコンパイラーによってコンパイルされたファイルを削除するためにクリーンアップを行うことを忘れないでください)。
コンパイラを変更したものに置き換え、目的のファイルを保存し、収集して
シミュレータでのデバッグ。

CGObjC.cppファイルには、インターセプト可能な他のARC関数が含まれています。
(同時にARCの内部世界を研究した)。
ARCの詳細とリンク:
http://clang.llvm.org/
docs / AutomaticReferenceCounting.html

*パスはSDKのバージョンによって異なる場合があります

Source: https://habr.com/ru/post/J148099/


All Articles