지상국 운용 중 서버 프로그램이 디버깅 창과 함께 비정상 종료되는 문제가 간헐적으로 발생하였습니다.
Debug Assertion Failed
→ 프로그램이 정상적으로 구동되기 위한 환경 조건을 체크한 후 비정상인 경우 프로그램을 종료하며 출력해주는 메시지
(_osfile(fth) & FOPEN)
→ 정상 확인을 위한 환경 조건 체크 구문, 해당 구문에 의한 체크가 실패한 것으로 확인됨
write.c
→ 파일연산(File Open/Write/Read 등)과 관련된 Framework (Visual Studio 2005) 내부 소스코드인 것으로 확인
int __cdecl _write(int fh, const void* buf, unsigned cnt) {
...
// 68번 라인, 디버그 모드에서 Asssertion 구문
_VALIDATE_CLEAR_OSSERR_RETURN((_osfile(fh) & FOPEN), EBADF, -1);
...
// 릴리즈 모드에서 위와 동일한 역할 수행
if (_osfile(fh) & FOPEN) {
...
} else {
...
// 릴리즈 모드에서 출력 될 오류 메시지
_ASSERTE(("Invalid file descriptor. File possibly closed by a different thread", 0));
}
return r;
}
C run-time I/O now supports up to 8,192 files open simultaneously at the low I/O level. This level includes files opened and accessed using the _open, _read, and _write family of I/O functions. By default, up to 512 files can be open simultaneously at the stream I/O level. This level includes files opened and accessed using the fopen, fgetc, and fputc family of functions.
for (int i = 0; i < 512; i++) {
str.Format("D:\\%d.txt", i);
errno_t e = fopen_s(&fp, str, "w");
int ret = fwrite("test", sizeof(char), strlen("test"), fp);
}
서버 프로그램 실행 파일과 사용하는 모든 라이브러리 파일 설정 확인 결과 동일한 설정이 문제 없이 적용됨 확인
일부 사용중인 DLL 파일은 소스코드가 없어 Dependancy Walker 툴을 활용하여 상태 확인 ( MFC80D.DLL, MSVCR80D.DLL 종속성을 가진 경우 Multi-threaded DLL 설정임을 확인 )
프로그램 비정상 종료 시, 종료 시점의 프로그램 컨텍스트 (소스파일, 함수, 소스라인, 콜스택 등 확이) 확인을 위해 Proc Dump 프로그램 사용
덤프 파일 확인을 통해 비정상 종료 시점의 코드 확인하였고, 특정 소스코드에서 fopen 이후 fwrite 호출 중 비정상 종료 확인
해당 코드는 1초에 한번씩 약 13,000 바이트 크기의 로그를 파일에 기록하고 있는데, 실제로 사용하지 않는 쓰레기 로그로 확인되어 관련 코드를 제거하기로 운영팀과 함께 결정
fwrite() 호출 시 프로그램이 죽는 원인은 파악하지 못함