入門
iOSの開発は、我々はそれが、デバッグの過程にある場合、あなたは印刷またはブレークポイントデバッグ機能を介して重要な情報が、いくつかの非複雑なモジュールのために、今、このような異常が崩壊することがあり、事態の異常終了にプログラムに遭遇します途中、時には困難な問題を特定するために、だけでなく、アプリケーションのために、この方法では無力である、オンライン公開されています。
通常、我々はクラッシュの2つのタイプに分け参照、1は、トリガ、システム・メモリ・エラーですEXCを_ BAD _ ACCESSは、プログラムが間違ったメモリアドレスにアクセスで実行されて引き起こされ、他方は処理できない異常信号の登場です、に自分自身を送信するためのプログラム引き起こしSIGABRTの信号の崩壊を、ここで私は通常、あなたと共有するために、より多くのクラッシュのアプローチを使用しているものです。
メモリエラーによって引き起こされるクラッシュ:パート1
➸1.1原因
- アクセス・メモリ・アドレスは、このプロセスには属していません。
- アクセスは、メモリ(リピート解除すでに解放されたメモリを)解放されました。
iOSの開発が動作しない非NSObjectのオブジェクトの参照カウントメカニズムのための参照カウントメカニズムを使用してメモリ管理、NSObjectのから継承し、我々はメモリの回復の使用を管理する必要があります。参照カウント原理は、(保持)オブジェクトが保持されているときことで、その参照カウント(retainCount)+ +1、一度(リリース)をリリース標識、retainCount -1 retainCountが0である場合、一度、オブジェクトが解放されます。
マニュアル参照カウント(MRC)の開発を使用する場合は、開発者が明示的に保持または解放呼び出す必要があります。iOS5を自動参照カウント(ARC)の後、Appleの実装は、開発者は、明示的に便利な開発者には、保持または解放し、コンパイラによって自動的に追加呼び出すために持っているだけでなく、開発の難しさを低減していないメモリの問題ときながら、エラーを見つけることが難しいです。
一般的な治療法➸1.2
Xcodeの1.2.1グローバル例外ブレークポイントの追加
①ナビゲータビューのブレークポイントナビゲータービューに切り替え時:
②左下、+記号をクリックし、選択の例外は、ブレークポイントこのオプションを選択します。
③ 例外ブレークポイントは、このようなスクリプトの実行など、多くの機能を、編集、出力ログのみ異常処理Objective-Cの、等を選択することができ、機能は非常に豊富です。
私たちは、プログラムがクラッシュを実行して、次回は、プログラムが自動的に問題を見つけ、私たちを助けるために、コードの崩壊で停止します。
オブジェクトのデバッガ1.2.2ゾンビ
グローバル例外ブレークポイントは、通常、クラッシュ、特定のタグの原因を見つけます。しかし、現在のコールスタックの崩壊ではない場合、システムは、私たちだけのクラッシュアドレスを伝えることができますが、我々は、エラーを修正することができないように、特定のコードを見つけることができません。これは、次のようになります。
このケースでは、問題を発見しようとするXcodeのゾンビオブジェクトが提供する(ゾンビオブジェクト)をデバッグすることができます。
①第一またはオープンXcodeのXcode-> Preferencese選択し、画面の左上隅、行動タブは、出力について設定し、より多くの情報、次のスクリーンショット、フック用の出力をデバッグするときに:
②メニュー製品>スキーム>編集スキームの3つのオプション中の赤い円の中にフック上にあります:
場合③オプションをオンにした後、実行時に、オブジェクトへのアクセスがリリースされている、それは問題の特定に役立つことができ、より正確な位置情報を提供します。
この機能の原理はゾンビがリリースされるオブジェクトで、元のオブジェクトを置き換える組み込みオブジェクトを使用して、(retainCount 0)をリリースしています。どんなにメッセージがオブジェクトに(関数呼び出し)を送信しているもの、それはデバッグ情報をスローされた例外をトリガしません。
注意:この機能をオフにし、問題が修復されて覚えておいてください!これは、プログラム・メモリ・フットプリントが異常原因となります。
④また、システムを介してであることができる端末は、端末の呼情報を用いて印刷mallochistory 30495は、プロセスpidで、pidはXcodeのコンソールログに見る、またはアクティビティモニタを介して得られる、に記載することができるような「mallochistory 30495 0x60005ef76fd0」などのコマンドを、このレコードは、概ね、エラーコードの位置を決定することができます。
次のヒントはいくつかの重要な情報に応じて、エラーの特定の場所を識別することができ、コードのようになります。
1.2.3使用NSSetUncaughtExceptionHandler処理
二つの方法は、APPのオンライン無力のために言うことができる前に、大丈夫、iOSのは、プログラムが起動するときに我々は、このハンドラを追加することができ、処理API例外が発生するようなプログラムの異常発生をNSSetUncaughtExceptionHandlerを提供したときに、彼これは、プロセスのこの部分は、開発者へのタイムリーなフィードバックに必要な情報を作ることができます。NSSetUncaughtExceptionHandlerクラッシュを使用することにより、異常の治療に使用することができる、ということに注意してください、システムはグローバルな例外ハンドラNSSetUncaughtExceptionHandler方法により提供されるレポートをクラッシュします。カスタムNSSetUncaughtExceptionHandlerモニターイベントは、サードパーティ製の監視(例えばBuglyなど)の故障につながる場合は、サードパーティが小さなパートナーを監視するためのプラットフォームを統合されている注意を払う必要があります。
① 例外を処理するハンドラグローバル変数の登録は、プログラムが起動するか、他のエントリ登録:
②オンラインプログラムがクラッシュを表示されたら、コードは以前における登録処理するために実行され、エラーメッセージは、ローカルに保存されます。
③オンラインアプリによって救わdSYMシンボルテーブルのルックアップの問題。
それは関数名、ファイル名、行番号のマッピングテーブルのメモリアドレスがあるとき建設のiOSシンボルテーブルが生成されました。次のようにシンボルテーブルの要素は次のとおりです。
アプリケーションのクラッシュは、我々はソースコードに対応したクラッシュ・スタック情報の間に得られたスタック情報を使用することができたとき、あなたはまだ行でエラーコード番号を確認することができ、我々はすぐに問題を迅速に解決するために、エラーコードの場所を見つけることができます。
エラーログdSYMのシンボルテーブルに取得し、プログラムがクラッシュする前に、我々は問題を見つけることができます。
④使用ATOSはするコマンドの問題を探します。
ATOSは、特定のモジュールのシンボリックアドレスATOSをロードするためのコマンド[-archスキーマ名] [シンボル表-O] [-lモジュールアドレス] [方法住所]
ターミナルを使用して計算し、最初は16進数アドレスの範囲を取得します。
ターミナルのコード実行:
この方法では、問題のコードを見つけることができます。
パート2:マッハ誘発性異常信号とクラッシュ信号
➸2.1マッハと信号
マッハは、マイクロカーネルコアのMac OSとIOSのオペレーティング・システムであり、マッハ異常は、カーネルレベルの例外の最も低いレベルであるので、異常なAPP、例外を聞くことができるように最初は、マッハである場合。
1枚目の撮影マッハ例外すべての例外は、次の対応するUNIX信号に変換され、スレッドエラーに送られます。これは後には、信号をキャプチャするために、あなたが聴きたい信号の種類を登録することができます。例外処理は、あなたがそれに対処したい場合は、信号を得ることができないのObjective-Cを使用している、我々は標準的なUNIXのシグナル機構ように登録されたハンドラSIGABRT、SIGBUS、SIGSEGV信号の生成とを使用する必要があります。私たちは、出力スタック情報をできる機能、そして私たちが望むすべてのものの他の情報バージョン。:モニタ信号SIGSEGVこと、SIGSEGV信号が存在する場合、それは方法mySignalHandlerコールバックします生成され、次のシグナル (SIGSEGV、mySignalHandlerを)。
➸2.2信号の信号の説明
5の合計を処理する信号のデフォルトの方法、それぞれ終了(プロセス、即ち結び目イースト処理を終了)、(信号を無視する)無視し、プロセスを終了し、コアダンプ(ダンプ:プロセスの終了およびコア・ダンプを生成し、メモリ情報処理表現するために、ストップ(デバッグのために使用されるプロセスを実行する一時停止)と続き(複数のデバッグを実行する前に中断処理を再開))、それをプリントアウト。
信号信号の種類:
信号名 |
デフォルトの処理 |
説明 |
SIGABRT |
ダンプ |
プログラムの終了コマンド |
SIGALRM |
終了 |
タイムアウト信号 |
SEAL |
ダンプ |
プログラムの不正な指令信号 |
シグःUF |
終了 |
プログラムのアボート信号端子 |
SIGINT |
終了 |
プログラムのキーボード割込み信号 |
SIGKILL |
終了 |
プログラムの強制終了信号 |
SIGTERM |
終了 |
プログラム終了信号 |
SIGSTOP |
やめる |
キーボードプログラムアボート信号 |
SIGSEGV |
ダンプ |
プログラムの不正なメモリアボート信号 |
SIGBUS |
ダンプ |
プログラムメモリ非整列バイトアボート信号 |
SIGPIPE |
終了 |
ソケットプログラムは、停止信号を送信するのに失敗しました |
信号に対応するハンドラが設定されていない場合は、それ以外の信号が遮断された、デフォルトのハンドラを使用して、適切なハンドラ・プロセスを呼び出します。ハンドラがない場合には、プログラムは2つの動作を指定することができます。信号SIG_IGNを無視するか、デフォルトのハンドラSIG_DFLを使用しています。しかし、2つの信号が傍受して処理することはできませんがあります:SIGKILL、SIGSTOP。
➸2.3信号信号処理
① 登録されたグローバルハンドラは、例外信号がされて扱うプログラムやその他のエントリ登録で始まりました。
エラーの種類は、説明の上に見ることができるについて、SignalExceptionHandlerエラー信号コールバックです。信号が間違っているときは、このメソッドをコールバックすることができます。
② SignalHandlerは、デバッグ環境でテストしないでください。システムをデバッグすると、インターセプトを優先させて頂きますので。私は、私たちのビルドアップを実行するには、エミュレータ上で直接アプリをクリックして、デバッグ状態をオフにし、シミュレータに一度実行されます。以下のようにして得られたログ:
第3部:概要
アプリケーションのクラッシュのために、サードパーティ(友人のリーグ、bugly、など)のための多くの優れたプラットフォームがあると、ログ機能のRBIを提供し、開発の日々のニーズを満たすことができたが、これらの一般的なクラッシュを学ぶことは、私たちは、iOSの操作機構を理解することができたしている、これらは開発されていますいくつかのクラッシュは、多くの場合、参照の実際のプロセスが複雑になることがあり、問題と使用に柔軟を見つけるためのさまざまな方法を使用する必要があります。