81

Objective-Cでアプリケーションをプログラミングしていますが、次のエラーが発生します。

MyApp(2121,0xb0185000)malloc:***オブジェクト0x1068310のエラー:ダブルフリー
***デバッグするmalloc_error_breakにブレークポイントを設定します

NSAutoreleasePoolをリリースしたときに発生し、2回リリースしているオブジェクトがわかりません。

彼のブレークポイントを設定するにはどうすればよいですか?

この「オブジェクト0x1068310」が何であるかを知る方法はありますか?

4

13 に答える 13

47

オブジェクトが「ダブルフリー」の場合、最も一般的な原因は、(不必要に)自動解放されたオブジェクトを解放し、後で含まれている自動解放プールが空になると自動解放されることです。

追加のリリースを追跡する最良の方法は、Xcodeで影響を受ける実行可能ファイルにNSZombieEnabled環境変数を使用することです。使用方法の概要については、このCocoaDevwikiページを確認してください。(このページに加えて、AppleはXcodeでコードをデバッグするための信じられないほどあいまいでありながら有用なヒントをいくつか文書化しました。そのうちのいくつかは私のベーコンを数回以上節約しました。developer.apple.comのこのテクニカルノートをチェックすることをお勧めします—リンクCocoaのFoundationフレームワークのセクションにジャンプします)。

編集: Xcodeデバッガー内で問題のあるオブジェクトを追跡できることがよくありますが、Instrumentsを使用して支援する方がはるかに簡単です。Xcodeから、[実行]→[パフォーマンスツールで開始]→[オブジェクトの割り当て]を選択すると、問題のあるオブジェクトを作成された場所までさかのぼることができます。(これは、上記のようにゾンビを有効にしている場合に最適に機能します。)注: Snow Leopardは、[実行]メニューからもアクセスできるゾンビツールをInstrumentsに追加します。29ドルだけの価値があるかもしれません!;-)

ここには、関連するSOの質問もあります

于 2009-06-11T03:33:58.873 に答える
38

デバッガーを壊すと、オブジェクトが何であるかがわかります。コールスタックを調べるだけで、解放した場所が見つかります。それはそれがどのオブジェクトであるかを教えてくれます。

ブレークポイントを設定する最も簡単な方法は次のとおりです。

  1. [実行]->[表示] - >[ブレークポイント](ALT-- )に移動しますCommandB
  2. リストの一番下までスクロールして、記号を追加しますmalloc_error_break
于 2009-06-09T18:06:33.787 に答える
13

クイン・テイラーの答えに加えて、自分の経験を追加したいと思います。

私のアプリの1つでは、データを解析してコアデータオブジェクトに保存し、後でこれらのオブジェクトをビューに表示する必要があります。実際、アプリは問題なく動作し、まったくクラッシュしません。何度も前後に移動するストレステストを実行し、できるだけ速く複数のビューを開こうとするまでは。上記のメッセージでアプリがクラッシュします。

私はクインが彼の答えで提案したすべての方法を試しましたが、それでも正確な原因がどこにあるのかを見つけることができませんでした。

NSZombieEnabled=YESとNSStackLogging=YESを設定し、コマンドシェルmalloc_historyを実行して理由を調べましたが、それでもうまくいきませんでした。それは常にデータをコアデータオブジェクトに保存する場所を示しています。実際、私はそこでリリースされたオブジェクトを何千回もチェックしましたが、奇妙なことは何もありません。

さまざまなツール(割り当て、リークなど)を使用してInstrumentsで実行しても、まだ役に立ちませんでした。GuardMallocを有効にしても何も得られません。

最終的な救済:オブジェクトがCore Dataから取得され、これらすべてのオブジェクトに保持メッセージを送信したビューに戻ろうとし、これらの変更に注意しました。問題は解決しました!!!

それで、私はそれを保持できなかったことがわかりました、それがまさに原因です。私の経験を共有したいので、あなたはあなたのアプリのために別の救助を持っています。

于 2010-11-03T13:32:32.793 に答える
9

Cmd + Shift + Rを押して、デバッガコンソールを開きます。そこで、タイプ

break malloc_error_break

関数の先頭にブレークポイントを設定しますmalloc_error_break

アドレス0x1068310にあるオブジェクトを確認する場合は、デバッガーコンソールに次のように入力できます。

print-object 0x1068310

もちろん、オブジェクトがまだ生きている間にこれを行う必要があります。これを行うまでにオブジェクトがすでに解放されている場合、これは機能しません。

于 2009-06-11T03:51:59.247 に答える
4

私にとって、問題はによって解決されました

(gdb) call (void)_CFAutoreleasePoolPrintPools()

クラッシュ直後。スタックの一番上のアドレスは、犯人のアドレスでした。と出来上がりを投げたretain

ログメッセージに記載されているアドレスでは、どこにもアクセスできませんでした。さまざまなインストルメットのいずれにも表示されませんでした。どうやら、すでに解放されたいくつかの内部データへのポインタ。

于 2011-07-09T17:59:05.180 に答える
4

Xcode4にシンボリックブレークポイントを追加する

これをXcode4に関連させるための単なる更新...

Xcode 4ユーザーガイドから:

シンボリックブレークポイントを追加します。。。

  1. ブレークポイントナビゲーターの左下隅にある[追加]ボタンをクリックします。
  2. AddSymbolicBreakpointを選択します。
  3. [シンボル]フィールドにシンボル名を入力します。
  4. [完了]をクリックします。
于 2011-12-17T19:54:26.423 に答える
4

無料のオブジェクトを見つけてアプリケーションをクラッシュさせる方法については、以下の手順をご覧ください。

1)「ブレークポイントナビゲーター」をクリックします。
2)次に、下にある「+」ボタンをクリックします。
3)リストから「SymbolicBreakpoint...」を追加します。
4) 「シンボル」オプションに「 malloc_error_break」キーワードを追加します。

または、以下のGIFプレゼンテーションを参照することもできます。

GIF表現

于 2017-05-25T13:31:28.050 に答える
3

これは、Xcodeの[ブレークポイント]ウィンドウでのmalloc_error_breakブレークポイントの外観です。それを機能させるには、チェックボックスをオンにする必要があります。

代替テキストhttp://www.martijnthe.nl/wp-content/uploads/2009/08/Afbeelding-1.png

于 2009-08-05T10:51:57.963 に答える
2

クラスを確認し、deallocメソッドを確認してください。必ず電話してください[super dealloc].

[self dealloc]私はこれとまったく同じ問題を抱えていて、代わりに電話をかけていることがわかりました。ただ注意を払っていません。

于 2010-11-11T17:27:36.507 に答える
0

これらの種類のメモリとポインタの問題を一般的に見つけるには、Valgrindのようなランタイムメモリエラーチェッカーに対してコードを実行する必要があります。これにより、コードがクラッシュする原因以外にも、コードが間違っている多くのことを指摘できるはずです。

ValgrindはOSXで動作することができ(「サポートされておらず、不完全でバグがある」と言われていますが)、少しハッキングするだけで、誰かがiPhoneSDK実行可能ファイルで動作するようになりました。

さらに良いことに、XCodeの一部であるInstrumentsを試すことができます。ここにそれを実行するためのチュートリアルがあります。

于 2009-06-29T18:29:28.483 に答える
0

Xcodeで、行番号の左側をクリックしてブレークポイントを設定します。次に、「ビルドとデバッグ」を実行して起動できます。

autoreleaseメモリはiPhoneの商品であるため、作成するオブジェクトを持たないことをお勧めします。Appleは明示的にを呼び出すことをお勧めしreleaseます。

于 2009-06-09T18:00:37.790 に答える
0

役に立たない場合malloc_error_break...

このエラーを解決する最善の方法は、電源を入れた状態で機器NSZombiesを実行することです。ゾンビがメッセージを送信されると、Instrumentsはフラグを立て、コード行に直接さかのぼることができます。

ユキヒョウが必要ですが、なんと命の恩人でしょう。

于 2011-05-18T19:07:05.983 に答える
0

これは通常、サファリやサファリプレビューなどの検査官によって引き起こされます。投稿または投稿質問を参照してください。

AutoMatically Show Web ....の選択を削除すると、この問題が削除されます。

サファリまたはサファリプレビューを閉じるだけでは、この問題は解決されないことに注意してください。また、サファリとサファリプレビューの両方の選択を解除する必要があります。

これでうまくいかない場合は、この回答を参照するか、投稿してデバッグしてください。

選択を解除すると、Safariプレビューで自動的に検査されます

于 2017-05-10T07:12:10.400 に答える