2017-12-09 55 views
3

私はいくつかのDLLをロードするMVC4アプリケーションを持っています。基本的に、MVCアプリケーションのアーキテクチャーは、アプリケーションがユーザーからいくつかのジョブを受け取り、dllから処理関数を呼び出し、最終的にユーザーに結果を電子メールで送信します。IIS8を使用したMVCアプリケーションのヒープ破損

すべてのDLLは64ビットでコンパイルされていますが、Windows Server 2012 R2とVS2013ではIIS8を64ビットで使用しています。 私は/アプリケーションをデプロイし、実行すると、その動作は次のとおりです。

  • Scenario1:VS2013でのVisual Studio 2013から実行、デバッグ/リリースモード=>は、細かい
  • Scenario2の作品で、Webサーバー(IISエクスプレス)が含ま:ファイル名を指定して実行リリースモードでローカルフルIIS8に配備されたVisual Studio 2013 =>正常に動作します
  • Scenario3:開放モードでローカルモードのIIS8で展開され、開いたままでVS2013 => IISがクラッシュしますAn unhandled win32 exception occurred in w3wp.exe.The Just-ln-Time debugger was launched without necessary security permissions. To debug this process, the Just-ln-Time debugger must be run as an Administrator.デバッガを開くとエラーはA heap has been corruptedです。イベントビューアで

、ログは以下のとおりです。

Faulting application name: w3wp.exe, version: 8.5.9600.16384, time  stamp: 0x5215df96 
Faulting module name: ntdll.dll, version: 6.3.9600.18821, time stamp: 0x59ba86db 
Exception code: 0xc0000374 

私は例外コード0xc0000374はHeap corruptionから来ていることを知っています。

私はDebugDiagとApplication Verifierを使用してFull PageHeapフラグを有効にしてIISをデバッグしました。クラッシュのスレッドのスタックの 関連する部分は次のとおりです。

.NET Call Stack 
mscorlib_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr)+68 
[[InlinedCallFrame] (Microsoft.Win32.Win32Native.LocalFree)] Microsoft.Win32.Win32Native.LocalFree(IntPtr) 
mscorlib_ni!System.Runtime.InteropServices.Marshal.FreeHGlobal(IntPtr)+2d 
Species_DLL.Class1.Species_MetaModel()+b955 
rIAMTestMVC4.Impressions.SpeciesUtil.use_Species_Integrated(Int32)+1efd 


Full Call Stack 

vrfcore!VerifierStopMessageEx+6f4 
vrfcore!VfCoreRedirectedStopMessage+90 
verifier!VerifierStopMessage+a0 
verifier!AVrfpDphReportCorruptedBlock+2a7 
verifier!AVrfpDphCheckNormalHeapBlock+c8 
verifier!AVrfpDphNormalHeapFree+27 
verifier!AVrfDebugPageHeapFree+af 
ntdll!RtlDebugFreeHeap+47 
ntdll!RtlpFreeHeap+74c85 
ntdll!RtlFreeHeap+368 
vrfcore!VfCoreRtlFreeHeap+1e 
KERNELBASE!LocalFree+2e 
mscorlib_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr)+68 
[[InlinedCallFrame] (Microsoft.Win32.Win32Native.LocalFree)] Microsoft.Win32.Win32Native.LocalFree(IntPtr) 
mscorlib_ni!System.Runtime.InteropServices.Marshal.FreeHGlobal(IntPtr)+2d 
Species_DLL.Class1.Species_MetaModel()+b955 
rIAMTestMVC4.Impressions.SpeciesUtil.use_Species_Integrated(Int32)+1efd 

はScenario2とScenario3の間に違いはありますか? VSによって行われるヒーププロテクションはありますか?

私はIIS7でWindows7でも同じシナリオを実行し、3つすべてでうまく動作します。

私はDLLコードにアクセスできないが、前述したように、IIS7/Windows7とVisual StudioのIIS8では完全に同じコードが実行されます。

LE:コールスタックに示した二つの機能がある:

  • rIAMTestMVC4.Impressions.SpeciesUtil.use_Species_Integrated =>この関数は、1つのDLLを呼び出しMVCコントローラからのものであるが
  • Species_DLL.Class1.Species_MetaModel =>この関数は、以前によって呼び出され、DLLからです関数。

シナリオ3の問題をどのように解決できますか?これらのシナリオの違いは何ですか?

は、私は同様の問題があったが、私は32ビットを補うためにはx86するために、プロジェクトのビルドを変更することで鉱山を解決し、

答えて

0

、ありがとうございました。

+0

ありがとうございます。すべてのDLLが64ビットであるため、これは私の解決策ではありません。 – banuj

0

VS2013を管理者として実行しましたか?もしそうなら、これがVSで起こるエラーを防ぎ、IISでのみ起こります。

IISアプリケーションプールで問題が発生しているようですが、この問題はVS2013では発生しませんでした。

アップデート:ただフォルダにアクセスするには、プール自体に権限を追加します

  1. はあなたのDLLを持っているフォルダを選択して右 「プロパティ」
  2. をクリックして選択し、「セキュリティ」を選択しますタブ「編集」をクリックしてから 「追加」ボタン
  3. 「場所」ボタンをクリックし、ローカル マシンを選択していることを確認します。 (サーバーがWindowsドメインに属している場合はWindowsドメインではありません)
  4. " オブジェクト名を入力してください:"テキストボックスにIIS AppPool\DefaultAppPoolを入力します。 は(あなたがあなたのアプリケーションプールの名前何にここでは「のDefaultAppPool」 を変更することを忘れないでください。)

注:手順は、hereからいくつかの変更でコピーされます。


は知っているか、あなたのアプリケーションを実行するアプリケーションプールを変更するには: アクションのペインダウン 詳細設定でそれを見つけ、あなたのオープンIISマネージャを、左側のツリーからアプリケーションを選択し、あなたの右。

プールのIDを変更するには、左側のツリーのマシンの下にそのプールがあります。

アプリケーションプールのIDを指定する方法については、thisの記事を参照してください。

+0

回答ありがとうございます。はい、VS2013を管理者として実行しています。管理者としてアプリケーションプールを実行するにはどうすればよいですか?今、Advanced Settings - > IdentityにはLocalSystem、LocalService、NetworkService、ApplicationPoolIdentityしかありません。私はそれらのすべてを試しましたが、誰も働いていません。 – banuj

+0

私は自分の答えを更新しました。あなたはこれを必要とせず、指定されたプールに許可を与えてください。プールはユーザーとして扱うことができます。 –

関連する問題