Effective Debugging/Chatper 8. 멀티스레드 코드 디버깅

created : 2020-04-09T13:13:40+00:00
modified : 2020-09-26T14:28:55+00:00

Item 60. 사후 디버깅으로 교착 상태 분석하기

  • 교착상태를 디버깅할 때는 교착 상태에 빠진 시점의 프로그램 상태(스냅샵)를 구한 뒤, 스레드나 코드 흐름에서 자원을 기다리는 코드 지점을 찾아낸다.

Item 61. 프로그램의 실행 흐름을 기록한 뒤 재생하기

  • 발생 빈도가 낮은 동시성 오류를 찾을때는 오류가 발생하는 상황을 기록하고, 그 내용을 분석해서, 기록된 데이터를 다시 디버거로 재생하는 방식으로 작업한다.

Item 62. 전문 도구로 교착 상태와 경쟁 상태 찾기

  • 정적 분석 도구를 이용하여 멀티스레드 프로그램에 존재하는 동기화 및 잠금 관련 에러를 걸러낸다.
  • 동적 분석 도구를 이용하여 멀티스레드 프로그램에서 API를 잘못 사용하는 부분, 교착 상태나 데이터 경쟁 현상이 발생할 가능성이 있는 부분이 있는지 검사한다.

Item 63. 예측할 수 없는 부분을 분리하거나 제거하기

  • 코드에서 동시에 실행되는 부분을 따로 분리한다. 그러면 각 여역에 가장 적합한 디버깅 도구와 기법을 적용하기 쉽다.
  • 예측하기 힘든 부분을 모의 객체로 분리하거나 예측할 수 있는 형태로 바꾸는 기법으로 테스팅 및 디버깅용 환경을 구성한다. 그러면 코드를 반복해서 실행해볼 수 있다.

Item 64. 자원 경쟁으로 인해 발생한 성능 확장성 문제 분석하기

  • 멀티스레드 프로그램에서 성능에 대한 확장성 문제가 발생하면 프로파일링 도구를 이요하여 자원 경쟁이 발생하는지 확인한다.

Item 65. 성능 카운터를 이용하여 거짓 공유 발생 지점 찾기

  • 거짓 공유 문제를 분석하기 위해 성능 카운터를 모니터링할 때는 프로파일링 도구에서 제공하는 기능을 활용한다.

Item 66. 고수준 추상화를 사용하도록 코드 다시 작성하기

  • 동시성 관련 오류가 발생할 가능성이 높은 부분은 특수한 프로그래밍 언어와 프로세스, 도구, 프레임워크, 라이브러리에서 제공하는 고수준의 구문을 최대한 활요하도록 새로 작성한다.