3

Java で SIP クライアントを構築しようとしています。SIP フレームワークとして、dobango を使用します。ビデオを表示するために、JOGL を介して OpenGL を使用していますが、テスト中に実際に JOGL から ByteStream を切り離したため、これは重要ではありません。

まず、ビデオは 32 ビット VM を搭載した Win 7 で正常に動作します。ライブラリは 64 ビット用にコンパイルされないため、64 ビット システムで 32 ビット VM を使用する必要があります。残念ながら、「javaw.exe の 0x774315de で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xdddddde9」でクラッシュする前に、数秒間しかビデオを見ることができません。

VisualStudio でデバッグすると、次の行で例外が発生することが明らかになりました。

memcpy((void*)m_ConsumeBuffer.pConsumeBufferPtr, pBuffer, nRetsize);

( http://code.google.com/p/doubango/source/browse/branches/2.0/doubango/bindings/_common/ProxyConsumer.cxx#710 )

そのため、メソッドを数百回呼び出した後にエラーが発生したようです (ビデオがしばらくの間正しく表示されるため)。

考えられる原因を絞り込むために、テストでは着信ビデオのみを実装しました。

doubango は、次のように、Java での実装から ByteBuffer へのポインターを取得します。

videoFrame = ByteBuffer.allocateDirect(frameSize);
consumer.setConsumeBuffer(videoFrame, frameSize);

これは、建設時に入手したconsumerdobango 独自のものです。ProxyVideoConsumer

私は Java と Delphi の経験が豊富なので、C++ デバッグにはあまり詳しくありませんが、何らかのヒープ破損が発生しているように見えると自信を持って言えます。

私の現在の推測ではByteBuffer.allocateDirect(..)、64 ビット マシンで 32 ビット JVM を実行すると、JVM の -function が正しく動作しないということですが、もちろん、間違っている可能性もあります。

興味深いことに、約 50 回のテスト実行のうち 2 回で、ビデオは 5 ~ 10 分間安定しており、劣化や明らかなメモリ リークはありませんでした。しかし、この「疑似ランダム性」は、Delphi でのメモリ割り当ての問題に関する私の経験と一致しています。

これを安定して実行する方法のアイデアがなくなったので、誰かが私を助けてくれたらうれしいです。

よろしく、CSp

4

1 に答える 1

0

私は自分で問題をある程度解決したと思います。どうやらエラーが発生したとき、pBufferはこの時点ですでに解放/無効化されています。sipSessionこれまでのところ、 JVM 内に保持されている参照がまだある場合でも、バッファーを含む が JVM によってランダムな間隔で解放されているというエラーを追跡しました。

ガベージ コレクターをデバッグ モードにしても、この時点ではオブジェクトを破棄する意図が記録されていなかったため、あまり明らかになりませんでした。実際には数秒後にエラーが発生するため、GC はその時点で何も解放しようとしませんでした。

時期尚早に解放した 1 つのインスタンスが見つかりましたsipSession。これにより、エラーの頻度が減少しましたが、他のすべての処分には、GC につながるスタック トレースがあります。

于 2013-05-06T08:25:54.420 に答える