C # Причина сбоя приложения - PullRequest
4 голосов
/ 17 января 2012

Я расследую сбой, происходящий в одном из моих приложений: я обнаружил, что это потому, что я подписываюсь на событие EventLog.EntryWritten, чтобы отслеживать журнал событий для событий EntryWritten.Я смотрел на класс EventLog в Reflector и следил за стеком вызовов в WinDBG, чтобы увидеть, где происходит сбой моего приложения.Прежде всего, вот вывод! Eestack в WinDBG, где происходит сбой моего приложения:

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, является частью средства доступа 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?

Любые идеи или помощь по этому вопросу были бы действительно полезны и оценены!

1 Ответ

0 голосов
/ 17 января 2012

Вы P / Invoke, кажется, не так.

Попробуйте изменить его на:

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

Кстати, есть альтернативный способ получения этой информации: использование управляемогоКлассы EventLog.

System.Diagnostics.EventLogEntryCollection
...