Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- window
- GO 언어
- FOR
- JavaScript
- mutex
- go언어
- go
- write
- Close
- http
- API
- Python
- Callback
- range
- json
- windows
- Golang
- 영화
- Sync
- Linux
- C
- package
- bitcoin
- 책
- File
- c++
- tcp
- channel
- 리뷰
- install
Archives
- Today
- Total
Code Habit
이벤트 뷰어 읽어오기 - ReadEventLog 본문
윈도우 어플리케이션에 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값을 더해주면 된다.