런타임 상태가 rollback이 되는 언어나 플랫폼, 또는 디버거는 없을까요?
jong10런타임 상태가 rollback이 되는 언어나 플랫폼, 또는 디버거는 없을까요? 얼핏, 이런게 되는 (고가의) 디버거도 있다고 들은 것도 같기도 하고...
(1) 동적 언어의 경우, 과거의 책임에 대한 문제
얼랭이나 스퀵은, 에러가 나면 실행중 코드 수정이 가능하죠. 수정되기 전의 코드가 이미 실행 해버린 과거에 대한 책임은 지지 않았던 것으로 기억하는데요. (아닐수도 있음!!).
- 시간이 A-B-C 의 순서로 실행된 상태에서, C라는 시간에 에러가 발생하면,
- B로 컨텍스트(모든 변수들의 상태, 또는 메모리 전체 상태)를 복구하고,
- 해당 부분의 코드를 수정하고,
- 다시 B 시간부터 재실행하는 경우.
수정된 코드가 A에서도 있었으면, 과거의 책임에 대한 문제가 있죠. 그 코드가 A에서도 과거와 똑같이 동작할지 보장할 수 없기 때문이죠. 다른 사이드 이펙트가 있을수도 있고, 아예, 다른 곳으로 분기를 탔을 수도 있죠.
만약, 이런걸 보장 받을 수 있는 언어가 되려면 어떻게 해야 할까요?
- 사용자는 코드를 수정해서, B 시점부터 다시 실행하려고 했는데,
- VM이 수정된 코드로 다시 처음부터 실행해보니, B에 도달하지 않으면..
사용자가 기대하지 않은 상황인데, 이렇게 전개되는 것이 맞을까요? 과거를 프로그래머의 책임으로 전가하는 것은, 지원하는 것도 안하는 것도 아니지 않을까요?
(2) native 디버거
전혀 다른 문제인데, 코드를 수정하진 않고, 디버깅 시에, do와 undo만 한다고 가정하고, 컴파일된 native 코드 자체를 뒤로 돌리는 방안에 대해서.
네트워크나 공유 메모리와 같은 문제를 제외하더라도, 모든 시점의 메모리를 diff 해서 보관하기도 어려운 노릇이니, 어셈을 역연산 한다면, 디버깅에서 do를 하는 step마다,
- 수정되는 부분과 값에 대해서
- 분기를 어디서 어디로 했는지에 대해서
..정도만, 히스토리를 디버거가 들고 있으면 될 것 같기도 하고요.
이에 대해 어떻게 생각하세요? 메모리 자체가 1차원이 아니고, 공간+시간의 2차원이라면 괜찮을텐데요. 구글의 BigTable이 column/row/시간의 3차원인 것 처럼. 공간+시간의 2차원을 표현할 괜찮은 방법이 있을까요?
트랜잭셔널 메모리(transactional memory)나 그것의 소프트웨어적인 구현인 STM 같은 것들을 찾아보시면 어떨까요? (근데 이건 병렬 프로그래밍에서 쓰는 건데…)
Novell에서 만든 Chronicle이라는 디버거에 2에서 말씀하신 내용이 이미 구현되어 있습니다.
Chronicle records every memory and register write in the execution of a Linux process, using Valgrind to instrument execution at the machine code and system call level. These events are indexed and compressed; from the resulting database the Chronicle query tool can efficiently reconstruct the state of memory and/or registers at any point during the execution.