센로그

[ED] 5. 정상 시스템과 비정상 시스템의 차이점 분석하기 본문

Effective/Effective Debugging

[ED] 5. 정상 시스템과 비정상 시스템의 차이점 분석하기

seeyoun 2024. 11. 11. 22:25

차이점을 분석하면서 디버깅

  • 플랫폼을 옮긴다거나, 버전업을 하는 등의 상황에서는 기존 시스템과 새로운 시스템을 동시에 살펴봐야 하는 경우가 있다.
  • 이런 경우 두 시스템의 차이점을 분석함으로써 디버깅을 하면 효과가 좋다.

 

디버깅 하는 방법

  • 우선 로그 파일을 찬찬히 들여다보며 오류를 찾는다.
  • 그러나 로깅 메커니즘이 원하는 만큼 로그를 출력하지 않는다면, 트레이싱 도구로 런타임 동작을 분석할 수 있다.
    • 세부적인 부분에 특화된 도구들이 존재한다.
      • 운영체제 호출 과정 추적
        • strace, truss, Procmon...
      • dll 호출 과정 추적
        • ltrace, Procmon...
      • 네트워크 패킷 추정
        • tcpdump, Wireshark
      • SQL db 호출 추적
  • 대조 방식으로 디버깅하기 위한 환경을 꾸미고, 명확한 부분(입력이나 명령줄 인수 등)부터 시작한다.
    • 추측하지 말고 직접 확인하도록 한다.
    • 가능하다면 두 시스템에 대한 입력 파일을 직접 비교하라는 뜻이다.
  • 그리고 나서 코드 분석을 한다.
    • Visual studio의 경우 dumpbin을 사용할 때 /dependents 옵션을 켜서, 사용하는 동적 라이브러리도 함께 분석한다.

 

간과하고 있는 다른 요인은 없는지 확인

  • 소스코드 단으로 깊게 파고들기 전에 간과하고 있는 다른 요인은 없는지 확인하면 좋다.
    • 대표적으로 환경변수, 운영체제 등이 있다.

 

버전의 범위를 좁혀나가며 확인

  • 이진 탐색 방식으로 범위를 빠르게 좁혀나간다.
    • 정상 작동 시스템 버전이 100, 오류가 발생한 버전이 132라면,
      우선 중간값인 116부터 테스트해보고,
      오류가 있다면 108을, 오류가 없다면 124를 테스트 해보라는 소리다.

 

로그파일 비교를 통해 버그 찾기

  • 두 파일의 차이점을 찾아서 화면에 표시해주는 명령어를 사용한다. (diff 등)
  • 타임스탬프 같은 건 당연히 다를 테니, 미리 잘라내도록 한다. (cut, awk 등)

 


나의 생각

+) Windows에서 로그 파일 비교를 위한 명령어

  • fc : 기본 텍스트 비교 도구, 옵션을 사용해 세부 조정 가능
    • 행 단위 비교 (/L 옵션)
    • 대소문자 무시 (/C 옵션)
    • 문자별 비교 (/B 옵션)
    • 동기화된 위치에서 비교 시작 (/A 옵션)
fc /옵션 log1.txt log2.txt
  • PowerShell의 Compare-Object : 행 단위 비교에 강력하며, 어느 파일에만 있는지 표시
Compare-Object (Get-Content log1.txt) (Get-Content log2.txt)
  • PowerShell의 -replace: 불필요한 부분을 제거하고 비교
# 정규 표현식을 사용하여 타임스탬프 제거하고 비교
$log1 = Get-Content log1.txt | ForEach-Object { $_ -replace "\[\d{2}:\d{2}:\d{2}\]", "" }
$log2 = Get-Content log2.txt | ForEach-Object { $_ -replace "\[\d{2}:\d{2}:\d{2}\]", "" }

Compare-Object $log1 $log2

 

Comments