在夜间构建计算机上构建的应用程序在Windows Server 2012上无法正常工作,但在其他桌面上运行正常。在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中看到:
事件日志显示:
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来调用HeapSize?你能显示方法声明吗? (另外,在所有的机器相同的架构,即86 VS 64?) – stuartd
采取崩溃转储,它与[WinDbg的+ SOS](https://blogs.msdn.microsoft.com/kaevans/2011/04捅/ 11/intro-to-windbg-for-net-developers /) –
是的配置是相同的 - 两台机器都是x64,代码是用x64配置的。 的代码是: [的DllImport( “KERNEL32”)] 静态外部INT HEAPSIZE(INT hHeap,整数标记,无效*块); //返回一个内存块的大小。 公共静态INT一下SizeOf(无效*块) { INT结果= HEAPSIZE(pH值,0,块); if(result == -1)throw new InvalidOperationException(); 返回结果; } – NVK