ナイトリービルドマシン上に構築されたアプリケーションに障害が発生したが、他のデスクトップ上で正常に動作します。バイナリは、Windows Server 2012上で動作しないWindows Server 2012の
例外の種類 "保護されたメモリを読み書きしようとしましたが、これは他のメモリが壊れていることを示していることがよくあります。スローされます。
WindowsServer2012マシン全体でリモートデバッグを使用してデバッグしてマシンを構築すると、この例外がkernel32コールHeapSizeがコード内で作成された場所でスローされることがわかります。ここでHeapSize
がインポートと呼ばれる方法です。
[DllImport("kernel32")]
static extern int HeapSize(int hHeap, int flags, void* block);
// Returns the size of a memory block.
public static int SizeOf(void* block)
{
int result = HeapSize(ph, 0, block);
if (result == -1) throw new InvalidOperationException();
return result;
}
これは危険なクラスのコンストラクタの一部として呼び出されます。不足しているとどのようにこの問題を解決することができるもので
public UnManagedBuffer(StringBuilder sb)
{
PtrStart = (byte*)Marshal.StringToHGlobalAnsi(sb.ToString());
Size = UnManagedMemory.SizeOf(PtrStart);
PtrWriteNextValue = PtrStart + Size - 1;
PtrReturnNextValue = PtrStart;
}
任意の手がかり?
これは私がWindbgの中で見たものである。
EventLogには示しています
Log Name: Application
Source: .NET Runtime
Level: Error
Keywords: Classic
Description:
Application: TestEngine.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
at Core.Utils.UnManagedMemory.HeapSize(Int32, Int32, Void*)
at Core.Utils.UnManagedMemory.SizeOf(Void*)
at Core.Utils.UnManagedBuffer..ctor</Event>
Faulting application name: TestEngine.exe, version: 1.0.0.0, time stamp: 0x56b532bb
Faulting module name: ntdll.dll, version: 6.3.9600.18185, time stamp: 0x5683f0c5
Exception code: 0xc0000005
Fault offset: 0x0000000000057306
Faulting process id: 0x2eb8
Faulting application start time: 0x01d164e45b12d7dd
Faulting application path: C:\NGDLM\Lib\TestEngine.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: bea6eb89-d0d7-11e5-80eb-0050568cd888
Faulting package full name:
Faulting package-relative application ID:
あなたはヒープサイズを呼び出すためのPInvokeを使用していますか?メソッド宣言を表示できますか? (また、すべてのマシンはつまり、x64の対x86の同じアーキテクチャです?) – stuartd
は、クラッシュダンプを取る[windbgの+ SOS](https://blogs.msdn.microsoft.com/kaevans/2011/04でそれで突きます/ 11/intro-to-windbg-for-net-developers /) –
はい構成は同じです。両方のマシンがx64で、コードがx64構成で構築されています。 コードは次のとおりです。 [DllImport( "kernel32")] static extern int HeapSize(int hHeap、int flags、void * block); //メモリブロックのサイズを返します。 public static int SizeOf(void * block) { int result = HeapSize(ph、0、block); if(result == -1)新しいInvalidOperationException()をスローします。戻り値: ; } – NVK