- PR -

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

投稿者投稿内容
ゆーとパパ
会議室デビュー日: 2006/11/24
投稿数: 3
投稿日時: 2006-11-24 21:59
初めて書き込みします。よろしくお願いします。
環境は以下の通りです。

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

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

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

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

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

<参考例>
@ODBCCommand(SQL文、コネクション、トランザクション)
AODBCDATAAdapter(@のコマンド)
BDETASET
CA.MissingSchemaAction = MissingSchemaAction.AddWithKey
DA.FILL(B)

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

考えられる原因は何がありますでしょうか。。
よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-24 22:17
そのエラーを出しているのは誰ですか?
(IIS, HIRDB, プログラム)

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

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


引用:

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


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

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

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

「ある一定期間出た後、再起動」ということですが、期間をおかないと再起動しても再発するのでしょうか?
また、再起動をするのは OS ですか?データベース サービスだけ再起動した場合は、どうなりますか?
あるいは、ASP.NET サービスだけを再起動した場合は、どうなりますか?
_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-25 09:46
引用:

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

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


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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ゆーとパパ
会議室デビュー日: 2006/11/24
投稿数: 3
投稿日時: 2006-11-27 15:43
Jitta様 じゃんぬねっと様
返信ありがとうございます。

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

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

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

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 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-27 18:46
引用:

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

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


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

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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひっとぱれ〜ど
会議室デビュー日: 2006/11/28
投稿数: 1
投稿日時: 2006-11-28 00:53
及ばずながら投稿させていただきます。

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

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

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

>じゃんぬねっとさん

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

結局の所、他のスレをいろいろ見ても、根本的な解決策を述べている所は無いように思いました。
今更ですがこのエラーが気になった通りすがりのモノでした。。。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-11-28 08:35
ODBCドライバの内部で落ちている事から考えて、明らかなコーディングミスが無いなら、後は日立に問い合わせるのが近道でしょう。実運用でだけ問題が起こるということは、ODBCドライバがマルチスレッドに対応しきれてないとかじゃないですかね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-28 08:44
引用:

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

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

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


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

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

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

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

スキルアップ/キャリアアップ(JOB@IT)