GDB 7.0에서 새루 생긴 기능이라구 한다. 프로그램 플로우를 연어처럼 거꾸로 거슬러 올라갈 수 있게 해주는 기능으로 인스트럭션과 인스트럭션 사이의 레지스터 변화와 메모리 변화를 저장해놨다 복구하는 방법으로 플로우를 뒤로 돌릴 수 있다는거 같다.
GDB remote target debugging 위한 remote stub(proxy server)을 만들어 보거나 했으면 알겠지만 GDB가 debugging target을 바라보는 관점은 레지스터와 메모리의 집합이다. 이거의 변화를 잘 저장해놓으면 프로그램 플로우를 뒤로 돌릴 수 있다는 컨셈으로 만들어 진거 같다. 당연히 변화는 어느 정도 한계를 두고 저장하고 당연하게 이 한계량을 조절하거나 업ㅂ셀 수 있다. GDB를 키고 help를 쳐보자.
i386-linux하고 arm64-linux랑 몇가지 이상한 타겟 아키택쳐를 지원하는데....당장은 저 두개만 된다고 생각하면 편할 꺼 같다. i386-mingw, amd64-mingw에서는 안된다. 명령을 쳐보면 '님아 여기선 안되염 뿌우 'ㅅ' ' 라고 나온다능.
이걸 기록하려면 record라는 명령을 치면 되는데 타겟이 돌구 있어야 이거 먹는다. 일단 main 같은데 break를 걸어놓고 record를 치고 시작한다. -g 옵션을 넣고 컴파일 해야 된다.
record라고 친다음 next로 한 라인씩 넘겨본다. reverse-next라고 치면 우왕! 정말 뒤로 간다. 몇가지 명령이 더 있는데 다음과 같다.
reverse-continue - bp나 wp를 만날 때 까지 뒤로 간다.
reverse-step - 소스 라인에서 한 라인 뒤로 간다. 뻥션콜을 만나면 그 뻥선에서 return 위치로 간다.
reverse-stepi - 인스트럭션 단위로 하나 뒤로 간다. jal 따위의 인스트럭션을 만나면 call ra따위의 인스트럭션이 있는데로 간다.
reverse-next - 소스 라인에서 한 라인 뒤로 간다. 뻥션콜을 만나면 그 뻥션도 몽땅 롤백한다.
reverse-nexti - 인스트럭션 단위로 하나 뒤로 간다. jal 따위의 인스트럭션을 만나면 몽땅 뒤로 간다.
reverse-finish - 현재 뻥션이 불리기 바로 직전까지 뒤로 간다.
bp하고 bp 사이를 와따 가따 하면서 디버깅 하거나...생각업ㅂ이 막 next 하다가 디버깅할 시점을 놓쳤을 때 쓸만할꺼 같다능 -_-;;;
더 자세한건 gdb를 켜고 help를 쳐보자.
I/O가 일어났을때는 어캐 되는지 모르겠다.
'뻘글들' 카테고리의 다른 글
| FreeRTOS port of OpenRISC (2) | 2011/08/01 |
|---|---|
| 요즘 하고 있는 것 (2) | 2011/07/25 |
| GDB Reverse debugging (0) | 2011/07/21 |
| How to install Boost Library in Mingw (0) | 2011/05/16 |
| 집에서 쓰는 키보드, Filco Zero Tenkeyless (1) | 2010/11/07 |
| 60000 힛 (2) | 2010/11/03 |


댓글을 달아 주세요