Ứng dụng được xây dựng trên máy xây dựng hàng đêm không hoạt động trên Windows Server 2012 nhưng hoạt động tốt trên các máy tính để bàn khác.Các tệp nhị phân được xây dựng trên Windows 7 không thành công trên Windows Server 2012
Ngoại lệ loại "Đã cố gắng đọc hoặc ghi bộ nhớ được bảo vệ. Đây thường là dấu hiệu cho thấy bộ nhớ khác bị hỏng". được ném.
Khi tôi gỡ lỗi bằng cách sử dụng gỡ lỗi từ xa trên máy WindowsServer2012 và máy xây dựng, tôi thấy rằng ngoại lệ này được ném tại một nơi mà kernel32 gọi HeapSize được thực hiện trong mã. Dưới đây là làm thế nào HeapSize
được nhập khẩu và được gọi là:
[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;
}
này được gọi là một phần của nhà xây dựng một lớp học không an toàn của:
public UnManagedBuffer(StringBuilder sb)
{
PtrStart = (byte*)Marshal.StringToHGlobalAnsi(sb.ToString());
Size = UnManagedMemory.SizeOf(PtrStart);
PtrWriteNextValue = PtrStart + Size - 1;
PtrReturnNextValue = PtrStart;
}
Bất kỳ manh mối về những gì có thể thiếu và làm thế nào để sửa lỗi này?
Đây là những gì tôi thấy trong Windbg:
EventLog cho thấy:
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:
Bạn đang sử dụng PInvoke để gọi HeapSize? Bạn có thể hiển thị tuyên bố phương pháp? (Ngoài ra, tất cả các máy có cùng kiến trúc, tức là x86 vs x64?) – stuartd
Lấy một bãi chứa sự cố, poke nó với [windbg + SOS] (https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-for-net-developers /) –
Có cấu hình giống nhau - cả hai máy đều là x64 và mã được cấu hình trong cấu hình x64. Mã này là: [DllImport ("kernel32")] static extern int HeapSize (int hHeap, int flags, void * block); // Trả về kích thước của khối bộ nhớ. static tĩnh int SizeOf (void * block) { int result = HeapSize (ph, 0, block); if (result == -1) ném InvalidOperationException mới(); kết quả trả về; } – NVK