본문 바로가기
C++ 200제/코딩 IT 정보

C++ 멀티스레드 디버깅 방법 2가지, 메시지와 sleep 이용한 이론

by vicddory 2017. 1. 14.

C++ 멀티스레드 디버깅 방법 2가지, 메시지와 sleep 이용한 이론


C++ 멀티스레드 디버깅 프로그램의 버그는 운영체제의 스케줄링 타이밍과 연관되어 변동되는 경우가 많으므로 재현하기가 매우 어려울 수 있다. 따라서 C++ 멀티스레드 디버깅 프로그램의 디버깅은 몇 가지 특수한 테크닉을 요구한다.


1. 메시지에 기반을 두어 디버깅한다


C++ 멀티스레드 디버깅 프로그램을 디버깅할 때는 디버깅를 이용하는 것보다 디버깅 메시지를 이용하는 것이 더 효과적일 수 있다. 애플리케이션의 종류에 따라서 cout이나 로그 파일 또는 GUI 컴포넌트 등을 통해 메시지를 출력할 수 있다.


크리티컬 섹션의 시작과 끝 그리고 락의 획득과 해제 시점 각각에 멀티스레드 디버깅 메시지를 삽입한다. 여기서 출력되는 메시지를 분석하면 두 스레드가 동시에 같은 크리티컬 섹션을 점유하거나 한 스레드가 락 때문에 무한히 대기 상태에 빠진 것을 알 수 있다. 즉, 레이스 컨디션이나 데드락 문제를 찾아낼 수 있다.


C++ 멀티스레드 디버깅 방법[C++ 멀티스레드 디버깅 방법 2가지, 메시지와 sleep 이용한 이론]


2. 컨텍스트 스위칭 간에 강제로 슬립(sleep)을 추가한다


만약, C++ 멀티스레드 디버깅 통해서도 문제 재현이 잘 안 되거나, 근본 원인에 대한 감은 잡았지만 정말 맞는지 검증하고 싶다면, 스레드를 특정 시간 동안 잠재우거나 의도적으로 컨텍스트 스케줄링 조건을 만들어 본다.


C++11의 <thread> 헤더에는 sleep_until(), sleep_for() 함수가 std::this_thread 네임스페이스에 정의되어 있다.


락을 해제하기 직전이나, 조건 변수에 시그널을 날리기 직전, 또는 공유 데이터에 접근하기 직전에 몇 초 정도의 슬립을 추가하면 발견되지 못한 레이스 컨디션이 드러날 수도 있다. 만약 이러한 방법으로 근본 원인이 밝혀졌다면, 멀티스레드 디버깅용 슬립 코드나 컨텍스트 전환 코드를 제거해도 정상적으로 동작하도록 수정해야 한다. 만약 이들 멀티스레드 디버깅 코드를 남겨둔 채로 문제를 수정했다면 문제를 잘못 수정한 것이다.


출처 - 전문가를 위한 C++ 2권, 마크 그레고리 외 3명


이런 멀티스레드 디버깅에서 벗어나려면 이론적으론 위의 두 방법을 사용할 수 있습니다. 또한, Qt를 사용한다면 Qt 고유의 이벤트 connect를 사용해 디버깅 문제와 멀티스레드 이슈를 해결할 수도 있습니다.


C++ 멀티스레드 디버깅 방법 2가지, 메시지와 sleep 이용한 이론

댓글