Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

Code Habit

이벤트 뷰어 읽어오기 - ReadEventLog 본문

카테고리 없음

이벤트 뷰어 읽어오기 - ReadEventLog

코드베어 2020. 3. 9. 23:53

윈도우 어플리케이션에 Crash가 발생 하였을 때 우리는 이벤트 뷰어에서 죽은 모듈과 offset 정보등을 가져와 오류상황을 분석할 수 있다. 분석은 빌드 할때 생성한 mapfile과 cod 파일을 이용한다.

 

이벤트 뷰어를 읽어오는 함수로는 ReadEventLog가 있다. 사용하기 전 OpenEventLog로 이벤트 로그를 열고 CloseEventLog로 이벤트 로그를 닫아줘야 한다.

 

예제 소스는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
HANDLE handle;
PEVENTLOGRECORD    pstRecord = NULL;
DWORD dwRecord, dwRead, dwNeeded, dwCbAlloc = 4096;
 
pstRecord = (PEVENTLOGRECORD)new BYTE[dwCbAlloc];
 
handle = OpenEventLog("Application");
GetOldestEventLogRecord(handle, dwRecord);
 
while( TRUE == ReadEventLog(handle,                    // event log handle 
                    EVENTLOG_BACKWARDS_READ |          // reads from most recent 
                    EVENTLOG_SEQUENTIAL_READ,         // sequential read 
                    0,                                // ignored for sequential reads 
                    pstRecord,                        // pointer to buffer 
                    dwCbAlloc,                      // size of buffer 
                    &dwRead,                          // number of bytes read 
                    &dwNeeded )    )                    // bytes in next record
{
    while( dwRead > 0 ) 
    {
        // log info
        
        dwRead -= pstRecord->Length;
    }
}
 
CloseEventLog(handle);

 

이벤트 뷰어의 내용은 정해준 flag(EVENTLOG_BACKWARDS_READ|EVENTLOG_SEQUENTIAL_READ)에 따라 최근거 부터 혹은 예전꺼부터 차례대로 가져온다. 단, 여기서 주의할 것은 ReadEventLog에서 한번에 한가지의 이벤트뷰어의 내용을 가져오는 것이 아니라 할당된 버퍼의 크기 안에서 최대한의 내용을 복수로 가져오게 되는데 각각의 정보에 대한 길이는 PEVENTLOGRECORD구조체의 Length값을 통해 알 수 있다. 즉, 우리는 각각의 이벤트 뷰어 내용을 가져오려면 ReadEventLog함수에서 가져온 버퍼의 첫번째 주소에서 pstRecord->Length값을 더해주면 된다.