QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

他のメモリが壊れている・・・

初めて書き込みします。よろしくお願いします。
環境は以下の通りです。

OS:WinXPPRO SP2
DB:日立製HIRDB
IIS&ASP.NET
FrameWork2.0
VB2005

上記環境にてWEBアプリの開発を行ってますが、
不定期に以下のエラーが発生します。

「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
他のメモリが壊れていることが考えられます。」

上記エラーは実行PCで現象はほとんどおきず、他のPCから
接続した場合、同時に複数端末で実行した場合におきてます。
ある一定期間出た後、再起動等を実施すると出なくなります。

おきる場所につきましては、DBに対しSELECTを行ったときで
どのテーブルでもおきてます。
接続方式はODBCを使用しており、データアダプタ、コマンドにて
datasetを行っております。

<参考例>
①ODBCCommand(SQL文、コネクション、トランザクション)
②ODBCDATAAdapter(①のコマンド)
③DETASET
④②.MissingSchemaAction = MissingSchemaAction.AddWithKey
⑤②.FILL(③)

特にデータ連結はしておりません。

考えられる原因は何がありますでしょうか。。
よろしくお願いします。

質問者:ゆーとパパ

回答

そのエラーを出しているのは誰ですか?
(IIS, HIRDB, プログラム)

エラーですか?それとも例外ですか?

例外ならば、発生している場所を特定し、その近辺でやっていることを列挙してください。

上記エラーは実行PCで現象はほとんどおきず、他のPCから

接続した場合、同時に複数端末で実行した場合におきてます。

ある一定期間出た後、再起動等を実施すると出なくなります。

なんか、玉虫色な書き方ですね。

まず、「実行PC」って、なんですか?

「他の PC から接続した場合、同時に複数端末で実行した場合」の箇所。句点は、OR ですか?AND ですか?

「ある一定期間出た後、再起動」ということですが、期間をおかないと再起動しても再発するのでしょうか?
また、再起動をするのは OS ですか?データベース サービスだけ再起動した場合は、どうなりますか?
あるいは、ASP.NET サービスだけを再起動した場合は、どうなりますか?


投稿者:Jitta

編集 履歴 (0)

ゆーとパパさんの書き込み (2006-11-24 21:59) より:

「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。

他のメモリが壊れていることが考えられます。」

CLR から出力されている例外ですよね。
そうだとして、Google 検索などはしていますよね?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

Jitta様 じゃんぬねっと様
返信ありがとうございます。

エラーを出しているのはCLR(システム)と思います。
エラー内容「保護されているメモリ・・・」にて検索等を実施しましたが、
再起動により直る、いつのまにか無くなったと明記されており、
結論対策等が明記されていないように思いました。
検索が足りなければ申し訳ありません。

今回の環境としましては、以下となります。
①IIS・ASPが動作しているPC
②クライアントPC
③クライアントPC

①にてデバック・実行等を実施してもエラーは起きませんでした。
②単独又は、②と③で同時実行等を実施するとたまに起きます。

DBのみの再起動等は行っておらず、エラーが出た後PCの再起動を
実施すると出なくなることは確認しました。
DBのみ再起動等は調査後、回答します。

念のため、本処理でのソースとエラー内容を以下に明記致します。
Public Function find(ByVal p_sSqlString As String, ByVal p_prmList As ArrayList) As DataTable
Dim da As OdbcDataAdapter = Nothing 'データアダプタ
Dim cm As OdbcCommand = Nothing 'コマンド
Dim ds As DataSet = Nothing 'データテーブル

  Try
    cm = New OdbcCommand(p_sSqlString, con__, tran__)
    If Not p_prmList Is Nothing Then
      MsgBox("パラメータ設定")
      'パラメータを設定する
      For Each val As String In p_prmList
        Dim prm As New OdbcParameter()
        prm.Direction = ParameterDirection.Input
        prm.Value = val

        cm.Parameters.Add(prm)
      Next
    End If
    da = New OdbcDataAdapter(cm)

    ds = New DataSet
    'DB検索を行う
    da.MissingSchemaAction = MissingSchemaAction.AddWithKey

    da.Fill(ds)
    For Each col As DataColumn In ds.Tables(0).Columns
      col.ReadOnly = False
    Next
  Catch ex As HIT00ComBsnExp
    Throw
  Catch ex As HIT00ComSysExp
    Throw
  Catch ex As Exception
    Dim exp As HIT00ComSysExp = New HIT00ComSysExp(ex)
    exp.setErrorInfo( _
        C_PGMID, _
        System.Reflection.MethodBase.GetCurrentMethod.Name, _
        "HIT0001E", _
    Nothing)
    Throw exp
  End Try
  '戻り値を返却する
  Return ds.Tables(0)
End Function

エラー内容
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。

[スタックトレース]
場所 System.Data.Common.UnsafeNativeMethods.SQLBindCol(OdbcStatementHandle StatementHandle, UInt16 ColumnNumber, SQL_C TargetType, IntPtr TargetValue, IntPtr BufferLength, IntPtr StrLen_or_Ind)
場所 System.Data.Odbc.OdbcDataReader.RetrieveKeyInfo(Boolean needkeyinfo, QualifiedTableName qualifiedTableName, Boolean quoted)
場所 System.Data.Odbc.OdbcDataReader.BuildMetaDataInfo()
場所 System.Data.Odbc.OdbcDataReader.GetSchemaTable()
場所 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
場所 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
場所 System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
場所 System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior behavior)
場所 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
場所 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
場所 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
場所 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
場所 dbcom.common.module.HIT00ComDbiMng.find(String p_sSqlString, ArrayList p_prmList)

言葉足らずで申し訳ありませんが、よろしくお願いします。
[ メッセージ編集済み 編集者: ゆーとパパ 編集日時 2006-11-28 09:03 ]

投稿者:ゆーとパパ

編集 履歴 (0)

ゆーとパパさんの書き込み (2006-11-27 15:43) より:

エラーを出しているのはCLR(システム)と思います。

エラー内容「保護されているメモリ・・・」にて検索等を実施しましたが、再起動により直る、いつのまにか無くなったと明記されており、結論対策等が明記されていないように思いました。

解決策を探す前に、原因を探すのが手順として正しいと思います...

2.0 であれば、発生している例外は AccessViolationException ですよね?
だとすると、根深そうです。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

及ばずながら投稿させていただきます。

私も以前同様の現象になった事があります。
私の場合、
①ASP動作PC
OS:Windows2000
DB:Oracle9i
IIS&.NET Framework
②リモート操作用PC
OS:WindowsXP Pro
でした。

マネージドコードとかガーベッジコレクションとか、従来の考えにはないメモリ管理の方式がいろいろと採用されてましたので、それが異なるOS間で悪動作をしているのではないかと私は調査しましたが、結局わからずじまいでした。

ただ、PCを再起動して、①のPCでのみ操作を行っている分にはメモリアクセスエラーはほとんど発生しなかった記憶があります。(前の事なのではっきりは覚えていませんが・・・。)

>じゃんぬねっとさん

何か思い当たる原因とかわかりますか?
じゃんぬねっとさんのサイトはいつもいろいろ参考にさせていただいてます。
いろいろお詳しそうですので。

結局の所、他のスレをいろいろ見ても、根本的な解決策を述べている所は無いように思いました。
今更ですがこのエラーが気になった通りすがりのモノでした。。。

投稿者:ひっとぱれ〜ど

編集 履歴 (0)

ODBCドライバの内部で落ちている事から考えて、明らかなコーディングミスが無いなら、後は日立に問い合わせるのが近道でしょう。実運用でだけ問題が起こるということは、ODBCドライバがマルチスレッドに対応しきれてないとかじゃないですかね。

投稿者:甕星

編集 履歴 (0)

ひっとぱれ〜どさんの書き込み (2006-11-28 00:53) より:

>じゃんぬねっとさん

何か思い当たる原因とかわかりますか?

じゃんぬねっとさんのサイトはいつもいろいろ参考にさせていただいてます。

いろいろお詳しそうですので。

結局の所、他のスレをいろいろ見ても、根本的な解決策を述べている所は無いように思いました。

"根深そう" というのは、甕星さんが既に答えられているようなものです。

アンマネージド ポインタを使うなど特殊なコトをやられていないのであれば、
コーディング ミスではなく、ベンダ側の不具合というパターンが多いです。

今回は明らかにドライバ側の不具合っぽいですが...
以前、私も別のベンダに問い合わせをしたことがあります。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっと様 甕星様 ひっとぱれ〜ど様

皆様ご回答の程、ありがとうございます。
皆様のご回答により、一旦ベンダへ問い合わせをしてみることに
しました。
(コーディングミスの可能性はあるかもしれませんが。。)

メモリの扱い方について、もっと深く勉強しようと思います。
また、何かありましたら、投稿させて頂きますので、
よろしくお願い致します。

投稿者:ゆーとパパ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。