>

텍스트 파일에 디버깅 메시지를 기록하는 프로그램에서 로그 시스템을 만들려고하는데 로그 메시지가 호출 된 코드에 정확한 위치를 저장하고 싶지만 Assert 함수를 사용하고 싶지 않습니다. 예외를 생성하고이 시스템은 예외를 로깅하기위한 것이 아니기 때문에 디버깅 정보도 작성해야합니다.

어설 션을 사용하는 예 :

procedure AnyProcedure();
begin
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Start');//Log occurred is "c:\progr~..jkdj.pas" at line [29]
  end;
  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Step1 done');//Log occurred is "c:\progr~..jkdj.pas" at line [37]
  end;
  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Step2 done');//Log occurred is "c:\progr~..jkdj.pas" at line [45]
  end;
  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log occurred is '+E.Message+' : Step3 done');//Log occurred is  "c:\progr~..jkdj.pas" at line [53]
  end;
  //....some code
  try
    Assert(1=0);
  except
    on E: Exception do
      Log.AddLine('Log '+E.Message+' : End');//Log occurred is "c:\progr~..jkdj.pas" at line [61]
  end;
end;

이것은 예외를 일으키는 유일한 코드이며 코드가 너무 커지기 때문에 함수를 사용할 수 없습니다. 다음 예제 함수 LogMessage를 참조하십시오. 줄이 항상 동일하기 때문에 다른 곳에서 호출하십시오. 또한 파일 이름은 LogMessage 함수가 구현 된 위치입니다.

작동하지 않는 예 :

procedure LogMessage(AMessage: String);
var AFile, ALine: String;
begin
  try
    Assert(1=0);             //line 29
  except
    on E: Exception do
    begin
      AFile:= Copy(E.Message, Pos(' (', E.Message)+2, Pos(', line ', E.Message)-Pos(' (', E.Message)-2);
      ALine:= Copy(E.Message, Pos(', line ', E.Message)+7, Pos(')', E.Message)-Pos(', line ', E.Message)-7);
      ShowMessage('Log occurred in file "'+AFile+'" at line ['+ALine+'] : '+AMessage);
    end;
  end;
end;
procedure AnyProcedure();
begin
  LogMessage('Start'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('step1'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('step2'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('step3'); //Log occurred in file "c:\progr~....jkashdj.pas" at line [29]
//....
  LogMessage('end');
end

도움을 주시고 미리 감사드립니다.

  • 답변 # 1

    자신 만의 TAssertErrorProc 를 묶을 수 있습니다   AssertErrorProc 에 절차  변하기 쉬운. 다음과 같이 쓸 수 있습니다 :

    procedure OnAssert(const Message, Filename: string; LineNumber: Integer;
      ErrorAddr: Pointer);
    begin
      ShowMessage(Format('Assert in file "%s" at line %d.', [Filename, LineNumber]));
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      AssertErrorProc := OnAssert;
    end;
    
    

  • 답변 # 2

    명령 포인터에서 장치 이름 및 행 번호로 매핑하는 가장 쉬운 방법은 madExcept, EurekaLog, JclDebug 등 다양한 디버깅 라이브러리 중 하나를 사용하는 것입니다.

    이러한 도구는 모두 링커에서 생성 한 상세 맵 파일에 의존합니다. 이러한 라이브러리는 예상치 않은 예외에서 버그 보고서를 생성하는 것으로 가장 잘 알려져 있지만 필요한 모든 기능을 갖추고 있습니다.

관련 자료

  • 이전 scala - Spark의 기능 벡터에 IndexToString 적용
  • 다음 javafx - Jackson 데이터 바인드로 객체를 직렬화 할 때 Java InvalidDefinitionException 발생