'2014/10'에 해당되는 글 2건

  1. 2014.10.27 당신을 기억하겠습니다.
  2. 2014.10.27 GDB를 이용한 원격 디버깅

당신을 기억하겠습니다.

Etc. 2014. 10. 27. 22:12 |
마왕.

당신과 당신의 음악을 잊지 않겠습니다.

삼가 고인의 명복을 빕니다.
Posted by 물빛바다
:

여러가지 이유로 원격에서 GDB를 이용한 디버깅이 필요할 때가 있다.


내 경우에는 TSIM이라는 시뮬레이터를 이용하고 있는데,

이 시뮬레이터에서 디버깅을 수행하려면 GDB의 원격 디버깅 기능을 이용해야 한다.


원격 디버깅을 위해서는 타겟에서 동작하는 GDB 서버와 호스트에서 동작하는 GDB가 필요하다.

개념은 간단한데, 타켓에 GDB 서버를 돌리고, 호스트에서 그 서버로 연결한 뒤, 호스트에서 GDB 명령을 이용해 디버깅하는 것이다.


우선 일반적인 GDB 서버 설정은 다음과 같다(고 한다).


타겟용으로 컴파일된 gdbserver를 타켓에서 아래와 같이 실행한다.


 target> gdbserver comm program [ args ... ]


예를 들어, TCP 12345 포트를 이용해 test라는 프로그램에 인자를 2개 주고 실행한다고 하면...


 target> gdbserver host:12345 test arg1 arg2


라고 실행하면 된다.


이렇게 동작시킨뒤 호스트에서는 아래와 같이 실행해 gdbserver에 연결 및 실행한다.


 host> gdb

(gdb) target remote [target IP address]:12345

(gdb) load test

(gdb) file test

(gdb) c


target remote 명령은 타겟의 gdbserver에 연결하라는 것이고,

load는 타켓에 test라는 바이너리를 로딩하는 것이며,

file은 test의 심볼들을 지금 gdb와 매핑해서 사용하겠다는 것이다.

실제 실행은 r(un)이 아니라 c(ontinue)를 이용한다.

(target cpu가 host cpu와 다른 경우는 gdb 대신 arm-linux-gnueabi-gdb, sparc-rtems-gdb 등과 같이 해당 CPU와 관련된 gdb를 실행해야 한다.)


이들을 이용하면 기본적인 디버깅은 가능하며, 이 외에도 시리얼을 이용해 타켓과 호스트를 연결한다던지,

동작중인 프로세스를 디버깅한다던지 하는 다양한 기능들이 제공된다.

(아래 출처를 참고하기 바란다.)


내 경우는 타켓이 시뮬레이터이기 때문에 gdbserver를 실행하기 어려운데,

TSIM에는 gdbserver 기능을 내장하고 있어서 별도의 gdbserver를 실행하지 않고 아래와 같이 실행해 원격 디버깅을 할 수 있다.


 host> tsim -gdb


gdb는 아래와 같이 실행하여 연결한다.


 host> sparc-rtems-gdb

(gdb) target remote :12345


<출처: https://sourceware.org/gdb/onlinedocs/gdb/Server.html>


꼬랑쥐 - TSIM에서만 활용했기 때문에 첫번째의 gdbserver를 이용한 방법은 시험해보지 않았다.

Posted by 물빛바다
: