센로그

[ED] 17. 오류의 효과 극대화하기 본문

Effective/Effective Debugging

[ED] 17. 오류의 효과 극대화하기

seeyoun 2024. 11. 15. 15:52

발생하는 문제가 눈에 잘 띄게 만들면 디버깅 작업의 효율을 높일 수 있다.

  • 문제가 항상 발생하도록 한다든지, 의심되는 코드 이외의 다른 부분을 모두 주석처리 해본다든지 하는 방법이 있다.
  • 이때 모든 작업을 버전 관리 시스템을 통해 브랜치로 관리하도록 한다.

 


버그가 발생하는 것을 보는 것조차 힘든 경우도 있다

  • 특히 게임에서, 특정 이벤트가 발생할 때마다 이유 없이 버그가 발생하는 경우가 많다.
  • 이런 경우 특정 이벤트를 추측하여 이벤트가 더 자주 발생하도록 하거나, 발생하는 버그의 수준을 높여볼 수 있다.
    • 예를들어 갑자기 캐릭터의 파워가 살짝 높아지는 버그가 발생할 수 있다.
    • 이런 경우 변화량이 미미하기 때문에, 다른 경우에서도 발생한다는 것을 눈치채지 못하는 것일 수도 있다.
    • 따라서 파워가 급격히 증가하도록 코드를 수정하면 문제를 확실히 볼 수 있다.

 


문제의 발생 원인이 외부에 있다면, 실행 환경을 수정하여 효과를 극대화할 수도 있다.

  • 오류 발생 즉시 소프트웨어를 멈추도록 한다거나, 오류가 좀 더 자주 발생하도록 수정할 수 있다.
  • 멀티스레드를 사용한다면 굉장히 많은 스레드들을 실행해보면, 교착 상태나 경쟁 상태가 더 잘 드러날 수도 있다.
    • 또는 여러 프로세스를 동시에 실행하여 한정된 자원을 놓고 경쟁하게 만들어볼 수도 있다.

 


잘 드러나지 않는 데이터 유효성 문제나 데이터 손상 문제를 분석할 때는

  • 퍼징(fuzzing) 이라는 테스트 기법을 사용할 수 있다.
    • 예상치 못한 입력 데이터를 프로그램에 대량으로 제공하여 오류나 취약점을 찾는 과정을 의미한다.
    • AFL(American fuzzy lop), zzuf와 같은 도구를 활용한다.
  • 프로그램에 전달할 입력값을 임의로 생성하거나, 입력되는 값을 인위적으로 흐트러뜨린 뒤, 어떤 현상이 나타나는지 관찰한다.
    • 이 과정에서 사람이 직접 설계하지 않은 엣지 케이스를 발견할 수도 있다.
  • 이때 중요한 것은, 오류를 발생시키는 데이터 패턴의 출현 빈도를 시스템적으로 높이는 것이다.
    • 수집한 데이터의 패턴을 기반으로 오류를 분석하도록 한다.

 


추가

+) 브랜치를 사용하면 좋은 점

  • 독립적인 작업환경
    • 현재 작업을 기존 코드베이스에 영향을 주지 않고 독립적으로 진행할 수 있다.
    • 따라서 새로운 기능 개발, 버그 수정, 실험 등을 다른 작업과 충돌 없이 진행해볼 수 있다.
  • 안전한 코드 관리
    • 메인 브랜치는 항상 배포 가능한 상태로 유지된다.