1

iOS アプリケーションで時折発生するクラッシュをデバッグしようとしています。

通常の「解放後にオブジェクトが変更されました」で「malloc_error_break」を取得します。クラッシュは同じ C ライブラリで発生しますが、異なる malloc の場所で発生します。

バックトレースの上部は次のようになります。

* thread #29: tid = 0x3a03, 0x32c8cfa8 libsystem_c.dylib`malloc_error_break, stop reason = breakpoint 1.1
    frame #0: 0x32c8cfa8 libsystem_c.dylib`malloc_error_break
    frame #1: 0x32c71ed0 libsystem_c.dylib`szone_error + 220
    frame #2: 0x32c71f1c libsystem_c.dylib`free_list_checksum_botch + 28
    frame #3: 0x32c1d3bc libsystem_c.dylib`tiny_malloc_from_free_list + 348
    frame #4: 0x32c1c44a libsystem_c.dylib`szone_malloc_should_clear + 1274
    frame #5: 0x32c1bf1e libsystem_c.dylib`malloc_zone_malloc + 66

質問:

これは、基になるメモリの破損 (fi の二重解放など) が「malloc_zone_malloc」と同じスレッドで発生することを保証しますか? または、少なくとも malloc_error_break が参照しているメモリが同じスレッドに割り当てられていることはありますか?

これを確実に知っていれば、他のライブラリや NSURLConnection リクエストなどの影響からクラッシュを分離するのに役立ちます。アプリは非常に大きく、そのままではデバッグも困難です。

編集:

私も最初に知りたかったのはもっと単純なことだったと思います。

異なるスレッドには、iOS で個別のヒープ/malloc リストがありますか?

4

1 に答える 1

1

malloc_error_break()は、どのスレッドがそれを発見したかに関係なく、メモリの破損が発見されるとすぐに呼び出されます。これがどのスレッドになるかについての保証はまったくありません。

iOSでは異なるスレッドに別々のヒープ/mallocリストがありますか?

いいえ。プロセス内のすべてのスレッドで使用される単一の共有ヒープがあります。

于 2013-03-08T03:13:09.133 に答える