====== Record and Replay 회의 내용 정리 ====== 졸업 논문 주제인 Record & Replay 에 대해서 회의한 내용을 정리했다. ====== 2007. 10. 16 ====== Record & Replay 와 관련하여 4 가지 큰 이슈가 있었다. 다음과 같다. - 멀티 코어 환경에서 Global Stop and Record 기능 - I/O 상황 재현 기능 - CPU 내부(캐쉬, 파이프라인) 기능 - Slow replay and debug(기존의 디버거에서의 step by step 기능) ===== 나의 생각 ===== 위의 4 가지 이슈 중에서 만만한 것은 하나도 없다. - 일단 멀티코어 환경의 H/W 가 있어야 한다는 전제가 있어야 한다. smdk2410 두 대에 uart 로 연결해서 두 대 모두를 stop 시킨다는 것은 각각의 시간차 문제(타이머 레지스터)와 통신을 위한 단계까지는 record 할 수 없다는 생각이다. - 여러가지 프로토콜을 가지는 I/O 디바이스가 존재할 수 있다. 단순하게 SD 메모리가 아닌 어떤 명령어를 줘야만 동작하는 디바이스에 대해서는 어떤 식으로 재현할 것인지와 중간 I/O 를 생략하고 record 되었을 당시의 상태로 만들어야 하는 것에 대한 가능 여부 - 소프트웨어로 접근할 수 있는 방법이 없다. 캐쉬의 경우, 프로그램이 fail 이 발생한 순간과 record 하는 순간에도 계속 바뀐다. 만일 캐쉬의 값을 record 했다고 하더라도, 그 값이 올바로 쓰여졌는지 확인할 방법이 없다. 파이프라인의 경우 역시, 오퍼레이션 할 수 있는 명령어가 없다. 소프트웨어 기반하에서는 제한이 따른다. - 생각해 보건데, 4 가지 이슈 중에서 가장 현실성이 높아보인다. 기존의 디버거들이 유사한 방식을 사용하고 있기 때문에 그 쪽 코드를 참고할 필요가 있다. ===== 회의 결과 ===== - 'I/O 상황 재현 기능' 에 초점을 맞춤 - Storage, Network 에 디바이스에 대한 I/O 상황 재현 - 절차적인 과정이 필요한 디바이스(flash) 의 경우, 좀 더 빠른 디버깅을 할 수 있는가?(예를 들면, flash 관련 함수만 수행함으로서 수행 속도를 빠르게 함) - 예를 들어 fwrite() 같은 함수를 application 에서 호출하면 체크포인트를 생성하는 시스템 콜이 발생하도록 함 ====== 2007. 10. 23 ====== 지난번 미팅에서 나온 사항에 대한 구현 가능 여부에 대해 논의했다. ===== 나의 생각 ===== '절차적인 과정이 필요한 디바이스(flash) 의 경우, 좀 더 빠른 디버깅을 할 수 있는가?(예를 들면, flash 관련 함수만 수행함으로서 수행 속도를 빠르게 함)' 의 경우에 대해서는 중간에 연산이 이루어지고, 연산 결과를 디바이스에 write 한다면 실행결과를 일치시킬 수 없기 때문에 불가능하다. ===== 회의 결과 ===== '임베디드 소프트웨어 상에서 디버깅을 잘하자' 라는 주제를 가지고 폭 넓게 생각한다. ====== 2007. 10. 30 ====== 지난번 미팅에서 나온 사항에 대한 구체화 방법에 대해서 논의했다. ===== 나의 생각 ===== kgdb 와 kdb 를 vpos 에 포팅하고, 사용법을 쉽게 한다. ===== 회의 결과 ===== - kgdb 의 개념 확장, 커널 내부의 유용한 정보를 요약 / 알기쉽게 전달 / 성능 측정 - 이벤트(인터럽트) 를 고려한 디버깅 : 인터럽트가 발생하면, 체크했다가 인터럽트를 재연하는 디버깅 ====== 2007. 11. 6 ====== 지난번 미팅에서 나온 사항에 대한 논의를 했다. ===== 회의 결과 ===== - 주기마다 체크포인트를 생성하고, 인터럽트를 저장한다. - GDB 스타일의 디버깅 모드를 지원하고, 마지막 체크포인트 상태로 rollback 하며 앞의 부분은 skip 한다. - 커널 정보(쓰레드 상태, 메모리 점유율, I/O 상태, 커널 메모리, 버퍼상태)를 표시한다. ====== 2007. 11. 13 ====== ===== 나의 생각 ===== - 단순히 replay 를 해서는 비 결정적인 실행이 될 수 없다. 때문에, 각 프로세스 간에 실행 순서를 기록해야 한다. ===== 회의 결과 ===== - 다음주 금요일 까지 졸업 논문의 목차 및 섹션을 정해올 것 - 각 목차와 섹션에 들어갈 내용을 3 ~ 4 줄 정도로 요약할 것(구체화 방법 기술, 관련 연구) ====== 2007. 12. 10 ====== [[졸업 논문 작성을 위한 가이드 라인]] 에 대해 논의 했다. ===== 회의 결과 ===== - '동기(문제점)' 부분이 약하다는 것과 내가 구현해야할 Record & Replay 방법이 기존의 방법과 비교해서 차별화된 점과 강점에 대한 내용이 부족하다. - 'Overview' 부분에 Record & Replay 를 하기 까지의 일련의 시나리오를 작성하여 보충한다. - 프로그램 작성 -> 실행 및 저장(Record) -> Replay 및 디버깅 ====== 2007. 12. 13 ====== 메모리 스냅샷을 저장하는 데, 소요되는 시간을 어떻게 줄일 것인가에 대해서 논의 했다. ===== 회의 결과 ===== - 타이머 인터럽트가 발생할 때마다, 메모리 스냅샷을 저장하는 방법만으로는 익셉션이 발생했을 때의 상황을 재현하기에 부족하다(예를 들면, 2 개의 쓰레드가 하나의 공유변수를 두고 각각 ++, -- 하는 수행을 한다면, 값은 고정되지 않고 변한다). - 스케줄러가 호출되는 경로가 비단 타이머 인터럽트 외에도 존재하므로(s/w 인터럽트), 특정 시스템 콜 형태로 호출이 될 때마다 스냅샷을 저장한다. - 전체 메모리 스택을 통채로 저장하지 말고, 이벤트 정보를 저장하여 로그를 남긴다(누가, 언제, 메시지 발생시점, 메시지 수신시점등) 위의 문제들만 해결하면, 정확한 재현이 가능한가? ====== 2008. 1. 15 ====== [[졸업 논문 작성을 위한 가이드 라인]] 수정 사항 발표 및 record 와 replay 방법에 대해서 논의 했다. ===== 회의 결과 ===== - 메모리 스냅샷을 저장하는 방법과 이벤트 만을 저장하는 방법 중에 하나를 선택한다. 각각의 장단점을 분석하여 신중히 결정한다. ====== 2008. 1. 22 ====== 새로운 이벤트 저장 방식인 Record & Replay 방법에 대해서 논의 했다. ===== 회의 결과 ===== - 동기화, I/O 관련 이벤트, Thread create, Thread 간 통신, 메세지 큐와 관련한 이벤트 저장 필요 - PC register 가 동일할 때, register 의 합을 구하는 것이 효율적인가? 같은 pc 값일 때, 구분 할 수 있는 카운터 변수 사용 여부 - 트랩(trap) 코드를 삽입할 때, XIP(eXecute In Place) 에 대한 가능성 고려 ====== 2008. 3. 5 ====== 그 동안 구현된 항목과 앞으로 나아가야할 방향에 대해서 논의 했다. ===== 회의 결과 ===== 현재 구현된 사항들은 다음과 같다. | Record | 구현내용 | 확인 | | 1 | 로그(log) 정보를 메모리의 특정 영역에 저장 | 完 | | 2 | Flash 에 로그(log) 정보를 저장 | 完 | | Replay | 구현 내용 | 확인 | | 1 | 재부팅 후 Flash 에서 메모리 특정 영역으로 복사 | 完 | | 2 | 로그(log) 정보를 읽어서 리스트로 출력 | 完 | | 3 | 리스트 선택 시에 기존의 명령어 코드 백업 | 完 | | 4 | 트랩 코드 삽입 | 完 | | 5 | Replay 중 트랩 발생 시 디버깅 메뉴 실행 | 完 | | 6 | 디버깅 명령어 구현 | 完 | 하지만, Replay 를 구현하는 방법 자체에서 많은 변화가 있어야 한다는 제안이 나왔다. - 현재의 Replay 하는 방법인 트랩 코드를 삽입하여 멈추는 지점까지 수행되어질 때까지 중간의 이벤트를 이용하여 수행해야 함(그래야 실제 Record 될 시의 상황과 똑같이 재현할 수 있음) 예를 들어, Thread1, Thread2 가 있을 때, 실행 순서가 1 -> 2 -> 1 라고 했을 때, 똑같이 1 -> 2 -> 1 로 되어야 한다는 것이다. ====== 2008. 3. 13 ====== 정보처리학회 제출을 위한 첫번째 논문 미팅을 했다. ===== 회의 결과 ===== 수정 사항은 다음과 같다. - 제목 : 분석(X) -> 추적(O), Analysis -> Trace - 저자 이름 : Woo-Jong Kim and Min-Soo Ryn, Hanyang - <표 1> -> Replay Mechanism 섹션으로 이동 - 요약 수정(첫번째, 두번째 문장) 3월 17일 월요일 수정된 사항을 가지고 논문 미팅 예정 ====== 2008. 3. 17 ====== 정보처리학회 제출을 위한 두번째 논문 미팅을 했다. ===== 회의 결과 ===== 수정 사항은 다음과 같다. - 이름 수정 : Min-Soo(X) -> Minsoo(O) - 내용 수정 : 시점(X) -> 상황(O), Time critical(X) 삭제, (그림 1) 에 하드웨어 그림 추가 일단, 위의 수정 사항을 반영하여 학회에 제출하고, 세부사항은 최종 수정본 마감일인 4월 18일까지 수정 보완한다. ====== 2008. 3. 26 ====== 앞으로의 방향에 대해서 논의했다. 여름에 우즈베키스탄에서 대한전자공학회 주최로 열리는 학회에 낼 생각이다. 하지만, 마감일이 3월 28일 까지이기 때문에, 낼 수 있을지 확실하지 않다. ===== 회의 결과 ===== 다음은 교수님의 생각이다. - 현재 vpos 에서 구현된 record & replay 를 현재 사용되는 T32 이나 realview 에서 연동하여 사용 가능하도록 한다. - record & replay 를 recoplay 라고 명명한다. - 다른 사람들과 연계하여 확장시킨다. 1번에 대한 얘기를 좀 더 하자면, 지금의 record & replay 기능은 디버깅 기능이 약하기 때문에, 기존의 디버거에서 vpos 이미지(vpos + 디버깅 심볼 정보 + record & replay) 를 그대로 사용하여 기존에 제공하는 많은 기능을 사용할 수 있게 한다. 또한 현재 가장 많이 사용하고 있는 T32 나 realview 에서 사용하고 있는 IDE 프로그램과 연동하여, vpos 의 kernel-aware 정보를 볼 수 있게 한다(예를 들어, vpos 의 특정 메모리 번지에 thread 정보를 저장하여, T32 IDE 프로그램에서 그 주소를 dump 하면 그 값을 알 수 있다). debug_info{ int thread_number; // 현재 쓰레드 수 int current_thread; // 현재 쓰레드 주소 .. .. .. } ====== 2008. 4. 2 ====== 우즈베키스탄에서 대한전자공학회 주최로 열리는 학회에 내 논문을 영어로 번역하여 제출했다. 문제는 내가 정보처리학회에 제출했던 논문의 내용과 상당 부분 달라졌다. ===== 회의 결과 ===== 오늘 회의는 나를 제외한 3 명이 함께 했다. 일단 기존의 논문과 비교해서 달라진 것들을 얘기해보겠다. - 논문 제목 변경 ('Recoplay: An Effective Record-Replay Approach to Debugging Complex Embedded Software') - 3 가지 목적(Goal) - 애플리케이션 태스크 뿐만 아니라 운영체제 또는 하드웨어로 부터 크리티컬한 이벤트 단계를 record & replay 할 수 있다. - 타겟 소프트웨어의 동작이 재생산될 때, 명령어(인스트럭션)레벨의 정확도를 제공할 수 있다. - 어떤 통합의 영향이 없이 기존의 디버거를 사용 할 수 있고 개발자는 single step 이나 breakpoint 설정과 같은 디버깅 기술을 활용할 수 있다. - code modifier 는 컴파일된 바이너리 상태의 파일에서 이벤트가 발생한 주소를 추가한다. - record & replay 에서 디버깅 명령어를 제공하지 말고 기존의 T32 나 realview 에서 제공하는 것을 사용한다. - divx 소스를 record & replay 로 실행하고, 각 함수별, 실행시간을 처음 실행과 replay 실행 시간을 비교한다. ===== 나의 생각 ===== 몇몇 부분을 제외하고는 내가 현재 구현한 부분과 크게 다르지 않은 것 같다. 다음은 크게 달라진 부분이다. - code modifier 는 컴파일 되어 나온 바이너리 상태의 파일에 이벤트가 발생한 주소를 추가한다고 했는데, 이게 현실적으로 가능한가? - record & replay 에서의 디버깅 명령어 모드를 없애고, 기존의 T32 와 같은 디버거에서 지원하는 명령어를 사용한다고 했는데, 그렇다면, 굳이 vpos 에 record & replay 기능을 추가할 필요가 있나? 차라리 그냥 JTAG 장비와 디버깅 툴로 잡아서 보는 편이 훨씬 낫지 않는가? 이러한 점들에 대해서 좀 더 구체적이고 조율이 필요하다. ====== 2008. 4. 25 ====== 지난번 회의에 대한 나의 생각에 대한 의견을 얘기했다. ===== 회의 결과 ===== - code modifier 는 컴파일 되어 나온 바이너리 상태의 파일에 이벤트가 발생한 주소를 추가한다고 했는데, 이게 현실적으로 가능한가? \\ -> 그냥 기존의 방식대로 처리하면 된다. - record & replay 에서의 디버깅 명령어 모드를 없애고, 기존의 T32 와 같은 디버거에서 지원하는 명령어를 사용한다고 했는데, 그렇다면, 굳이 vpos 에 record & replay 기능을 추가할 필요가 있나? 차라리 그냥 JTAG 장비와 디버깅 툴로 잡아서 보는 편이 훨씬 낫지 않는가? \\ -> 이해가 잘 안되지만 현재의 명령어 모드를 지원하면서, T32 디버거 툴에서 특정 메모리 주소를 덤프했을 때, 정보를 보여주는 방법으로 한다.