안녕하세요.
어제 System 명령 사용에 대한 질문을 했는데
제가 사용했던 소스를 다시 올리겠습니다.
현재 제가 개발한 프로그램이 20대 정도에서 운용하고 있는데,
평균 일주일에 2, 3번 정도 프로그램이 다운되네요.
장비 사양 및, 장비 부하등은 똑 같다고 보시면 됩니다.
일단 제가 개발한 환경은
- Windows 2000 Pro
- Delphi 5
그리고 프로그램 주요 특징 으로는
- 120 개의 스래드가 사용이 됨
- 스래드 멤버 변수도 있지만 전역 변수에 참조 되는 일도 있음.
- 전역 변수는 각각의 스래드가 사용될 수 있도록 120개의 개체가 저장된 TStringList 로 구성됨.
* 닥터 왓슨 로그
스레드 Id 0x690의 상태 덤프(날짜: 2004-10-29 @ 10:20:34.436)
eax=fa3be310 ebx=00000010 ecx=7ff95000 edx=fa3be300 esi=fa3be300 edi=00000003
eip=004022f8 esp=03bbe99c ebp=03bbe9bc iopl=0 nv up ei ng nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010282
함수: <nosymbols>
004022dc 7903 jns 0040a5e1
004022de 83c003 add eax,0x3
004022e1 c1f802 sar eax,0x2
004022e4 8b1590d45b00 mov edx,[005bd490] ds:005bd490=00136aa8
004022ea 8b5482f4 mov edx,[edx+eax*4+0xf4] ds:fac2b8e3=????????
004022ee 85d2 test edx,edx
004022f0 7479 jz 0040ae6b
004022f2 8bf2 mov esi,edx
004022f4 8bc6 mov eax,esi
004022f6 03c3 add eax,ebx
오류 -> 004022f8 8320fe and dword ptr [eax],0xfe ds:fa3be310=????????
004022fb 8b4204 mov eax,[edx+0x4] ds:fac2b8d2=????????
004022fe 3bd0 cmp edx,eax
00402300 751a jnz 0040ae1c
00402302 8bc3 mov eax,ebx
00402304 85c0 test eax,eax
00402306 7903 jns 0040a60b
00402308 83c003 add eax,0x3
0040230b c1f802 sar eax,0x2
0040230e 8b0d90d45b00 mov ecx,[005bd490] ds:005bd490=00136aa8
00402314 33ff xor edi,edi
00402316 897c81f4 mov [ecx+eax*4+0xf4],edi ds:fac2b8e3=????????
*----> 스택 역 추적 <----*
FramePtr ReturnAd Param#1 Param#2 Param#3 Param#4 Function Name
03BBE9BC 0040283E 00403FBD 00000003 00403FE4 03BBFEE4 !<nosymbols>
03BBEAF8 005AD93E 00000000 C0000000 005A4002 03BBFEE4 !<nosymbols>
03BBEB50 005A265E 17FA13B8 FFFFFFFF 00000000 00000000 !<nosymbols>
03BBFF78 005A177F 01339810 0041A0CF 03BBFFA8 0041A10A !<nosymbols>
03BBFFA0 00403E92 03BBFFDC 00403A80 03BBFFB4 03BBFFEC !<nosymbols>
03BBFFB4 77E5438B 01339810 01D10178 02933700 01339810 !<nosymbols>
03BBFFEC 00000000 00000000 00000000 00000000 00000000 kernel32!TlsSetValue
* 해당 소스 설명
// Trace Log를 출력하는 곳입니다.
// 여기에 있는 gLogQueue 에 데이터를 추가하고, 로그를 출력하는 별도의 스래드에서 데이터를
// 파일에 출력합니다. 물론 동기화(CriticalSection 처리는 했습니다.)
procedure WriteTraceLog(const vLOG_STAT : integer;
const vChn : Integer;
const vSn : Integer;
const vSntype : Integer;
const vRcod: Integer;
const vDesc : String);
var strLog : String;
strChannel, strLevel: string;
begin
strChannel := FormatFloat('000', vChn); // 이부분에서 에러가 나는 것 같습니다.
strLog := Format('%s[%s][%3s] %s',[FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', Now), strLevel, strChannel, vDesc]);
EnterCriticalSection(gCCLog);
gLogQueue.Add(strLog);
LeaveCriticalSection(gCCLog);
// 화면에 출력할 것인지 여부 결정. 실제 운용중에는 화면에 출력하지 않음.
if gStLog then
frmSub2.Display_Log(strLog);
end;