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를 테스트 해보라는 소리다.
- 정상 작동 시스템 버전이 100, 오류가 발생한 버전이 132라면,
로그파일 비교를 통해 버그 찾기
- 두 파일의 차이점을 찾아서 화면에 표시해주는 명령어를 사용한다. (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