'GDB'에 해당되는 글 2

  1. 2011/07/21 GDB Reverse debugging
  2. 2010/04/02 Howto: Porting the GNU Debugger, Writing a RSP Server (2)
 

GDB Reverse debugging

뻘글들 | 2011/07/21 23:05 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License

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

댓글을 달아 주세요

크리에이티브 커먼즈 라이선스
Creative Commons License


 위에 그림이 일반적인 리모트 타겟을 디버깅하는 방법에 관한 그림인데.......설명하기 많이 복잡하다. 리모트 타켓 디버깅에 대한것은 알아서들 문서를 찾아보도록하고....저 박스들에 대해서 얘기를 하자면 일단 디버거는 GDB를 사용한다능. 물론 이 GDB는 Debugging Target의 아키택쳐에 관한 정보를 알고 있어야 된다. 레지스터는 몇 개구...엔디안은 뭘쓰고 등등등. 이런 내용들을 GDB에 추가하는게 포팅이라능. 

 그리고 GDB Proxy Server라는게 있따능. 이놈이 GDB가 보내주는 커맨드를 받아서 Emulation Board를 조작해서 Debugging Target를 적당히 조작하도록 JTAG 신호를 만들어 낸다. GDB하고 Proxy Server 사이의 통신은 거의 대부분 TCP/IP를 사용한다. 적당한 이유가 있어서 Non-Blocking 소켓을 사용한다능. 사용하는 프로토콜은 Remote Serial Protocol이라고 이상한게 있다.

 Emulation Board를 사용하는 가능 큰 이유는 하나다. PC에는 JTAG 신호를 내보낼 수 있는 포트가 없다능 >_<. 가장 만만한게 Parallel인데 요즘 PC엔 이게 없어서 USB로 많이 옮겨온거 같다능. 그리고 이더넷 같은걸 쓰기도 한다능. 아무튼 인터페이스는 이런걸 쓰고 프로토콜은 Emulation Board에 따라 틀리다능. USB라면 디바이스 드라이버가 제공하는 API를 쓸태고...등등등

 Debugging Target과 Emulation Board사이의 인터페이스는 거의 대부분 JTAG이다. 프로토콜은 Debugging Target에 따라 틀리다. 아키택쳐 메뉴얼이나 해당 아키택쳐의 디버깅 유닛 메뉴얼등을 보면 나와있다.

 빨간색 박스...그러니까 GDB를 포팅하는건 나도 많이 모르고...무지 복잡하다 ㅠ.ㅠ...좋은 HowTo 문서가 있으니 이걸 보고, 포팅 샘플이 있으니 같이 참조 하자능.

ftp://ftp.gnu.org/gnu/gdb/gdb-6.8.tar.gz

 GNU FTP에서 gdb 6.8을 받아서 위의 패치를 적용하면 좋은 포팅 샘플이 된다. 타겟은 OpenRISC다. 위의 문서도 이걸 예로 들어서 설명하고 있다. 이 작업은 타켓 아키택쳐를 많이 알고 있어야 되고...GDB 내부에 대해서도 많이 알고 있어야 된다. GDB internals 라 불리는 문서랑 gdb 압축을 풀었을때 같이 들어있는 HowToPorting 따위의 이름을 가진 문서들이 많은 도움이 된다.

 그리고 노란박스는 적당히 알긴 아는데 길게쓰기도 거시기하고....-_-. 아무튼 그렇타능. 이것도 역시 좋은 문서가 있고 좋은 샘플이 있다능.

 이것도 타켓은 OpenRISC다능. 이 작업도 역시 타켓 아키택쳐(정확히는 해당 타켓의 디버깅 유닛)를 많이 알고 있어야 되고 RSP 프로토콜에 대해서도 잘 알아야 된다. 위의 문서하고 샘플이랑 Redhat.com에 올라와 있는 RSP 관련 문서가 도움이 많이 된다능. 아...물론 Emulation Board를 컨트롤 할 수 있는 방법도 알고 있어야 된다능. 

해당 문서와 샘플 프로그램, 패치등은 멋대로 퍼왔다능 >_<. 읭여읭여
저작자 표시 비영리 동일 조건 변경 허락

'뻘글들' 카테고리의 다른 글

"No available video device" error with SDL  (2) 2010/05/21
프롤로그 Prolog  (2) 2010/04/14
Howto: Porting the GNU Debugger, Writing a RSP Server  (2) 2010/04/02
ctags on windows  (4) 2010/03/13
지름  (4) 2010/03/02
Thank you from Google!  (2) 2010/02/11

댓글을 달아 주세요

  1. 유노 2010/04/04 09:49  댓글주소  수정/삭제  댓글쓰기

    칩 만드는 거임? RISC 나오고 뭐야.. OS 같애.. 어려워..
    그나마 JTAG나오니까 음.. 암보드(타겟보드) 같은 것이로군. 정도의 통밥? ㅋ
    서버-타겟 간의 구동에 관한 프로그램인가.........