11

WCFサービスを使用するC#.Netアプリケーションがあります。そして、アプリケーションは、Windowsサービスアプリケーションの下で本番サーバーにデプロイされます。モジュールの一部は、作業者が今日作業するより小さな領域のシェープファイル((* .shp、* .dbf)を作成し、それらをPDAに送信する役割を果たします。

シェープファイルを作成するには、サードパーティのdllであるNetTopologySuiteを使用します。

GisSharpBlog.NetTopologySuite.IO.ShapefileWriter

これもC#にあります。(参照するdllがアンマネージコードを使用しているかどうかはわかりません。) システムはしばらくの間、たとえば1週間は正常に動作する可能性があります。すると突然例外が発生します

Attempted to read or write protected memory. 
This is often an indication that other memory is corrupt.

ジオメトリコレクションをシェープファイルに書き込むWriteメソッドから。

sfw.Write(FileName, new GeometryCollection(gc.ToArray()));

(GeometryCollectionもサードパーティのdll、GeoAPI.dllからのものです)

このエラーにより、サービス全体がダウンし、機能しなくなります。次に、サービスを再起動して同じデータを再度実行しようとします。再びクラッシュするまで、さらに1週間は正常に機能します。これは、本番環境でランダムな時間にのみ発生します。問題の原因を特定できませんでした。

多くのフォーラムは、管理されていないコードのメモリリークが原因である可能性があることを示唆しています。しかし、どれが見つかりませんでした。

また、新しいシェープファイルを作成する部分を書き直す準備ができています。この問題の解決にご協力ください。詳細が必要な場合はお知らせください。前もって感謝します。

4

5 に答える 5

8

私の経験では、そのメッセージはメモリ リークの結果でした。これは、特にサードパーティの DLL で作業しているため、私があなたの状況にある場合に行うことです。

1) WCF サーバーを監視し、タスク マネージャーで DLLHost.exe と aspnet サービスで何が起こっているかを確認します。サードパーティの DLL にメモリ リークがあり、これら 2 つのサービスが肥大化し、サーバーのメモリの限界に達しているように感じます。これが、しばらく機能していたのに突然機能しなくなった理由です。

2) サーバーのメモリとアプリケーション プールをいつリサイクルできるかについて、適切なスケジュールを特定します。この問題は蔓延しているため、これは毎晩、または誰もアクティブに使用していないときに実行することをお勧めします。

3) 適切なエラー ログ コードを記述して、問題が発生している間に何が起こっているかを正確に把握します。エラー ログに次の情報を記録します。渡したパラメータ、その問題に遭遇したユーザーなど。これにより、何が起こっているかを正確に知ることができます。

4) 問題を特定できる情報が含まれている可能性があるため、イベント ビューアを確認します。

4) 1、2、および 3 を行った後、サードパーティの DLL ベンダーに電話して、彼らができることを確認します。上記の 1、2、3、および 4 項目から収集した情報を提供する必要がある場合があります。

頑張ってください。これが役立つことを願っています。

于 2013-03-12T16:33:24.010 に答える
1

システムによって保護されているか、他のアプリケーションによって使用されているアドレスを取得している 3 番目のライブラリに、管理されていないコードがいくつかあると思います。

于 2013-03-26T20:12:45.667 に答える
0

サードパーティの DLL の 1 つに ( /mass_addressをAccess Violation含む、アプリケーション空間に属さないメモリへのポインタ) があります。null0x0

または、COMObjectこのエラーの原因となっているのは、使用している管理されていないものである可能性があります。

于 2013-03-28T10:29:59.557 に答える
-1

このエラーのランダムな性質は、スレッドの問題である可能性があることを示唆しています。具体的には、 のWriteメソッドShapefileWriterが呼び出された可能性があり、スレッドで遅延してから を呼び出しますClose。次に、遅延Writeメソッドは、閉じられた (保護された) ファイルを上書きしようとします。これにより、表示されるエラーが発生する可能性があります。

より良い推測をするためのコードがあまりないため、これは純粋に推測ですが、ビデオ書き込みライブラリを使用してこの問題を経験したので、あなたの場合も同じかもしれません.

于 2013-03-27T12:47:30.290 に答える
-1

スレッド内にスレッドがないことを確認してください。それが、このエラーに遭遇したときに起こったことです。詳細については、このリンクを参照してください:保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています

于 2013-08-08T17:32:02.410 に答える