디버거에서 프로그램 실행을 거꾸로 돌릴 수 있다면?

디버깅 중 대부분은 브레이크 포인트 부근에서 스텝을 진행시키면서 변수 값들이 어떻게 바뀌는지 살펴보는 일이다. 그런데 실수로 살펴봐야 할 곳을 지나쳐서 다시 프로그램을 실행해야 하는 경험을 다들 해보았을 것이다. 예를 들어, 어떤 함수 안으로 들어가서 봐야 하는데 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에 구현해보면 어떨까 생각을 해보았는데 아니나 다를까 이미 되어있다. 뭐든 내가 생각한 건 누군가가 미리 다 생각해놓고 만들어놓기까지 했다. 좌절이다.

http://undo-software.com/

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 object | 2007/10/29 16:08 | 컴퓨터 | 트랙백 | 핑백(1) | 덧글(11)
트랙백 주소 : http://minjang.egloos.com/tb/1560067
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 미친병아리가 삐약삐약 : 20.. at 2007/11/05 00:28

... 간에 되어 가는 것 같은데, 도스에서 그래픽 지원하던 것에 비하면 너무 느린거라 볼 수도 있고.. 슬기롭게 비판하는 10계명. 삶의 지혜.. 디버거에서 프로그램 실행을 거꾸로 돌릴 수 있다면? 난 이런 생각을 한번도 해본적이 없는데.. 재밌네.. 돈과 행복은 바꾸지 말아야 난 지금 행복한가? 제 이글루에 Google Analyti ... more

Commented by FnWinter at 2007/10/29 16:31
오!!! 멋진 발상입니다.
Commented by 상희스타일 at 2007/10/29 17:43
좋은 발상이에요. 왜 앞으로만(음.. 옛날에 아프로만 이라는 회사가 갑자기 생각이 나네요. -_-) 가는걸 당연하게 생각했었지. 하긴 그때는 그게 제일 쉬웠으니까 그런 것 같기도 하고. 멋진 발상인데 정작 사용은 하지 않을 것 같습니다. 도입하기 귀찮아서 ㅋㅋ
Commented by drvoss at 2007/10/29 20:21
상당히 흥미로운 주제인것 같습니다. 프로그램은 왜 실패하는가였던것 같은데 이 내용이 아직 불가능 하다 라고만 생각했었는데, 제품까지 있다니 놀랍습니다~ 걸어 주신 링크 잘 보겠습니다.

혹시나, VS2005에서 노란 화살표(현재 pc를 가리키는)는 마우스로 위로 들어 올릴수 있습니다.
변수의 값이 증감 되거나 레지스터 값이 증감 되는류는 돌이킬 수 없지만, 초기화 한다던가 함수 리턴값 정도는 다시 처음부터 디버깅 하지 않아도 쉽게 다시 해 볼 수 있습니다. 아직 이걸 모르시는 분이 꽤 있으시더라구요.
Commented by abraxsus at 2007/10/30 02:14
VS2005에서 노란화살표 들어올리기가 되네요.. 근데! 이게 backward execution은 아닌거 같은데요? 다음 수행될 statement를 다른것으로 지정할수 있다는것같네요.. 마우스커서를 가져다대보니 그런 설명이 나옵니다. 순간 '오~~' 하고 생각했는데..??... 이 주제는 paper로는 꽤 나와있는 주제죠.. 커널 디버깅을 위해 VM을 통째로 reverse execute하는 TTVM(Time-traveling VM)이란놈도 나와있고요.. 아이디어는 간단. 외부 event들을 죄다 기록하고 간간히 check-pointing하는거죠.. 연구소에서가 아닌 실제 상품으로 이런 기능이 있는 있는 제품은 이 Undo-software가 처음인듯 한데요???
Commented by object at 2007/10/30 13:44
보니까 노란 화살표 이동은 단순히 EIP 레지스터 (=PC) 만 옮기는군요. 즉, 다른 레지스터들의 변화까지 당연히 undo하는 것은 아니고 또 전혀 엉뚱한 곳으로도 즉, control flow를 무시하고, 이동이 가능하네요. Side effect가 없는 함수들은 이 기능으로도 충분히 도움이 되겠네요.
Commented by daybreaker at 2007/11/05 13:57
요즘 학교 프로젝트로 Pintos라는 실습용 OS 커널을 짜고 있는데 뒤로 돌리는 기능 있으면 대박일 것 같습니다.. ㅠ_ㅠ
Commented by object at 2007/11/05 13:59
핀토스 나쵸스.. SOS... 그런데 저는 오에쓰 수업을 날림으로 들어서 하나도 만져본 적이 없다는;;
Commented by codewiz at 2007/11/10 16:47
재밌는 생각이네요.
트레이스 할 곳을 지나치는 실수에 대해서는 정말 도움이 많이 될 것 같습니다. 저도 매번 지나치고는 처음부터 다시 시작하곤 하거든요. 그런데 사실 아이러니 하지만 전 프로그래밍 경험이 오래 될수록 디버거로 디버깅하는 것에 회의적입니다. 어려운 문제의 대부분은 트레이스로 알아낼 수 없는 문제들이 많았거든요. 디버거에서 실행되는 것 때문에 재현이 불가능했던 오류들도 있었구요.

Commented by object at 2007/11/10 16:50
그런 오류가 바로 하이젠버그, Heisenbug라고 합니다. 디버거에서 실행되는 것이 프로그램의 상태를 바꾸어서 버그가 재현이 되지 않죠. 대표적으로 멀티스레드 환경에서 일어나는 레이스들이 그러합니다.

http://minjang.egloos.com/541005

(일년 전에 이거때매 정말 고생했죠..)
Commented by codewiz at 2007/11/10 18:00
와, 좋은 용어 배우고 갑니다.
매번 그런 일을 겪으면서도 그런 걸 머라고 표현하는지 몰랐네요. ㅎㅎㅎ
Commented by 몽몽이 at 2008/02/17 14:08
대단하네요. 하지만 실용적으로는 좀 더 다른 문제도 있을 것 같습니다.

저같은 경우 모 전자 회사에서 임베디드 프로그래밍을 한 적이 있습니다.
그 환경에서는 너무 느려져서 기능 자체가 안되기 때문에 온라인 디버거를 쓸 수조차 없었습니다.
그리고 그렇게 느려진 상태에서는 문제 자체가 발생이 안되더군요.

결국 문제가 생기는 race condition은 기껏해야 디버깅 심볼을 넣은 정도밖에는 아무것도 하지 못한 상태에서 그냥 계속 돌려서 문제가 생기는지 확인해보는 수밖에 없었습니다.
보고, 걍 고민하고, 그러다가 고치고 그런 식이죠.

여기까진 솔직히 어쩔 수 없다 치고...
진짜 문제는 어렵사리 재현을 시켰을때 - 전 하드웨어에 대해 잘 알진 못하지만 - 레지스터도 다 찍어볼 수 있고 그렇다고 해도 그게 소스 코드 상에서 무슨 의미인지를 찾는게 거의 불가능하다는 점이었습니다.
그것도 어느 정도 가능한건 이미 다 잡았으니까요. 능력자는 좀 더 가능하겠지만...

그때 일을 다시 생각해보니, 격찬하셨던 VS의 STL 디버깅 같은 기능이 정말 절실하다는 생각입니다.
단, 온라인 디버깅이 아니라, 이렇게 "뻗어 버린" 그 상태에서의 시스템 정보를 별도로 이용해서 말이죠.
(음... STL 디버깅과는 사뭇 다른 내용이 되겠군요. 하지만 의미는...)
이런거 하려면 디버거 뿐 아니라 하드웨어 자체도 뭔가 규격을 가져야 할 것 같긴 한데...
(CPU만의 일이 아니고 보드 차원까지 가야겠군요.)

역시 세상엔 쉬운게 없군요... 쩝

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
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
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스