[Seasar-user:21942] Re: 【Seasar】IIS 上でAccessViolationException が発生

kubo [E-MAIL ADDRESS DELETED]
2014年 9月 12日 (金) 13:10:45 JST


久保(jflute)です

河野さん、こんにちは
Seasar.NETのご利用ありがとうございます。

新しいバージョンにしても変わらずということでしたが、
「1.3.19にしても変わらず」ということでよろしいでしょうか?
(.NET のバージョンは...ASP.NETと同じ2.0!?)

S2Container.NETは、AOPを実現するのに、
Castle.DynamicProxyというライブラリを使っています。
そのライブラリが行っている処理が新しい環境で
許されていないということなのかもしれませんね。

根本の原因を掴むのであれば、Castle.DynamicProxyだけ
を使った簡単なプログラムを作って、スタックトレースから
現象が発生した操作を試して同じエラーが起きるか?
回避策があるかどうか検証してみるといいと思います。

インフラ的な設定で回避できれば一番ですが、
もし、ちょっとしたコード修正で回避ができそうであれば、
ソース公開されていますので修正してビルドし直すとよいです。
Seasar.NETは、Githubにて公開されています。
https://github.com/seasarorg/s2container.net
Castle.DynamicProxyもオープンソースです。
(どこにソースがあるかちょっとわかっていませんが...)

アプリケーション的な修正に融通利くのであれば、
AOPを使わなければその部分の処理が走らない「かも」しれません。
(これはやってみないとなんとも)
アプリであまり重要でない処理で落ちてる可能性も疑ってみて、
アプリ側での回避も検討してみるといいかもしれません。


既にご存知かもしれませんが、一応事務的なお話ですが、
Seasar.NET自体は、現状S2Container.NETを推奨していません。
Quillの方を推奨しています。以下のブログに、
「Seasar.NETプロジェクト自体の現状」のことを書いています。

// Quill と DBFlute.NET の未来プロジェクト
http://d.hatena.ne.jp/jflute/20140420/dotnet

Quillにしても同じエラーは起きるかもしれませんが、
熟知しているメンバーがそちらの方が多いので、
回避修正のアドバイスなどはそちらの方がしやすいです。

また、メーリングリストですが、
Seasar.NET専用のメーリングリストがあります。
こちらのseasar-userの方はどちらかというとJavaの方がメインで、
.NETプログラマーの方はseasar-dotnetの方にたくさんいらっしゃいます。
https://ml.seasar.org/mailman/listinfo/seasar-dotnet
欲しい情報が得られる保証はありませんが、
そちらの方がユーザー同士で意見を交換できる可能性は高いです。


2014-09-12 10:03 GMT+09:00 河野友成 <kono.tomonari @ tis.co.jp>:
> はじめまして。
> 河野と申します。
>
> 初めてメールいたしますので、色々至らぬ点もあるかと思いますが、
> よろしくお願いいたします。
>
> 早速ですがIIS上の ASP.NET 2.0アプリケーションを実行した際に
> AccessViolationExceptionエラーが
> 発生しております。原因が全く分かりません。エラー内容は以下になります。
>
> (エラー内容)
> ----------------------------------------------------------------------------
> ----------------------------
> 例外情報:
>      例外の種類: AccessViolationException
>      例外メッセージ: 保護されているメモリに読み取りまたは書き込み操作を行お
> うとしました。
>                      他のメモリが壊れていることが考えられます。
> スタック トレース:
>    場所 System.Reflection.Emit.TypeBuilder._TermCreateClass(Int32 handle,
> Module module)
>    場所 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
>    場所 System.Reflection.Emit.TypeBuilder.CreateType()
>    場所 Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
>    場所 Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
>    (・・・省略・・・)
>    場所 Seasar.Framework.Container.Impl.S2ContainerImpl.Init()
>    場所
> Seasar.Framework.Container.Factory.SingletonS2ContainerFactory.Init()
>    場所 ASP.global_asax.Application_Start(Object sender, EventArgs e)
> ----------------------------------------------------------------------------
> ----------------------------
>
> マイクロソフトへ問合わせを行いましたところ、Seasarのバージョンを変更して試し
> てくださいとの
> ことでしたので実施しましたが、現象は変わらずでした。
> 後解決手段でSeasarのメーリングリストへ問合わせしてみてはどうかということで、
> 今回メールした次第です。
>
> (マイクロソフト問合わせ内容)
> ----------------------------------------------------------------------------
> ----------------------------
> [タイトル]
> IIS 上の ASP.NET 2.0 アプリケーションを実行した際に AccessViolationException
> が発生
>
> [お問い合わせの概要]
> Windows Server 2012 R2 上の IIS 8.5 上で S2Container.NET を使ったアプリケー
> ションを動作させている。このアプリケーションに対してアクセスを実施すると、以
> 下の例外が発生し、アプリーケーションが動作しない。対象のアプリケーションは、
> Windows Server 2012 上では動作した。Windows Server 2012 R2 上で対象のアプリ
> ケーションが動作するようにしたい。
>
> 例外情報:
>      例外の種類: AccessViolationException
>      例外メッセージ: 保護されているメモリに読み取りまたは書き込み操作を行お
> うとしました。
>                      他のメモリが壊れていることが考えられます。
> スタック トレース:
>    場所 System.Reflection.Emit.TypeBuilder._TermCreateClass(Int32 handle,
> Module module)
>    場所 System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
>    場所 System.Reflection.Emit.TypeBuilder.CreateType()
>    場所 Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
>    場所 Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
>    (・・・省略・・・)
>    場所 Seasar.Framework.Container.Impl.S2ContainerImpl.Init()
>    場所
> Seasar.Framework.Container.Factory.SingletonS2ContainerFactory.Init()
>    場所 ASP.global_asax.Application_Start(Object sender, EventArgs e)
>
> [お伝えした内容]
> 今回の現象発生のスタックトレースを見ると、ASP.NET の Application_Start のタ
> イミングで
> Seasar.Framework.Container.Factory.SingletonS2ContainerFactory.Init() を呼び
> 出し、
> その呼び出しの中で、AccessViolationException が発生しております。
>
> スタックからは実際にアプリケーションの画面などにはアクセスした形跡は確認でき
> ません。
> このような状況を鑑みると、まずは Seasar の動作で何か問題がないかをご確認いた
> だくことをお勧めいたします。
> S2Container.NET のバージョンは 1.3.12 と伺っておりますが、こちらのバージョン
> を変えてみて
> どうなるか、ご確認をいただきたいと存じます。以下を見ると、.NET 2.0 で利用可
> 能なバージョンとして
> 1.3.12 より新しいバージョンもいくつか確認できます。
>
>     http://s2container.net.seasar.org/ja/download.html#past
>
> バージョンの変更でも特に動作が変わらないようでしたら、改めてご相談いただけな
> いでしょうか。
> できることがないかを検討いたします。
>
> また、あわせて S2Container.NET において、Application_Start 内で
> Seasar.Framework.Container.Factory.SingletonS2ContainerFactory.Init() を呼び
> 出し
> AccessViolationException が発生するようなことがないか、などをご確認いただい
> てもよいかと存じます。
> 私がインターネット上のサイトを確認する限り、以下のように Seasar 向けのメーリ
> ングリストもあるようです。
>
>     http://ml.seasar.org/
> ----------------------------------------------------------------------------
> ----------------------------
>
> 解決策がご存知の方、不足事項等ございましたら、お手数ですがご連絡頂けたらと思
> います。
>
> 以上の件よろしくお願いいたします。
>
> /*--------------------------------------------------------
> 河野 友成
> --------------------------------------------------------*/
>
>
>
>
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user


Seasar-user メーリングリストの案内