본 프로그램은 특정 프로세스의 런타임 파일 API 호출 로그를 분석하여 API 사용 상의 오류를 찾습니다. 구체적으로 아래의 오류 케이스를 찾아서 리포팅합니다.
- 512개 이상의 파일을 동시에 열고 쓰기를 시도하는 케이스
- 파일을 열고 닫지 않는 케이스
- 닫힌 파일에 대한 쓰기 시도를 하는 케이스
유지보수 계약을 맺고있던 서버 프로그램(C++, MFC)이 아래와 같은 오류 메시지를 남기며 간헐적으로 비정상 종료되기 시작했습니다.
확인해 보니 서버 프로그램은 C Runtime 파일 라이브러리를 사용하고 있었고, Debug 모드로 빌드된 실행파일을 사용하고 있었습니다.
그리고 해당 오류 메시지를 출력하는 fwrite.c 프레임워크 코드를 확인한 결과, 닫힌 파일에 대해 쓰기를 시도할 때 발생할 수 있다는 Assertion 문구를 확인할 수 있었습니다.
또한 관련된 이론적 배경을 찾기위해 MSDN 을 탐색하던 중, C Runtime에서는 512개 이상의 파일을 동시에 열 수 없는 제약이 있음을 알았고 의도적으로 512개의 파일을 동시에 열고 쓰기를 시도하는 경우 동일한 오류창과 함께 문제가 재현됨을 확인하였습니다.
그래서 Process Monitor를 통해 프로그램 실행 중 파일 API 호출 로그를 수집했고, 7만여 라인의 로그를 분석하기 위한 자동화된 소프트웨어를 개발하게 되었습니다.
프로그램의 입력은 Process Monitor (Windows Sysinternals 제공)를 통해 수집한 런타임 파일 API 호출 로그입니다. Process Monitor에서 파일 관련 API (CreateFile, CloseFile, WriteFile, ReadFile)를 필터링하고, csv 파일 형태로 내보내기 하시면 됩니다. Process Monitor 로그 수집 및 내보내기 방법은 링크를 참고하시면 도움이 됩니다.
이제 Start 버튼을 클릭하고, Process Monitor 로그 파일을 선택하면 자동으로 분석 작업이 시작되고 결과를 리포팅해줍니다.
- [ Output ] : 동시에 열린 파일 개수 최대치 출력
- [ 열리고 닫히지 않은 파일 ] : 열리고 닫히지 않은 파일 목록 및 전체 개수 출력
- [ 닫힌 파일에 대한 쓰기 시도 ] : 닫힌 파일에 대한 쓰기 시도한 파일 목록 및 전체 개수 출력
- C#
- Visual Studio 2019
- .NET Framework 4.7.2