0

クラスの例を作成しました: https://github.com/ChoadPet/H.264-Decoding

構成を使用してアプリケーションをビルドすると、DEBUGすべて正常に動作しますが、アーカイブRELEASEすると、次の行でクラッシュします。

let status = VTDecompressionSessionDecodeFrame(session,
                                               sampleBuffer: sampleBuffer,
                                               flags: defaultDecodeFlags,
                                               frameRefcon: nil,
                                               infoFlagsOut: nil)

有効にすると、次のAddress Sanitizerエラーが発生しました。 Thread 9: Use of deallocated memory

SUMMARY: AddressSanitizer: heap-use-after-free
(.../Frameworks/libclang_rt.asan_ios_dynamic.dylib:arm64+0x1a1f4) in wrap_memmove
...
(if you need more crash info, let me know)

それなし:Thread 12: EXC_BAD_ACCESS (code=1, address=0x107dd0020)


解放されたメモリがいくつかあり、メソッドでアクセスすることは理解していますが、16 進数のアドレスを見つけることができず、これがビルドVTDecompressionSessionDecodeFrameでどのように完全に機能しているのかわかりません。 このメソッドの前に、とが正常に作成 (初期化) されています。DEBUG
sessionsampleBuffer

DEBUG configurationクラッシュの原因となる変更可能なプロジェクト設定はありますか? または、誰かがコードの問題について私に指摘できますか?

ありがとうございました!

4

2 に答える 2

1

Optimization Levelリリース アーカイブをデバッグと同じものに変更-No Optimization[-Onone]問題を非表示にしますが、ビルド構成を変更することは、この種の問題を解決する正しい方法ではありません。また、問題は正確にはありませんでしたsampleBuffer。問題はblockBufferOutパラメータにあり、sampleBuffer後で説明します。リポジトリのソース コードを更新して、コミュニティが変更を明確に確認できるようにします。

だから私はこのロジックの前に持っていました:

// 1. Creating blockBuffer from `bufferPointer`
localFrame.withUnsafeMutableBufferPointer { bufferPointer in
   // I should write everything in this body,
   // since bufferPointer would be released after the closure
   // and so, it will be released from bufferBlock
}

// 2. I called this method, which is creating `sampleBuffer`
CMSampleBufferCreateReady

// 3. I called this method, which is decode frame with session and sampleBuffer 
VTDecompressionSessionDecodeFrame

/* 
and on this line, it crashes with EXC_BAD_ACCESS, 
because the sample wasn't valid anymore, because 
on step 1, bufferPointer only valid inside body closure, 
so it's release after block when I created sampleBuffer
and later decode it.


This is even pointed by documentation:

Parameters

body
Closure with an UnsafeMutableBufferPointer parameter that points to the
contiguous storage for the array. If no such storage exists, it is created. If
the body has a return value, that value is also used as the return value for the
withUnsafeMutableBufferPointer(_:) method. The pointer argument is valid only for
the duration of the method’s execution.
*/

要約: bufferPointer を操作する場合は、クロージャ内ですべての操作を行います。

于 2020-08-03T10:22:48.897 に答える