이벤트 로그 - Windows Error Reporting / IPX Assertion / KorIME.exe
이벤트 로그에 다음과 같은 비정상 종료 이벤트가 남습니다.
Log Name: Application
Source: Windows Error Reporting
Date: 2014-11-03 오후 3:32:17
Event ID: 1001
Task Category: None
Level: Information
Keywords: Classic
User: N/A
Computer: win2012rp.testad.com
Description:
Fault bucket , type 0
Event Name: IMECustomerEvent
Response: Not available
Cab Id: 0
Problem signature:
P1: IPX Assertion
P2: 0KOR
P3: KorIME.exe
P4: 6.3.9600.16384
P5: KorIME.exe
P6: 6.3.9600.16384
P7: Windows\feime\Modern\IMEexe\common\CImeKeyboardInputProvider.h
P8: 489
P9:
P10:
Attached files:
These files may be available here:
C:\ProgramData\Microsoft\Windows\WER\ReportQueue\NonCritical_IPX Assertion_b991e9b37c61384f40913141a13bc6244838d85e_00000000_cab_4c625e60
Analysis symbol:
Rechecking for solution: 0
Report Id: 26b5115c-6323-11e4-bc59-00155d805a04
Report Status: 4
Hashed bucket:
예전에도 한번 이에 관해서 다뤘는데요.
Windows Server 8.1/2012 R2 - IME 비정상 종료 현상
; https://www.sysnet.pe.kr/2/0/1509
그 당시에는 WER 서비스를 중지하는 것으로 답을 냈는데 왠지 아무리 생각해도 이건 아니다 싶습니다. ^^ 그런데, 지금도 여전히 이에 대해 검색해 보면 이렇다 할 답이 없습니다. 그나마 영양가 있는 답이라면, WER 서비스로 하여금 KorIME.exe를 무시하도록 설정하는 것이 있는데요.
WER 서비스를 보면,
Windows Error Reporting
; https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490841(v=technet.10)
다행히, 특정 exe 프로세스를 대상으로 무시하는 옵션을 추가할 수 있습니다.
WER Settings
; https://docs.microsoft.com/en-us/windows/win32/wer/wer-settings
방법은 이렇습니다. 다음의 레지스트리 키로 가서,
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting
하위에 "ExcludedApplications" 서브 키가 없다면 새롭게 생성하고, 필터링하고 싶은 EXE 명의 REG_DWORD 유형으로 1 값을 넣어 생성해 둡니다. 예를 들어, 필터링하고 싶은 EXE 명이 "MyConsole.exe"라면 다음과 같이 생성할 수 있습니다.
따라서, 이 글에서 다루고 있는 이벤트 로그를 없애고 싶다면 "KorIME.exe" 이름으로 값을 생성하면 됩니다.
참고로, 프로그램으로도 이 레지스트리 키를 다룰 수 있습니다. 해당 레지스트리에 항목을 넣고 빼는 Win32 API로 다음의 함수들이 제공됩니다.
WerAddExcludedApplication
; https://docs.microsoft.com/en-us/windows/win32/api/werapi/nf-werapi-weraddexcludedapplication
WerRemoveExcludedApplication
; https://docs.microsoft.com/en-us/windows/win32/api/werapi/nf-werapi-werremoveexcludedapplication
C#으로는 PInvoke 구문을 이용해 이런 식으로 만들 수 있습니다.
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
[DllImport("wer.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public extern static int WerAddExcludedApplication(string exeName, bool allUsers);
[DllImport("wer.dll", CharSet = CharSet.Unicode)]
public extern static int WerRemoveExcludedApplication(string exeName, bool allUsers);
static void Main(string[] args)
{
string exeName = Process.GetCurrentProcess().ProcessName + ".exe";
Console.WriteLine(exeName);
int result = WerAddExcludedApplication(exeName, true);
int win32Error = Marshal.GetLastWin32Error();
if (result != 0)
{
Console.WriteLine("Error: " + result + ", Win32Error: " + win32Error);
// 1300: Not all privileges or groups referenced are assigned to the caller.
}
Console.ReadLine();
WerRemoveExcludedApplication(exeName, true);
}
}
당연하겠지만, HKEY_LOCAL_MACHINE 레지스트리 키를 건드리는 것이므로 관리자 권한으로 실행하지 않으면 1300 오류가 발생합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]