Copyright 2017 - 2018 Concurrent Real-Time – All Rights Reserved

Blog

2016 년 12 월 21 일

 

무서운 Heisenbug를위한 치료

Heisenbug는 유명한 독일의 이론 물리학자인 Werner Heisenberg의 이름을 따서 명명 된 특히 불쾌한 유형의 소프트웨어 문제입니다. Heisenberg는 1927 년 양자 역학 분야의 선구자로서 입자의 위치를보다 정확하게 측정할수록 운동량 (질량 속도)에 대해 알 수있는 것이 적다는 것을 제안했습니다. 반대의 측정에 대해서도 동일한 명제가 적용됩니다. 그의 생각은 Heisenberg의 불확실성 원리로 알려진 간단한 수학적 불평등으로 표현됩니다.

Heisenbug는 1980 년대에 만들어졌지만 분명히 영리한 말투이며 확실히 불확실성을 내포하지만 Heisenbug는 실제로 관찰자 효과라고하는 다른 물리적 현상의 예입니다. 간단히 말해서, 시스템을 관찰하거나 측정하는 행위는 관찰되는 대상을 변경할 수 있습니다.

관찰자 효과의 예는 유리 수은 체온계를 사용할 때 일어나는 현상입니다. 온도계는 온도를 측정하기 위해 열에너지를 흡수하거나 포기해야하므로 측정하는 동안 실제로 온도를 변화시킵니다. 유사하게 Heisenbug는 소프트웨어 문제로서 조사 중에 증상이 변하거나 사라집니다. 

Heisenbugs의 원인은 무엇입니까? 초기화되지 않은 변수 나 가출 포인터와 같은 몇 가지 간단한 원인이 있지만 가장 심각한 경우에는 타이밍에 뉘앙스가 있습니다. 다중 처리 응용 프로그램에서 타이밍 종속성은 응용 프로그램을 구성하는 개별 프로세스와 스레드간에 종종 존재합니다. 디버거를 사용하면 비동기 이벤트의 타이밍 순서가 크게 달라 지므로 완전히 다른 또는 임의의 응용 프로그램 동작 및 결과가 발생합니다.

Heisenbug를이기려면 고급 디버깅 도구가 필요합니다. GDB와 같은 일반적인 디버거는 변수, 중단 점 조건을 평가할 때 또는 프로세스에 신호를 전달할 때 제어를 취함으로써 프로세스의 정상적인 실행을 방해합니다.

반면에 Concurrent NightStar와 같은 디버거는 최소한의 침입으로 작동하며 Heisenbug 조건을 피하기 위해 특별히 설계되었습니다. 이러한 디버거를 사용하면 조건부 표현식과 브레이크 포인트의 무시 횟수 및 사용자 정의 소스 코드 패치가 프로세스에 직접 삽입되어 응용 프로그램 속도로 실행됩니다. 디버거는 사용자가 찾고자하는 특정 조건이 발생할 때만 제어를 수행하므로 응용 프로그램은 정상적인 실행과 마찬가지로 디버깅 중에 동작합니다. Heisenbug는 탐지에서 숨길 수 없습니다.

영향을 미치지 않는 디버거는 프로그램에 코딩을 변경하지 않고도 실행중인 프로세스에서 실행중인 모든 값의 값을 기록하고 타임 스탬프를 기록 할 수 있습니다. 이들은 프로세스의 주소 공간에 직접 매핑하여이를 수행합니다.
따라서, 애매 모호한 문제로 인해 병이 나면 NightStar와 같은 영향을받지 않는 디버깅 도구가 치료법이 될 수 있습니다.