web-dev-qa-db-ja.com

EXC_BAD_ACCESSバグをデバッグする方法

エラーを受け取りました

EXC_BAD_ACCESS code = 2 at0xb0987654

0xb0987654の値を印刷する方法を知りたいですか?

25
Adam Lee

EXC_BAD_ACCESSをデバッグするには、通常、ゾンビオブジェクトを有効にすることで、ダングリングポインターの場所を見つけることができます。

Xcode

編集スキームを選択し、[実行]セクションの[診断]タブを選択して、[ゾンビオブジェクト]オプションをクリックします。

AppCode

編集対象を選択し、次の環境変数を追加します。

NSZombieEnabled=YES

EXC_BAD_ACCESSの別の原因として、無限再帰があります。これは、ロギングを追加することで見つけることができます。

C++の更新:

ClangコンパイラでC++のダングリングポインターをデバッグするには、Googleの Address Sanitizer(ASAN) を使用してみてください。

32
Jasper Blues

コードページなどに書き込もうとしているように見えますか? EXC_BAD_ACCESSは、/ usr/include/mach/exception_types.hで説明されています。

#define EXC_BAD_ACCESS          1       /* Could not access memory */
            /* Code contains kern_return_t describing error. */
            /* Subcode contains bad memory address. */

そして、kern_return.hから:

#define KERN_PROTECTION_FAILURE         2
            /* Specified memory is valid, but does not permit the
             * required forms of access.
             */

次のようにすると、バイナリ内のアドレスがどこにあるかを確認できます。

(lldb) image lookup -va 0xb0987654

しかし、あなたが本当に理解する必要があるのは、誰がそこに書き込もうとしているのかです。問題が単純な場合、これは何が悪いのかを教えてくれるかもしれませんが、Jasperが示唆するように、これはおそらく解放後の使用などの問題です。 guardmallocは、この種のエラーをキャッチすることもあります(RunスキームのXcodeでこれを有効にできます)。

2
Jim Ingham

クラッシュを引き起こした原因を特定します。特定のView ControllerのビューがdidLoad中、デリゲートメソッド内、または特定のアクションでクラッシュしましたか。多くの場合、エラーの原因となっているオブジェクトを見つけるのに役立ちます。

  • ほとんどの場合、「NSZombies」は死んだオブジェクトを識別するのに役立ちます。 NSZombiesを有効にするには、スキームの[製品]-> [スキームの編集]-> [診断]を編集します。
  • それでも根本原因が見つからない場合は、常に子View Controllerから親View Controllerに戻って、保持する必要があるオブジェクトまたは適切に渡す必要があるメッセージを確認します。
  • 高度なデバッグについては、静的アナライザーと機器をご覧ください。

これがお役に立てば幸いです。

よろしく、ギソン

0
Gison George