안녕하세요.
날씨가 싸늘해지는 겨울이네요.
저는 서버 엔진을 개발하고 있는 Delphi 프로그래머 입니다.
제가 개발하는 엔진에서 이해가 되지 않는 에러가 발생하여
이렇게 도움을 구합니다.
개발 환경은 다음과 같습니다.
- Windows 2000 Pro
- Delphi 5
엔진 아키텍쳐는 다음과 같은 특징이 있습니다.
- 120개의 스래드에서 각각의 동작을 수행함.
- 각각의 스래드의 멤버 변수들이 존재함.
- 핵심적인 정보는 전역 변수에서 참조함.
전역 변수는 TStringList 리스트로 관리를 함.(gPortList : TStringList;)
이 전역 변수에 직접 설계한 Record 구조체를 AddObject 하여 저장함.
나중에 이 전역 변수를 사용할 때 해당 스래드의 Key 를 이용하여 Read/Write 함.
이 전역 변수에 접근할 때 CriticalSection을 이용하지 않음.
이런 상황에서 다음과 같은 문제가 발생합니다.
- 특정 스래드에서 Access Violation이 발생함.
- 특정 스래드에서 처음 발생하면 점차적으로 다른 스래드에서도 발생하다가 프로그램이 다운됨.
- Dump 파일을 분석해 보니까 "오류 -> 00401fdb 8b10" 에러가 발생함.
- Map 파일을 이용해서 분석해 보니까 "InsertFree" 에서 발생함.
제가 궁금해 하는 것은
- 위의 에러 내용중에 "오류 -> 00401fdb 8b10"를 경험해 보셨는지요.
- Map 파일의 "InsertFree"의 오류를 경험해 보셨는지요.
- 전역 변수에 접근할 때 CriticalSection을 이용해서 해야 하는지, 안해도 되는지요.
- 만약 CriticalSection을 사용하면 속도가 떨어지지 않은지.
- 혹시 Delphi 5의 Bug인지. (Gabbage Collection 등에 영향으로 메모리가 재 할당될때 등등)
어떠한 답이라도 감사 드리겠습니다.
일주일이 넘도록 이 문제를 해결하지 못해서 답답합니다.
참고로 MultiThread 에서 전역변수 동기화를 해 줘야 하지만,
전체가 멈쳐지는 현상을 방지할려고 이렇게 구현 했습니다.
전체 전역 변수는 배열 형식으로 되여 있다고 보시면 되고
해당 스래드별의 인덱스를 이용하여 해당 배열의 행을 사용하는 것이지요.
여러 델파이맨 분들에서 가르침을 기다리겠습니다.
그럼 오늘도 즐거운 하루가 되십시요....^^