RECORD & REPLAY 와 관련한 논문들에 대해서 내용 정리한 것을 적었다.
국내 논문
다중스레드 프로그램의 디버깅을 위한 사건 순서 정보
다중스레드 프로그램에서 사건 순서 정보를 알아내는 데, 사용되는 4 가지 방법을 설명하고 있다.
OpenMP 프로그램을 위한 디버깅 도구
OpenMP 프로그램을 디버깅하는 데 사용되는 툴(tool) 을 소개하고 있다.
공유메모리 프로그램의 디버깅을 위한 프로그램 재구성
병렬 프로그램 수행 중에 경합을 탐지할 때, 필요한 기억 공간을 줄일 수 있는 방안으로 동기화를 가지는 병렬 프로그램에서 공간 효율적인 수행중 경합탐지를 위한 순차적 모니터링이 가능하도록 원시 프로그램을 재구성하는 기법을 소개하고 있다.
메시지전달 프로그램의 디버깅을 위한 메시지 경합의 탐지
메시지 경합은 동일한 채널로 두 개 이상의 메시지들이 수신자에게 도착순서가 보장되지 않고 전송될 수 있을 때 발생한다. 이때 경합하는 메시지들의 비결정적인 도착순서는 프로그램의 의도되지 않은 비결정적인 수행 결과를 초래하므로, 효과적인 디버깅을 위해서 메시지 경합은 반드시 탐지되어야 한다. 경합을 탐지하는 기법은 크게 정적 분석 기법, 수행후 탐지 기법, 수행중 탐지 기법등으로 구분될 수 있으며, 이들 중에서 수행중 탐지 기법이 가장 효율적이다. 왜냐하면 프로그램 수행 중에 경합을 탐지하기 때문에 실제적인 경합을 탐지할 뿐만 아니라 경합이 존재한다면 최소한 하나의 탐지는 보장하기 때문이다. 기존의 경함을 탐지하는 도구들은 영향 받은 경합과 영향받지 않은 경합에 대한 구분이 없이 탐지하므로 효과적인 디버깅을 할 수 없다.
병렬 프로그램의 복잡한 수행형태 및 경합 탐지 결과를 효과적으로 시각하화는 도구가 필요하다.
공유 메모리와 메시지 전달이 혼합된 병렬 프로그램의 디버깅을 위한 경합탐지
공유 메모리와 메시지 전달을 혼합하여 사용하는 병렬 프로그램은 논리적인 오류 외에도 경합조건 등의 병렬 오류 즉, 자료 경합과 메시지 경합이 발생하게 된다. 현재로는 OpenMP/MPI 의 혼합형 프로그램 모델에서의 수행속도 향상에 따른 연구가 주류를 이루고 있다.
OpenMP/MPI 의 혼합형 프로그램 모델에서의 디버깅을 위한 새로운 기법을 소개한다. 여기서 소개한 DV 레이블링 기법은 크게 2 가지 측면에서 그 의미를 가진다. 첫째는 기존의 기법들과 비교해볼 때, 병행성 정보 생성 시에 병목현상을 제거하여 확장성을 제공하면서도 병행성 정보 적용 시에 효율적인 시간 복잡도를 제공하고 있으며, 둘 째는 공유메모리와 메시지전달 프로그램 각각에 대해서 적용가능할 뿐만 아니라 이를 혼합하여 사용하는 병렬 프로그램에서도 병행성 정보를 동적으로 생성함으로써 효율적인 수행중 경합 탐지가 가능하다.
프로그램 디버깅을 위한 휴리스틱 지식의 응용
프로그램을 디버깅할 때, 디버깅 정보와 방법등을 데이터베이스화 시켜서 프로그램이 실패(fault) 했을 때 이를 참조하여 개발자가 좀 더 빠른 디버깅을 가능하게끔 한다.
불완전 디버깅 환경에서의 신뢰성 보증 소프트웨어 양도 정책
소프트웨어 시스템을 언제까지 테스팅해서 사용자에게 양도할 것인가를 결정하는 소프트웨어 양도 정책은 개발자가 해결해야 하는 중요한 문제의 하나이다. 이 양도 정책 문제에 대한 일반적인 접근법은 주어진 신뢰성 요구사항을 만족하기 위해 필요한 고장 발견수나 테스팅 시간을 결정하는 것이다. 여기서는 불완전한 디버깅 환경에서 신뢰성 요구사항을 만족하였슴을 원하는 신뢰수준을 보증하는 양도 정책을 제안하고, 구현(?) 한다.
임베디드 Linux 시스템 기반 프로세스 동시 디버깅을 지원하는 원격 디버거 설계 및 구현
커널의 변경없이 라이브러리 래핑 방법을 통하여 원격으로 디버깅 중인 프로세스가 새로운 프로세스를 생성한 경우 기존의 디버깅 중인 프로세스는 물론 새로이 생성된 프로세스들도 원격으로 동시에 디버깅할 수 있도록 지원하는 mgdb 라이브러리와 mgdbserver 를 설계 및 구현했다.
mgdb 라이브러리와 mgdbserver 를 이용한 디버깅 방법은 디버깅 중에 fork 시스템 콜에 의해 새로운 프로세스가 생성되는 경우 기존의 디버깅 중인 프로세스 뿐만아니라 새로이 생성된 프로세스도 디버깅할 수 있다. 또한 개발자가 원하는 순간에 임의의 프로세스를 번갈아 가면서 다중 프로세스들을 동시에 디버깅 할 수 있다. 그리고 기존의 방법과는 달리 개발자는 호스트 시스템 하나의 gdb 만을 통하여 타겟 시스템의 모든 디버깅 진행 중인 프로세스를 접근할 수 있으므로 개발자는 쉽고 효율적인 디버깅을 할 수 있다.
실험을 통해 상용 툴인 totalview 보다 좋은 성능을 내고 있음을 증명했다.
SoC 프로그램의 원격 디버깅을 위한 실시간 추적도구의 구현
추적점(trace point)을 이용하여 프로그램의 수행정보를 실시간으로 추적 가능하므로 프로그램의 수행양상을 실시간으로 감시 할 수 있다. 그리고 저렴한 디버깅 도구의 제작을 위해서 GDB 를 사용하였다. 이 논문에서는 크게 2 가지를 볼 수 있는데, 추적점의 구현과 디버깅 도구의 제작이다.
MPI 병렬 프로그램 디버깅을 위한 재실행 및 인과관계 정지점
MPI 에서 사용되는 함수 구문을 실행 경로에 영향을 미치는 종속 사건과 실행 경로에 영향을 미치지 않는 독립 사건으로 구분하여 종속 사건에 대하여 사용자 정의 데이터 타입을 이용하여 사건 순서화를 이루었다.
이때 사용되는 함수에 타임 벡터를 정의하여 사건의 순서화를 가능하게 했다. 또한 blocking 통신 뿐만 아니라 non-blocking 통신에 대해서도 재실행을 가능하게 하였으며, 정보 저장의 크기를 최소화하기 위하여 사건 기반형 재실행 기법을 구현하였으며 재실행 시 통신 버퍼가 필요 없도록 설계하였다.
내장형 시스템 개발을 위한 호스트 CHILL 디버깅 환경
CHILL 이라는 언어로 개발 시에 사용가능한 디버깅 환경을 구축했다.
사용자 수준에서의 운영체제 TPOS 디버깅 방법
TPOS 라는 운영체제에 OS 자체를 디버깅할 수 있는 환경을 만든 것에 대해 설명한다.
동적 프로그램 Slicing 개념에 의한 동시성 제어 적용 협동 코드 디버깅 시스템
동적인 프로그램을 팀 디버깅(team debugging)을 할 수 있게 해주는 디버깅 시스템을 구축했다. 이때 프로그램을 slicing 으로 나누어 여러 사용자들의 디버깅 동기화를 맞춘다.
쓰레드 프로그램의 디버깅을 위한 재실행 기법(필독할 것)
쓰레드의 수행시에 체크포인트를 파일에 저장해서, replay 시에 이를 이용해서 쓰레드의 실행 순서, 공유변수의 접근 순서를 결정한다. 이에 사용한 기법들을 설명하고 있다.
교환 소프트웨어의 교차 디버깅을 위한 디버그 서버 구현
타겟 시스템에 올라가 있는 CROS 와 SROS 에서 GDB 를 이용한 교차 디버깅이 가능하도록 수정했다.
타겟 머신에서의 OS 디버깅
이 논문에서는 OS 디버깅을 위해서 OS 자체에 디버거를 구축하는 방법을 설명하고 있다. 여기서는 크게 3 가지 부분(IPL 부분, 메모리 레지던트, 디스크 레지던트)으로 나눠서, 각각의 부분 마다 디버거가 필요하다고 얘기하고 있다.
이 세 부분은 부팅이 되는 과정을 뜻하고, 각각 마다 요구되는 디버거의 기능 또한 다르다. 별로 신빙성이 있어보이진 않는다.
병행 프로그램 디버깅을 위한 결정적 재실행 시스템
비결정적인 이벤트를 발생시키는 함수들을 라이브러리화 시킴으로서 사용자는 기존의 app 프로그램을 작성하듯이 만들면 된다.
이 함수들에 프로세스 실행의 비결정성을 유발하는 종속 사건 발생 이력을 기록하였다.
또한 종속 사건 처리기와 재실행 제어 모니터를 만들었다.
오리지널 프로세스의 수행에서 이벤트를 발생시키는 함수가 수행이 되면, 종속 사건 처리기에 이력이 기록이된다.
재실행시에는 재실행 제어 모니터가 수행되며, 이벤트가 발생하면 종속 사건 처리기에 있는 이력을 참조하여 실행한다.
각각의 프로세스 마다 독립적으로 재실행 제어 모니터와 종속 사건 처리기가 수행된다. 그렇기 때문에 복수의 프로세스가 수행될 때는 세마포어를 이용해서 한 시점에서 하나의 제어 모니터와 사건 처리기가 수행되도록 했다.
검출 후 재수행 기법을 이용한 메시지 기반 병렬 프로그램의 디버깅
검출된 비결정성 정보를 이용하는 새로운 디버깅 기법인 검출 후 재수행 방법을 제시한다. 기존의 방법들과 달리 수행전에 MHB 모델을 이용한 정적 분석을 통해서 비결정성을 검출하고 그 위치에만 탐침을 삽입함으로써 탐침효과와 수집되는 정보량을 최소화하면서 재수행성을 보장 할 수 있다. 메시지를 통한 이벤트에서만 설명하고 있고, Tai 의 논문에서 나온 Ada 프로그래밍을 이용하고 있다.
RPC 에 기반한 분산 시스템의 디버깅을 위한 이벤트 추적 기능의 설계 및 구현
RPC 를 이용한 송수신 이벤트를 trace 하고, 나중에 이를 바탕으로 replay 하는 방법을 설명한다.
RPC 이벤트 함수들에 trace 할 수 있는 항목을 만들어 놓고, 수행될 때 이를 이용한다.
여기서는 한국전자통신 연구원에서 만든 유니뷰라는 분산 디버거를 사용한다.
한가지 주목할 점은 호스트에서 타겟 디버깅을 할 때, 각 이벤트의 정보(접근시간, 실행위치, PID, 바뀐시간등)를 호스트에서 확인할 수 있다.
내장형 실시간 소프트웨어의 원격 디버깅을 위한 디버그 에이전트의 설계 및 구현
ETRI 에서 개발중인 RTOS 에 원격 디버깅을 하기 위해서 디버그 에이전트를 만든 방법에 대해서 설명하고 있다.
ETRI 가 만든 EDB 를 이용해서 호스트와 타겟 간에 통신 프로토콜 스택을 이용하여 서로간의 디버깅 통신을 가능하게 한다.
병행언어 디버깅을 위한 비결정적 프로그램 실행의 고정화
비결정적 프로그램의 수행시 공유 변수에 대한 액세스된 값, 액세스 순서를 버퍼(테이블)에 미리 기록해두고, 나중에 replay 시에 이를 이용하여 결정적인 디버깅을 가능하게 한다.
사건 이력을 이용한 병행 프로그램 디버깅 시스템의 설계 및 구현
병행 프로그램 수행시, 사건(이벤트)의 이력을 파일에 저장한다. 사용자는 기록된 디버깅 정보를 검사함으로써 프로그램이 제대로 수행되었는가를 판단할 수 있다. 이렇게 함으로써 병행 프로그램 디버깅시 발생하는 문제점들을 해결하면서 효율적으로 디버깅할 수 있다.
분산 시스템에서 임계 수행 경로를 이용한 성능 디버깅 기법 연구
분산 시스템에서 수행되는 프로세스의 이력을 기록한다. 이때, 각 프로세스 간에 메시지나 지연(blocking) 되는 시간을 추정하여, 성능이 향상되었는지 확인할 수 있는 정보(수행호스트명, 프로세스명, 사건이 발생한 함수명, 사건종류)를 기록한다.
향후 연구 방향으로는 사용자에게 제공되는 디버깅 정보를 보다 개념적으로 시각화 할 수 있는 기법을 고안할 계획이다.
병렬 프로그램 디버깅을 위한 실행 패턴의 특성화 및 인식기법
재실행 기법에 대한 대체적인 방법으로 패턴 인식 개념을 기반으로 하는 프로그램 실행 경로 인식 기법을 제시하였다. 프로그램의 실행 경로를 패턴으로 구성하기 위한 사상함수를 정의하였고, 패턴의 특성화를 위하여 정규 언어 및 비결정적 유한 오토마타를 구성하였다. 이렇게 구축된 오토마타는 각각의 프로세스 및 쓰레드에 배치됨으로써, 병렬 프로그램이 실행되는 동안에 프로그램 실행 경로에 대한 정상 여부를 검사할 수 있다.
과연 얼마만큼 제대로 실행 패턴을 인식할 수 있을지 의문이고, 이것 역시 오토마타를 코드에 집어 넣는 것이기 때문에 재실행 기법에서의 문제점을 고스란히 가지고 있다고 본다.
사건 이력을 기반으로한 분산 시스템 디버깅 도구
여러개의 CPU 로 구성된 분산시스템에서 각각의 프로세스가 수행될 때, 이들의 사건 이력을 각 CPU 마다 저장하여 나중에 이것을 하나로 합친다. 이때, 저장된 정보(타임스탬프)를 이용하여 전체 프로세스의 수행 순서를 정한다.
또한 브라우저를 통해, 프로세스의 순서를 볼 수 있고 각각의 정보를 확인할 수 있다.
MOS 커널에서의 락과 세마포어 관련 오류의 동적 디버깅 기법
MOS(multiprocessor operating system) 에서 락과 세마포어 관련한 오류를 좀 더 쉽게 디버깅하기 위한 방법을 제시한다.
락과 세마포어의 함수에 수행 순서를 알 수 있는 정보를 저장하고, 이것을 타겟에 연결된 개인 컴퓨터로 전송한다.
이후에 컴퓨터에 저장된 로그를 이용해서 디버깅 정보를 볼 수 있다.
임베디드 소프트웨어 개발을 위한 JTAG 기반의 디버깅 도구
호스트의 프린터포트를 이용해서 타겟의 JTAG 포트를 콘트롤할 수 있는 도구(?)를 만들었다.
기존의 gdb 를 이용해서 원격 디버깅이 가능하다.
논문에서 만들었다는 도구를 이용해서, 어떤 점이 나아진 건지 잘 모르겠다.
국외 논문
결론
국내 논문의 경우 모두 '디버깅, gdb' 라는 검색어로 찾은 논문들이다.
거의 비슷한 내용들이 많는데, 정리를 해보자면 다음 몇가지로 요약할 수 있다.
- 병렬 프로세서 or 병렬 프로그램 환경에서 실행된 프로세스의 이벤트 순서를 기록하고 나중에 복원하는 방법
- 저장한 정보들을 사용자가 보기쉽게 비주얼화 하는 방법