C#应用程序崩溃原因
本文关键字:崩溃 应用程序 | 更新日期: 2023-09-27 18:20:46
我正在调查我的一个应用程序中发生的崩溃:我发现这是因为我订阅了EventLog.EntryWritten
事件来监视EntryWritten
事件的事件日志。我一直在查看Reflector中的EventLog
类,并遵循WinDBG中的调用堆栈来查看我的应用程序在哪里失败。首先,这里是的输出!WinDBG中关于我的应用程序失败的地方的eestack:
0632e620 74c9e900 mscorwks!StrongNameErrorInfo+0x103e4, calling mscorwks!GetMetaDataInternalInterface+0x7f70
0632e694 74c9e855 mscorwks!StrongNameErrorInfo+0x10339, calling mscorwks+0x31c0
0632e6a0 74215058 (MethodDesc 0x7402b7c4 +0x18 System.Security.CodeAccessPermission.RevertAssert()), calling (MethodDesc 0x740c84fc +0 System.Security.SecurityRuntime.RevertAssert(System.Threading.StackCrawlMark ByRef))
0632e6ac 73df4598 (MethodDesc 0x738bc65c +0xa0 System.Diagnostics.SharedUtils.CreateSafeWin32Exception(Int32)), calling (MethodDesc 0x7402b7c4 +0 System.Security.CodeAccessPermission.RevertAssert())
0632e6e4 73ee6fa0 (MethodDesc 0x738e064c System.Diagnostics.EventLog.get_OldestEntryNumber()), calling mscorwks!StrongNameErrorInfo+0x1031b
0632e6f4 73df24ed (MethodDesc 0x738e06e8 +0x1bd System.Diagnostics.EventLog.CompletionCallback(System.Object)), calling (MethodDesc 0x738e064c +0 System.Diagnostics.EventLog.get_OldestEntryNumber())
0632e728 74bb8cef mscorwks!CoUninitializeEE+0x5687, calling mscorwks!CoUninitializeEE+0x5613
0632e73c 73df0fe4 (MethodDesc 0x738e096c +0x94 System.Diagnostics.EventLog.StaticCompletionCallback(System.Object, Boolean)), calling 739443d4
大致遵循我在Reflector中看到的内容,这里是OldestEntryNumber
:的get访问器的一部分
if (!UnsafeNativeMethods.GetOldestEventLogRecord(this.readHandle, number))
{
throw SharedUtils.CreateSafeWin32Exception();
}
这个Win32Exception
导致我的应用程序崩溃。看UnsafeNativeMethods.GetOldestEventLogRecord(...)
方法:
[DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool GetOldestEventLogRecord(SafeHandle hEventLog, int[] number);
所以我猜我的问题是两件事之一:
GetOldestEventLogRecord(...)
方法由于某种原因而失败- 系统无法访问/加载advapi32.dll。这可能是我在的输出中看到
StrongNameErrorInfo+0x1031b
可能调用此方法的原因吗!eestack
任何关于这方面的想法或帮助都将非常有帮助和感激!
你是p/Invoke似乎错了。
尝试将其更改为:
[DllImport ("advapi32.dll", SetLastError=true)]
public static extern int GetOldestEventLogRecord (IntPtr hEventLog, ref int OldestRecord);
顺便说一下,还有一种检索这些信息的替代方法:使用托管EventLog类。
System.Diagnostics.EventLogEntryCollection