Q&A

  • SysGetMem 에러에 대한 문의
안녕하세요.
어제 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;



0  COMMENTS