센로그
[ED] 4. 문제 발생 지점부터 버그를 추적하거나, 프로그램 시작 지점부터 버그를 찾아나가기 본문
Effective/Effective Debugging
[ED] 4. 문제 발생 지점부터 버그를 추적하거나, 프로그램 시작 지점부터 버그를 찾아나가기
seeyoun 2024. 11. 11. 19:57문제의 원인을 찾는 방법
- 문제 원인을 찾는 방법은 크게 두가지다
- 문제가 발생한 지점에서부터 근본 원인을 추적하기
- 애플리케이션이 시작하는 지점부터 문제의 원인이 나타날 때까지 찾는 것
- 문제의 성격에 따라 어느 방법이 효과적인지가 달라진다.
문제 발생 시점부터 추적하기
- 문제가 명확히 드러났다면 문제 발생 시점부터 상향식으로 찾으면 된다.
- 다음 세 가지 문제 상황으로 나눌 수 있다.
- 프로그램이 갑자기 죽는 문제
- 디버거로 프로그램을 실행하기
- 프로그램 충돌 시점에 디버거 붙이기
- 문제가 발생한 후 출력된 메모리 덤프 값 읽어보기
- 메모리 덤프란, 프로그램 실행 중 메모리에 저장된 데이터와 상태를 그대로 저장한 스냅샷
- 프로세스의 메모리 상태, 호출 스택, 레지스터 상태, 쓰레드 정보 등을 기록하고 있다
- 프로그램이 그냥 멈춘 뒤 아무런 반응이 없는 경우
- 디버거로 프로그램을 실행하다가, 문제가 발생하는 지점에 멈추기
- 메모리 덤프를 출력하도록 설정하기
- 만약 외부 라이브러리의 코드 실행 중 문제가 발생한다면, 루틴을 호출하는 흐름을 따라가보면서 프로그램을 멈추게 만드는 루프가 있는지 검사.
- 문제가 발생했다는 사실이 에러 메시지를 통해 명확히 드러나는 경우
- 해당 메시지가 나온 부분으로 찾아가기
- 찾기 명령어를 사용한다. (fgrep -r 명령어를 사용하면 디렉터리 내 모든 파일에서 해당 메시지를 찾을 수 있다)
- 해당 메시지를 출력하기 직전에 중단점을 지정하거나 로그를 남기는 문장을 추가하여, 어떤 문제가 발생하는지 파악한다.
- 이때 근본 원인을 찾기 위해 해당 코드의 몇단계 위로 이동해야 할 수도 있다.
- 해당 메시지가 나온 부분으로 찾아가기
- 프로그램이 갑자기 죽는 문제
애플리케이션 시작 시점부터 추적하기
- 어느 코드에서 문제가 발생한 건지 알 수 없을 때는 문제가 발생한 프로그램의 시작 지점부터 출발하여 에러가 발생할 때까지 추적하는 하향식 방식을 사용하는 것이 좋다.
- 메모리 문제나, 응답 시간 등 성능과 관련된 속성일 수도 있고, 신뢰성에 관련된 속성일 수도 있고, ...원인은 다양하다.
- 따라서 전체를 여러 부분으로 쪼개면서 문제의 원인을 찾아나간다.
- 성능: 프로파일링
- 보안: 버퍼 오버플로, 코드 인젝션 등 취약점 분석
- 신뢰성: 내부 상태나 외부 의존성을 하나씩 확인한다.
나의 생각
+) 덤프 파일이란?
- 덤프 파일이란 어떤 시점의 디버깅 정보를 담은 파일이다.
- 프로그램이 충돌하거나 비정상 종료된 시점에 덤프파일을 저장하면 이때의 메모리 상태, 디버깅 정보를 확인할 수 있다.
- 참고로 Release모드가 아닌 Debug모드로 실행해야 변수 최적화 같은게 되지 않고 상태가 잘 저장된다.
+) Visual Studio를 통해 덤프 파일 확인하기
- 중단됐을 때 덤프 저장을 할 수 있다.
- 디버그 - 다른 이름으로 덤프 저장
- 우측 상단의 네이티브 전용으로 디버그. 버튼을 누른다.
- 해당 시점의 호출 스택, 로컬 변수, 메모리 상태 등을 분석할 수 있다.
+) WinDbg를 통해 덤프 파일 확인하기
- WinDbg는 Visual Studio보다 더 상세하고 강력한 분석 기능을 제공하여, 특히 메모리와 스레드 관련 문제를 심도 있게 분석할 때 유용하다.
+) 충돌 시점에 덤프 파일 자동 생성하도록 하려면?
- 직접 소스코드를 구현하면 된다.
- 충돌 시점에 해당 함수를 콜백하도록 하면 자동으로 덤프 파일이 생성될 것
- 유저에게 배포된 프로그램일지라도, 해당 덤프 파일을 사용해 개발자가 오류를 파악할 수 있다.
+) 찾기 명령어
- Windows에서도 fgrep와 비슷한 기능을 사용할 수 있다.
- PowerShell의 경우 Select-String을 사용할 수 있다.
Select-String -Path "C:\경로\*" -Pattern "찾고 싶은 문자열" -Recurse
- Path: 검색할 파일 또는 디렉터리 경로를 지정
- Pattern: 검색할 문자열을 입력
- Recurse: 하위 디렉터리까지 재귀적으로 검색
- PowerShell의 경우 Select-String을 사용할 수 있다.
- 추가 기능들
'Effective > Effective Debugging' 카테고리의 다른 글
[ED] 6. 소프트웨어에서 제공하는 디버깅 기능 활용하기 (0) | 2024.11.12 |
---|---|
[ED] 5. 정상 시스템과 비정상 시스템의 차이점 분석하기 (0) | 2024.11.11 |
[ED] 3. 선행 조건과 후행 조건 만족 여부 확인하기 (0) | 2024.11.11 |
[ED] 2. 해결책을 웹에서 검색할 때 검색어를 구체적으로 표현하기 (0) | 2024.11.11 |
[ED] 1. 모든 문제를 이슈 추적 시스템으로 관리하기 (0) | 2024.11.11 |
Comments