|
디버깅 중 대부분은 브레이크 포인트 부근에서 스텝을 진행시키면서 변수 값들이 어떻게 바뀌는지 살펴보는 일이다. 그런데 실수로 살펴봐야 할 곳을 지나쳐서 다시 프로그램을 실행해야 하는 경험을 다들 해보았을 것이다. 예를 들어, 어떤 함수 안으로 들어가서 봐야 하는데 step in을 하지 않고 바로 step out으로 그냥 지나치는 실수를 생각할 수 있다. 특히, 그 상황을 재현하기까지 시간이 많이 걸리는 경우에는 이런 실수는 여간 시간 낭비가 아닐 수 없다. 그렇다면 이쯤에서 지나쳐버린 프로그램의 실행을 다시 뒤로 돌리는 기능이 있으면, 한 마디로 rewind 혹은 undo, 얼마나 좋을 것인가라는 생각을 할 수 있을 것이다.
노란색 화살표(현재 실행 위치)를 뒤로 돌릴 수 있다면! 사실 이 분야는 이미 많이 연구가 되었다. 마치 비행기의 블랙박스처럼 프로그램의 실행 상태를 계속 저장해서 다시 재생해주는 기능이다. 특히, 멀티스레드 혹은 병렬 프로세서 프로그램들은 그 동작 자체가 비결정적(non-deterministic)하기 때문에 이런 것까지 deterministic하게 다시 재생할 수 있다면 디버깅에 있어서 큰 도움이 될 것이다. 관련논문: A “Flight Data Recorder” for Enabling Full-system Multiprocessor Deterministic Replay (링크) (참고로 보통 논문에는 Related Work 부분을 읽으면 이 분야가 얼마나 연구되었는지 쉽게 알 수 있다.) 그러나 논문들은 상당히 많지만 실제 우리가 쓰는 gdb나 VC++의 디버거에는 이런 기능이 탑재되어있지 않다. 그래서 이걸 실제고 gdb에 구현해보면 어떨까 생각을 해보았는데 아니나 다를까 이미 되어있다. 뭐든 내가 생각한 건 누군가가 미리 다 생각해놓고 만들어놓기까지 했다. 좌절이다. Undo 소프트웨어라는 다소 썰렁한 이름의 회사는 리눅스 위에서 gdb에 프로그램을 뒤로 돌릴 수 있는 즉, step, next와 같은 일반적인 gdb 명령의 backward 버전들을 제공해준다! 광고하기에는 멀티스레딩의 비결정성도 해결하여 deterministic replay를 가능케 해준다고 한다. 이 말은 즉, Heisenbug와 같은 골치 아픈 버그도 손쉽게 재현할 수 있다는 뜻. 2006년 5월에 나왔으니 비교적 최근에 나왔다고 볼 수 있다. http://osnews.com/story.php/14619/UndoDB-Released 그리고 2005년에 gdb에도 이런 기능을 넣자는 의견을 확인할 수 있었다. (저 위에 링크건 논문 쓴 친구가 쓴 글.) http://www.cygwin.com/ml/gdb/2005-09/msg00089.html 물론 특정 시스템 콜, 몇몇 시그널들, 그리고 완벽한 멀티스레딩 재생에 대한 제약 사항들은 당연히 존재하겠지만 어느 정도 수준으로라도 뒤로 프로그램을 돌릴 수 있는 기능이 있다면 정말 디버깅하는데 편할 것인데, 학교에 있는 사람들은 이런 것에 별로 관심을 안 기울인다. 그냥 논문만 쓰면 땡. 결론: 인생은 타이밍.
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04 저도 아들 돌잔치때 돌잡이 .. by 박상욱 at 01/18 미국 대학원 원서 작성중에 p.. by 태클사이야 at 01/13 TO: 박PD 로그인 하지 않아.. by 박응용 at 01/10 http://gigglehd.com/zbx.. by dhunter at 12/28 우와.. 좋네요. 태반이 .. by 윤광배 at 12/17 항상 좋은 글 잘 보고 있습니.. by y2k at 11/23 글이 좋아서 제 블로그에 담.. by 쏭섭 at 11/23 최근 등록된 트랙백
메뉴릿
이글루 파인더
|