2012-01-17 187 views
4

我正在调查发生在我的一个应用程序中的崩溃:我发现这是因为我正在订阅EventLog.EntryWritten事件以监视事件日志中的EntryWritten事件。我一直在Reflector中查看EventLog类,并在WinDBG中跟踪调用堆栈,以查看我的应用程序失败的位置。首先,这里是eestack的在WinDbg中输出围绕在我的应用程序失败:C#应用程序崩溃原因

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 

大致如下,从我在反光这里看到的是get访问为OldestEntryNumber部分:

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); 

所以我猜我的问题是两件事情任何一个:

  1. GetOldestEventLogRecord(...)方法失败的某些原因。
  2. 系统无法访问/加载advapi32.dll。难道这就是为什么我看到StrongNameErrorInfo+0x1031b它可以在!eestack的输出中调用这个方法吗?

任何想法或帮助,这将是真正有帮助和赞赏!

回答

0

你是P/Invoke似乎是错误的。

尝试将其更改为:

[DllImport ("advapi32.dll", SetLastError=true)] 
public static extern int GetOldestEventLogRecord (IntPtr hEventLog, ref int OldestRecord); 

顺便说一句,有检索这些信息的另一种方法:使用托管的EventLog类。

System.Diagnostics.EventLogEntryCollection 
+1

我不能改变它,我正在看Reflector中的这段代码,它都是.NET代码,这段代码来自.NET中的UnsafeNativeMethods类。 – DukeOfMarmalade 2012-01-17 15:49:53

+1

@Jim我更新了帖子,看看 – WoLfulus 2012-01-17 15:51:47

+0

你是什么意思?所有这些代码因为我的应用程序中的这一行代码而被调用:eventLog.EntryWritten + = new EntryWrittenEventHandler(EventLogMonitor);因为我正在订阅EntryWritten事件。所以这就是.NET如何在底层处理这个问题的实现。我不能改变它,我只是想看看它为什么会出错。 – DukeOfMarmalade 2012-01-17 15:56:37

相关问题