Eine Anwendung, die auf einem nächtlichen Buildcomputer erstellt wurde, funktioniert unter Windows Server 2012 nicht, funktioniert aber auf anderen Desktops einwandfrei.Unter Windows 7 erstellte Binärdateien schlagen unter Windows Server 2012 fehl
Eine Ausnahme der Art "Versuch, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist." ist geworfen.
Wenn ich debuggen mit remote-Debugging über die WindowsServer2012 Maschine und Maschine zu bauen, sehe ich, dass diese Ausnahme an einer Stelle ausgelöst wird, wo Kernel32 Aufruf HeapSize im Code gemacht wird. Hier wird, wie HeapSize
wird importiert und rief:
[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;
}
Dies als Teil einer unsicheren Klasse Konstruktor aufgerufen wird:
public UnManagedBuffer(StringBuilder sb)
{
PtrStart = (byte*)Marshal.StringToHGlobalAnsi(sb.ToString());
Size = UnManagedMemory.SizeOf(PtrStart);
PtrWriteNextValue = PtrStart + Size - 1;
PtrReturnNextValue = PtrStart;
}
Irgendwelche Hinweise auf das, was fehlen könnte und wie diese zu beheben?
Dies ist, was ich in Windbg sehen:
EventLog zeigt:
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:
Sind Sie PInvoke mit HeapSize anrufen? Können Sie die Methodendeklaration anzeigen? (Sind auch alle Maschinen die gleiche Architektur, dh x86 vs x64?) – stuartd
Nehmen Sie einen Absturzspeicherplatz, stoßen Sie ihn mit [windbg + SOS] an (https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-fuer-net-entwickler /) –
Ja Konfiguration ist die gleiche - beide Maschinen sind x64 und Code ist in x64-Konfig gebaut. Der Code lautet: [DllImport ("kernel32")] statisch extern int HeapSize (int hHeap, int flags, void * block); // Gibt die Größe eines Speicherblocks zurück. public static int GrößeOf (void * Block) { int Ergebnis = HeapSize (ph, 0, Block); if (result == -1) neue InvalidOperationException() werfen; Ergebnis zurückgeben; } – NVK