2012년 11월 13일 화요일

Assert 와 OutputDebugString 사용

로그를 찍어 보자(델마당: 양병규님 글)에서 퍼옴

Assert
Assert는 델파이 함수인데요..  Assert( False, '여기에서 에러났다'); 와 같이 코딩을 하면 이렇게 메세지가 뜹니다.

에러아이콘+내가 지정한 메세지+Assert함수를 호출한 유닛명+라인넘버가 같이 뜹니다.

첫번째 파라미터인 Condition은 말그대로 컨디션인데... 컨디션이 True이면 상태가 좋은거고 컨디션이 안좋으면 상태가 안좋은겁니다. 그래서 True일때는 상태가 좋으므로 에러가 아닌 상황이고 False일때는 상태가 안좋으니깐 에러인 상황입니다. 즉, 컨디션이 False일때만 메세지가 출력된다는 얘기였습니다. 
물론 False라고 직접 써도 좋지만 Boolean형 변수를 이용하던가 아니면 Assert( i >= 0, '0 보다 작으면 안되는데..' );와 같이 이용해도 좋습니다.

OutputDebugString

OutputDebugString은 API 함수인데요. OutputDebugString( '여기에서 에러 났다' );와 같이 코딩하고 반드시 Run(F9)를 한 다음 View->Debug Windows->Event Log를 클릭해서(혹은 Ctrl+Alt+V) 이벤트로그 창을 띄워 놓으면 OutputDebugString 함수가 실행될때 이벤트로그 창에 다음과 같이 메세지가 뜹니다.
앞에 ODS라고 써는것이 OutputDebugString으로 찍은 메세지인데요 실제로 해보면 이 외에도 프로세스가 실행될때라든가 기타 여러가지 정보가 같이 올라오는데, 이벤트로그 창에서 오른쪽메뉴에서 Properties를 클릭하면 나오는 대화상자에서 Messages 그룹박스에 Output messages만 체크하고 나머지는 체크해제하면 OutputDebugString만 뜨게됩니다.(물론 다른 메세지들도 활용하면 좋습니다.)

Assert + OutputDebugString
앞에 두 가지는 잘 아는 내용이었구요.  이번에는 이 두 가지를 혼용하는 방법을 소개하겠습니다. Assert함수는 앞서 소개한 메세지창을 띄우는 방법이 일반적이지만 사용자가 어떤 식으로 출력할지를 세팅할 수 있게 되어 있습니다.
AssertErrorProc을 이용하면 되는데요... AssertErrorProcSystem유닛에 선언되어 있는 전역변수이고 프로시져타입으로 원형은 다음과 같습니다.
type
  TAssertErrorProc = procedure (const Message, Filename: string;
    LineNumber: Integer; ErrorAddr: Pointer);
이런 형식으로 프로시져를 만들어서 AssertErrorProc에 할당해 주면 Assert함수가 호출될 때 이 프로시져를 호출해 줍니다. 프로시져 안에서 OutputDebugString을 이용하게되면 Assert를 호출할 때마다 이벤트로그 창에 메세지와 유닛명, 라인넘버가 함께 찍히게 됩니다.
다음은 그 예제이구요..
procedure AssertProc(const Message, Filename: String;
                    LineNumber: Integer; ErrorAddr: Pointer);
begin
  OutputDebugString( PChar( ExtractFileName( Filename ) +
    '(' + IntToStr( LineNumber )+' Line) '+ 
Message ) );                
end;
procedure TForm1.Button1Click(Sender: TObject);
var  i: Integer;
begin
  i := -1;

  Assert( i >= 0, 'i는 0보다 작으면 안되는데..' );
end;

initialization
  AssertErrorProc := AssertProc;
Button1을 클릭하면 이벤트로그창에 다음과 같이 찍힙니다.
유닛명과 라인수가 함께 출력이 되고 별도의 if문 없이도 상황에 따라서 선택적으로 출력할 수 있어서 좋습니다. 또한 디버깅시에만 동작하는 OutputDebugString을 이용함으로써 이 상태로 배포해도 되고 메세지박스를 띄우는 것이 아니므로 쓰레드나 메세지등과 같이 시간이나 절차에 민감한 에러를 잡을 때 편리합니다.

댓글 없음:

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.