센로그

[ED] 4. 문제 발생 지점부터 버그를 추적하거나, 프로그램 시작 지점부터 버그를 찾아나가기 본문

Effective/Effective Debugging

[ED] 4. 문제 발생 지점부터 버그를 추적하거나, 프로그램 시작 지점부터 버그를 찾아나가기

seeyoun 2024. 11. 11. 19:57

문제의 원인을 찾는 방법

  • 문제 원인을 찾는 방법은 크게 두가지다
    • 문제가 발생한 지점에서부터 근본 원인을 추적하기
    • 애플리케이션이 시작하는 지점부터 문제의 원인이 나타날 때까지 찾는 것
  • 문제의 성격에 따라 어느 방법이 효과적인지가 달라진다.

 

문제 발생 시점부터 추적하기

  • 문제가 명확히 드러났다면 문제 발생 시점부터 상향식으로 찾으면 된다.
  • 다음 세 가지 문제 상황으로 나눌 수 있다. 
    • 프로그램이 갑자기 죽는 문제
      • 디버거로 프로그램을 실행하기
      • 프로그램 충돌 시점에 디버거 붙이기
      • 문제가 발생한 후 출력된 메모리 덤프 값 읽어보기
        • 메모리 덤프란, 프로그램 실행 중 메모리에 저장된 데이터와 상태를 그대로 저장한 스냅샷
        • 프로세스의 메모리 상태, 호출 스택, 레지스터 상태, 쓰레드 정보 등을 기록하고 있다
    • 프로그램이 그냥 멈춘 뒤 아무런 반응이 없는 경우
      • 디버거로 프로그램을 실행하다가, 문제가 발생하는 지점에 멈추기
      • 메모리 덤프를 출력하도록 설정하기
      • 만약 외부 라이브러리의 코드 실행 중 문제가 발생한다면, 루틴을 호출하는 흐름을 따라가보면서 프로그램을 멈추게 만드는 루프가 있는지 검사.
    • 문제가 발생했다는 사실이 에러 메시지를 통해 명확히 드러나는 경우
      • 해당 메시지가 나온 부분으로 찾아가기
        • 찾기 명령어를 사용한다. (fgrep -r 명령어를 사용하면 디렉터리 내 모든 파일에서 해당 메시지를 찾을 수 있다)
      • 해당 메시지를 출력하기 직전에 중단점을 지정하거나 로그를 남기는 문장을 추가하여, 어떤 문제가 발생하는지 파악한다.
        • 이때 근본 원인을 찾기 위해 해당 코드의 몇단계 위로 이동해야 할 수도 있다.

 

애플리케이션 시작 시점부터 추적하기

  • 어느 코드에서 문제가 발생한 건지 알 수 없을 때는 문제가 발생한 프로그램의 시작 지점부터 출발하여 에러가 발생할 때까지 추적하는 하향식 방식을 사용하는 것이 좋다.
    • 메모리 문제나, 응답 시간 등 성능과 관련된 속성일 수도 있고, 신뢰성에 관련된 속성일 수도 있고, ...원인은 다양하다.
    • 따라서 전체를 여러 부분으로 쪼개면서 문제의 원인을 찾아나간다.
      • 성능: 프로파일링
      • 보안: 버퍼 오버플로, 코드 인젝션 등 취약점 분석
      • 신뢰성: 내부 상태나 외부 의존성을 하나씩 확인한다.

 

 


나의 생각

+) 덤프 파일이란?

  • 덤프 파일이란 어떤 시점의 디버깅 정보를 담은 파일이다.
  • 프로그램이 충돌하거나 비정상 종료된 시점에 덤프파일을 저장하면 이때의 메모리 상태, 디버깅 정보를 확인할 수 있다.
  • 참고로 Release모드가 아닌 Debug모드로 실행해야 변수 최적화 같은게 되지 않고 상태가 잘 저장된다.

 

+) Visual Studio를 통해 덤프 파일 확인하기

  • 중단됐을 때 덤프 저장을 할 수 있다.
    • 디버그 - 다른 이름으로 덤프 저장

 

  • 우측 상단의 네이티브 전용으로 디버그. 버튼을 누른다.

 

  • 해당 시점의 호출 스택, 로컬 변수, 메모리 상태 등을 분석할 수 있다.

 

+) WinDbg를 통해 덤프 파일 확인하기

  • WinDbg는 Visual Studio보다 더 상세하고 강력한 분석 기능을 제공하여, 특히 메모리와 스레드 관련 문제를 심도 있게 분석할 때 유용하다.

 

+) 충돌 시점에 덤프 파일 자동 생성하도록 하려면?

  • 직접 소스코드를 구현하면 된다.
  • 충돌 시점에 해당 함수를 콜백하도록 하면 자동으로 덤프 파일이 생성될 것
  • 유저에게 배포된 프로그램일지라도, 해당 덤프 파일을 사용해 개발자가 오류를 파악할 수 있다.

 

+) 찾기 명령어

 

Select-String (Microsoft.PowerShell.Utility) - PowerShell

cmdlet은 Select-String 정규식 일치를 사용하여 입력 문자열 및 파일에서 텍스트 패턴을 검색합니다. UNIX 또는 findstr.exe Windows와 유사하게 grep 사용할 Select-String 수 있습니다. Select-String 는 텍스트 줄

learn.microsoft.com

 

 

Comments