पर काम करता है रात की बिल्ड मशीन पर बनाया गया एक एप्लीकेशन विंडोज सर्वर 2012 पर काम नहीं करता है लेकिन अन्य डेस्कटॉप पर ठीक काम करता है।विंडोज 7 पर निर्मित बिनरी विंडोज सर्वर 2012
का अपवाद "संरक्षित स्मृति को पढ़ने या लिखने का प्रयास किया गया। यह प्रायः एक संकेत है कि अन्य स्मृति भ्रष्ट है।" फेंक दिया गया है
जब मैं WindowsServer2012 मशीन और मशीन बनाने के लिए दूरस्थ डिबगिंग का उपयोग करके डीबग करता हूं, तो मुझे लगता है कि यह अपवाद उस स्थान पर फेंक दिया गया है जहां कर्नेल 32 कॉल HeapSize कोड में बनाया गया है। यहाँ कैसे HeapSize
आयात किया जाता है जाता है और कहा जाता है:
public UnManagedBuffer(StringBuilder sb)
{
PtrStart = (byte*)Marshal.StringToHGlobalAnsi(sb.ToString());
Size = UnManagedMemory.SizeOf(PtrStart);
PtrWriteNextValue = PtrStart + Size - 1;
PtrReturnNextValue = PtrStart;
}
क्या याद आ रही है और कैसे इसे ठीक करने के किया जा सकता है पर कोई सुराग:
[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;
}
यह कहा जाता है एक असुरक्षित वर्ग के निर्माता के हिस्से के रूप?
यह है कि मैं क्या 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 64 बनाम हैं?) – stuartd
, एक क्रैश डंप ले लो [windbg + एसओएस] (https://blogs.msdn.microsoft.com/kaevans/2011/04 साथ उस पर प्रहार/11/परिचय-से-विंडबग-नेट-डेवलपर्स /) –
हाँ कॉन्फ़िगरेशन समान है - दोनों मशीनें x64 हैं और कोड x64 कॉन्फ़िगरेशन में बनाया गया है। कोड है: [डीएलआईएमपोर्ट ("कर्नेल 32")] स्थैतिक बाहरी int हेपसाइज (int hHeap, int flags, शून्य * ब्लॉक); // स्मृति ब्लॉक के आकार को वापस करता है। सार्वजनिक स्थैतिक int sizeof (शून्य * ब्लॉक) { पूर्णांक परिणाम = HeapSize (पीएच, 0, ब्लॉक); अगर (परिणाम == -1) नया अवैधऑपरेशन अपवाद(); वापसी परिणाम; } – NVK