이솝 임베디드 포럼 WiKi 페이지는 이솝 임베디드 포럼 공동제작 보드를 사용하시는 회원님들이 자유롭게 업데이트 하실 수 있습니다.

aesop_logo.gif

editGPE X-Windows Filesystem 가이드

이 문서는 이솝 보드용으로 배포되는 GPE X-Windows 파일 시스템에 대한 가이드 문서 입니다.

 

1. 자동 시작 프로그램 추가 및 제거 방법

 

이솝 보드의 경우 데비안 계열의 /etc 디렉터리 구성 방식을 채용하고 있습니다.
/etc 디렉터리를 다음과 같이 수정하여, 커널 부팅 시 자동으로 시작할 프로그램을 제어 할 수 있습니다.

 

타깃 시스템의 “/etc/” 디렉터리에 보면 다음과 같이 “rc0.d ~ rc6.d” 까지의 디렉터리가 각각 있는 것을 볼 수 있습니다.
타깃 시스템은 앞에서 설명한 Init Level에 따라 각각의 rcX.d 디렉터리 내부에 위치한 스크립트 파일을 실행합니다.

따라서, 사용자가 자동 시작 프로그램을 추가 하기 위해서는 “rc0.d ~ rc6.d”  디렉터리에서 현재 사용하는 Init Level에 맞는 곳에
수행을 하고자 원하는 스크립트 파일을 위치시키면 됩니다.

 

root@aESOP-S5PV210:/# cd /etc/
root@aESOP-S5PV210:/etc# ls
1q                          init.d                     rc0.d
X11                        inittab                    rc1.d
alternatives             inputrc                   rc2.d                                 rc3.d
apm                        ipkg                      rc4.d
asound.conf             issue                    rc5.d
asound.state            issue.net               rc6.d
avahi                      keylaunchrc            rcS.d


1)   자동 시작 프로그램 추가

 

예제에서는 부팅 시에 자동으로 현재 파일 리스트를 출력하는 스크립트를 작성하고 동작시켜 보도록 합니다.
다음의 내용으로 파일을 작성합니다.

 

▣ 자동 수행 파일 생성

 

# vi /etc/rc5.d/S99list-files

 

▣ 파일 내용

#!/bin/sh
ls -la


▣ 수행 결과

 

위와 같이 편집을 한 후 재 부팅을 하면, 아래와 같이 부팅하면서 자동으로 “ls -la” 명령이 수행 되는 것을 알 수 있습니다.

 

Starting system message bus: dbus.
Starting syslogd/klogd: done
 * Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon
 *fail
Starting GPE display manager: gpe-dm
drwxr-xr-x   15 root     root         4096 Feb  2  2009 .
drwxr-xr-x   15 root     root         4096 Feb  2  2009 ..
drwxr-xr-x    2 root     root         4096 Nov 25 01:42 bin
drwxr-xr-x    2 root     root         4096 Nov 25 01:42 boot
drwxr-xr-x   12 root     root        13620 Nov 25 10:49 dev
drwxr-xr-x   37 root     root         4096 Feb  2  2009 etc
drwxr-xr-x    4 root     root         4096 Nov 25 01:55 home
drwxr-xr-x    4 root     root         4096 Nov 25 01:42 lib
drwxr-xr-x   10 root     root         4096 Nov 25 01:42 media
drwxr-xr-x    3 root     root         4096 Feb  2  2009 mnt
dr-xr-xr-x   43 root     root            0 Jan  1  1970 proc
drwxr-xr-x    2 root     root         4096 Nov 25 01:49 sbin
drwxr-xr-x   11 root     root            0 Jan  1  1970 sys
lrwxrwxrwx    1 root     root            8 Feb  2  2009 tmp -> /var/tmp
drwxr-xr-x   11 root     root         4096 Nov 25 01:33 usr
drwxr-xr-x    7 root     root         4096 Nov 25 01:18 var

  _____ _____ _____ _____ _____
 |  _  |   __|   __|     |  _  |
 |     |   __|__   |  |  |   __|
 |__|__|_____|_____|_____|__|.or.kr
 
 (C)2010 aESOP Embedded Forum.                            
 aESOP S5PV210 Embedded Linux Platform.

 System  : aESOP-S5PV210
 Console : s3c_serial1

aESOP-S5PV210 login:


 

2)    자동 시작 프로그램 제거

 

데비안 리눅스 계열에서 자동 시작 프로그램을 비활성화 하는 방법은 앞에서 작성한 “S99list-files”의 이름을 “K99list-files”으로
바꾸면 됩니다. 다음과 같이 명령어를 수행해 봅니다.

 

# mv /etc/rc5.d/ S99list-files /etc/rc5.d/ K99list-files


 

그리고 재 부팅을 해보면 아래와 같이 앞에서 만들어 놓은 자동 수행 파일이 동작하지 않는 것을 알 수 있습니다.

 

Starting system message bus: dbus.
Starting syslogd/klogd: done
 * Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon
 *fail
Starting GPE display manager: gpe-dm
_____ _____ _____ _____ _____
 |  _  |   __|   __|     |  _  |
 |     |   __|__   |  |  |   __|
 |__|__|_____|_____|_____|__|.or.kr
 
 (C)2010 aESOP Embedded Forum.                            
 aESOP S5PV210 Embedded Linux Platform.

 System  : aESOP-S5PV210
 Console : s3c_serial1

aESOP-S5PC100 login:


2. X-Windows 터치 캘리브레이션 방법

 

aESOP-S5PV210은 X 윈도우 기반의 xtscal 프로그램을 이용하여, 캘리브레이션 작업을 수행 합니다.
aESOP-S5PV210 에서 터치 켈리브레이션을 수행하는 방법은, 명령 프롬포트에서 다음의 명령을 입력 합니다.

# xtscal

입력 후, 켈리브레이션 작업을 수행하면 됩니다.

 

3. SSH 및 SSH-Mount를 사용한 파일 전송

 

aESOP-S5PV210은 SSH 서버가 내장되어 있기 때문에 더 이상 NFS Mount를 사용하지 않습니다. (패키지에서 제외하였습니다.)
NFS 보다 더 빠르고 안정적인 SSH를 이용하여 Mount 및 파일 전송을 모두 수행 합니다.

1) SSH-FS를 이용한 타깃 시스템 마운트

개발 환경은 uBuntu Linux 8.10 기준이며, uBuntu Linux 8.10에서 다음 명령으로 SSH-FS를 설치 합니다.
SSH-FS를 사용하면, 타깃 보드의 디렉터리 별로 다중으로 마운트를 걸 수 있습니다.

예) 타깃보드의 /etc 디렉터리는 /mnt/aesop-etc로,
     타깃보드의 /bin 디렉터리는 /mnt/aesop-bin으로.. 등...

또한, 사내의 내부 네트워크에 타깃보드를 연결하면, 다수의 작업자들이 하나의 타깃 보드에 연결하여 개발을 진행 할 수 있습니다.

# sudo apt-get install sshfs

* 우분투 리눅스를 로그 아웃하고 다시 접속

# su -
# sshfs root@타깃보드IP:/ 호스트 시스템 마운트 포인트

* 패스워드를 입력하는 곳에서 Enter 키 입력

예)

root@jhkim-Xeon:~# sshfs [email protected]:/ /mnt/S5PV210/
[email protected]'s password:
root@jhkim-Xeon:~# ls -la /mnt/S5PV210
합계 76
drwxr-xr-x 1 root root  2048 2009-03-20 09:46 .
drwxr-xr-x 5 root root  4096 2009-03-20 13:57 ..
drwxr-xr-x 1 root root  2048 2009-03-16 16:15 bin
drwxr-xr-x 1 root root  2048 2009-03-16 16:15 boot
drwxr-xr-x 1 root root 13320 2009-03-17 07:36 dev
drwxr-xr-x 1 root root  2048 2009-03-19 17:00 etc
drwxr-xr-x 1 root root  2048 2009-03-16 16:26 home
drwxr-xr-x 1 root root  2048 2009-03-20 08:47 lib
lrwxrwxrwx 1 root root    17 2009-03-17 06:20 linuxrc -> ../../bin/busybox
drw-rw-rw- 1 root root  2048 2009-03-17 07:36 lost+found
drwxr-xr-x 1 root root  2048 2009-03-16 16:23 media
drwxr-xr-x 1 root root  2048 2009-03-19 18:08 mnt
dr-xr-xr-x 1 root root     0 1970-01-01 09:00 proc
drwxr-xr-x 1 root root  2048 2009-03-19 14:27 sbin
drwxr-xr-x 1 root root     0 1970-01-01 09:00 sys
lrwxrwxrwx 1 root root     8 2009-03-17 06:20 tmp -> /var/tmp
drwxr-xr-x 1 root root  2048 2009-03-16 15:46 usr
drwxr-xr-x 1 root root  2048 2009-03-16 15:49 var
root@jhkim-Xeon:~#

2) WinSCP를 이용한 타깃 시스템 파일 전송

WinSCP를 사용하여 타깃 시스템에 접속하여 파일을 전송할 수 있습니다.
이것은 윈도우 운영체제에서 타깃 보드에 파일을 전송할 때 특히 유용 합니다.

* 다음의 주소에서 WinSCP를 다운로드 받고, 설치 합니다.

http://winscp.net/download/winscp418setup.exe

* WinSCP를 수행한 후, 접속 창에서 다음과 같이 입력 합니다.

1.JPG

* 로그인 단추를 누르면 다음과 같이 타깃 보드에 접속된 화면을 볼 수 있습니다.

2.JPG

3) 타깃 보드에서 호스트 PC로의 SSH를 경유한 접속 방법

타깃 보드에서 다음과 같은 명령을 이용하면, SSH를 이용하여 호스트 PC에 접속할 수 있습니다.

# ssh 사용자 이름@호스트 시스템 IP

root@S5PC100:~# ssh [email protected]

Host '192.168.1.15' is not in the trusted hosts file.
(fingerprint md5 db:59:19:97:3f:44:36:43:39:6b:23:45:f8:67:aa:71)
Do you want to continue connecting? (y/n) y
[email protected]'s password:
Linux jhkim-Xeon 2.6.27-11-generic #1 SMP Thu Jan 29 19:24:39 UTC 2009 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
Last login: Fri Mar 20 14:04:39 2009 from 192.168.1.15
jhkim@jhkim-Xeon:/home/jhkim $

4) 타깃 보드에서 호스트 PC로의 SCP를 이용한 다운로드 방법

만약 호스트 PC의 /nfsroot 디렉터리에 있는 Qt-Sample 라는 파일을 타깃 보드로 다운로드 받고 싶다면,
다음과 같은 명령을 이용합니다.

# scp 사용자계정@호스트 IP:디렉터리 다운로드 받을 디렉터리

root@S5PV210:~# scp [email protected]:/nfsroot/Qt-Sample .
[email protected]'s password:
Qt-Sample                                     100%   11KB  10.6KB/s   00:00   
root@S5PV210:~#

5) 호스트 PC에서 SSH를 이용한 타깃 보드 접속


호스트 시스템에서 SSH를 이용하여 aESOP-S5PV210 보드로 접근할 수 있습니다.
시리얼 포트를 따로 연결하지 않더라도, Putty나 SecureCRT 등의 SSH 터미널 프로그램을 이용하여 동일하게
사용할 수 있습니다.

또한 SSH를 이용하면 타깃 보드 터미널 창을 동시에 여러개 열 수 있기 때문에 좀 더 유리한 개발 환경을
구축 할 수 있습니다.

* 리눅스에서 SSH를 이용한 타깃 보드 접근 방법


# ssh 사용자 이름@타깃 보드 IP

예) 타깃 보드에 SSH로 접속하여 다중 작업 수행 화면

1) 홈 디렉터리 ls 명령 수행

11.JPG

2) top 명령 수행

12.JPG

3) mplayer 구동

13.JPG

 

4. Naitive GDB 사용 방법

 

aESOP S5PV210 보드에는 Native GDB가 기본으로 포함되어 제공 됩니다.

따라서, 일반 리눅스 PC에서 GDB를 사용하는 것과 동일하게 타깃 보드에서 GDB를 이용하여
응용프로그램 디버깅을 수행할 수 있습니다.

다음은 http://dualpage.muz.ro/ 에서 발췌해 온 GDB의 간단한 사용 방법 입니다.

대상 프로그램 지정

먼저 디버깅을 할 대상 프로그램을 지정하는 방법에는
두가지 방법이 있습니다.
1. open - 새로 프로그램을 지정한다.
2. attch - 이미 실행중인 프로그램을 지정한다.

먼저 open은 다음과 같이 하면 됩니다.

gdb 대상프로그램

dual5651@dualpage:~$ gdb ./exam1
GNU gdb 6.3-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb)

위는 성공적으로 대상 프로그램을 open하였을때의 모습입니다.
만약 존재하지 않는 프로그램을 open하고자 한다면 마지막 줄에
다음과 같은 메시지가 뜹니다.

This GDB was configured as "i386-linux"..../exam2:
그런 파일이나 디렉토리가 없음.

attch는 이미 실행중인 process를 디버깅하고자 할때 사용하는
것으로, 다음과 같이 사용하실 수 있습니다.

dual5651@dualpage:~$ ps -aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root      1085  0.0  0.8  7176 2160 ?        Ss   20:50   0:00 sshd:
root      1087  0.0  0.8  7176 2160 ?        S    20:50   0:00 sshd:
root      1141  0.0  0.1  1344  312 tty1     S+   21:17   0:00 /root/exam
dual5651  1132  0.0  0.3  2480  856 pts/0   R+   21:14   0:00 ps -aux

먼저 ps -aux 명령을 이용하여 현재 실행중인 프로세스들의
목록을 출력하여 보았더니, root님이 /root/exam 이라는
프로그램을 실행중이신 것을 볼 수 있습니다. PID가 1141이라는
것을 잘 봐두어야 합니다. :)
이 프로세스를 attch하려면 다음과 같이 하면 됩니다.
gdb 대상프로그램 PID

dual5651@dualpage:~$ gdb /root/exam 1141
GNU gdb 6.3-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...Using host libthread_db library "/lib/libthread_db.so.1".

Attaching to program: /root/exam, process 1141

프로세스 실행상태 관리

디버깅을 하려면 먼저 대상 프로그램을 켜야 할 것이고,
끝난후에는 디버깅 되는 대상을 죽여줘야 할 것입니다.
다음과 같은 명령어가 존재합니다.

run - 대상 프로그램을 시작 시킨다.
ex)run : 대상 프로그램을 시작 시킨다.

run 인자 - 대상 프로그램의 인자값을 준 상태로 시작 시킨다.
ex)run 1234 : 인자로써 1234를 주고 시작 시킨다.

kill - 대상 프로그램을 종료 시킨다.
ex)kill : 대상 프로그램을 종료 시킨다.

Break Point(중단점) 관리

Break Point는 디버깅을 하는데 있어서 아주 중요한
기능이라고 할 수 있겠습니다. (BP 없는 디버거는 꿈꿀수도 없죠 lol)
다음과 같은 BreakPoint관리 명령어가 존재합니다.

1. Break - Break Point 설치
2. clear,delete - Break Point 제거
3. disable - Break Point 비활성화
4. enable - Break Point 활성화
5. condition - Break Point에 조건 부여

Break
지정한 주소에 Break Point를 걸 수 있는 명령입니다.
다음과 같이 사용할 수 있습니다.

break 함수 - 지정한 함수에 BP를 설치 합니다.
ex)break main : main()함수에 BP를 설치한다.

break 주소 - 지정한 주소에 BP를 설치 합니다.
ex)break 0x08048454 - 0x08048454에 BP를 설치한다.

break - 인자 없는 break는 실행중인 현재 주소에 BP를 설치합니다.
ex)break - 현재 실행중인 주소에 BP를 설치한다.

실제로 BP를 설치하면 어떻게 되는지 알아 보도록 하겠습니다.

dual5651@dualpage:~$ gdb ./exam1
GNU gdb 6.3-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x804845a
(gdb) run
Starting program: /home/dual5651/exam1
Breakpoint 1, 0x0804845a in main ()
(gdb)

main에 Break Point를 설치한 상태에서 프로그램을 실행 시키니,
바로 main에 설치한 BP에 걸린 것을 볼 수 있습니다. :)
break 명령을 사용할 때에, Breakpoint 다음에 보여주는 숫자는
현재 설치한 BP의 번호입니다. 이 번호를 사용하여 해당 BP를
제거/비활성화/활성화 등의 관리를 합니다.

Clear, Delete
지정한 BP를 제거하거나, 모든 BP를 제거 할때 사용합니다.
두 명령어의 사용방법은 전혀 다른데,
다음과 같이 사용할 수 있습니다.

clear 함수 - 지정한 함수에 설치되어 있는 BP 제거
ex)clear main : main()함수에 설치된 BP 제거

delete BP번호 - 지정한 BP번호의 BP를 제거
ex)delete 1 : 1번 BP에 대한 BP제거

delete - 모든 BP를 제거
ex)delete - 모든 BP제거

실제로 BP를 설치 후, 제거해 보도록 하겠습니다.

(gdb) break main
Breakpoint 1 at 0x804845a
(gdb) clear main
Deleted breakpoint 1
(gdb) break main
Breakpoint 2 at 0x804845a
(gdb) delete 2
(gdb) break 0x80484e0
Function "0x80484e0" not defined.
Make breakpoint pending on future shared library load?
(y or n) y
Breakpoint 3 (0x80484e0) pending.
(gdb) delete
Delete all breakpoints? (y or n) y
(gdb)

clear는 친절하게 BP가 제거되면 알려주는데, delete는 안 그렇군요.:(

Disable
특정 BP를 비활성화 시키거나 모든 BP를 비활성화 시킵니다.
다음과 같이 사용할 수 있습니다.

disable 번호 - 지정한 번호에 대한 BP를 비활성화 시킵니다.
ex) disable 1 - 1번 BP를 비활성화 시킵니다.

disable - 모든 BP를 비활성화 시킵니다.
ex) disable - 모든 BP를 비활성화 시킵니다.

Enable
특정 BP를 활성화 시키거나 모든 BP를 활성화 시킵니다.
다음과 같이 사용할 수 있습니다.

enable 번호 - 지정한 번호에 대한 BP를 활성화 시킵니다.
ex) enable 1 - 1번 BP를 활성화 시킵니다.

enable - 모든 BP를 활성화 시킵니다.
ex) enable - 모든 BP를 활성화 시킵니다.

Condition
특정 BP에 조건을 부여할 수 있습니다.
다음과 같이 사용할 수 있습니다.

condition 번호 조건 - 지정한 번호에 대한 BP에 조건을 부여합니다.
ex) condition 1 $eax==5 : 1번 BP는 eax의 값이 5일때만 멈춘다.
ex) condition 1 $eax < 3 : 1번 BP는 eax의 값이 3미만일때만 멈춘다
ex) condition 1 ($eax < 3) && ($ecx > 5) : eax의 값이 3미만이고,
      ecx의 값이 5 초과 일때만 멈춘다.
ex) condition 1 ($eax < 3) || ($ecx > 5) : eax의 값이 3미만이거나,
      ecx의 값이 5촉
ex) condition 1 $eax=5 : 1번 BP가 작동할떄 eax의 값을 5로 만든다.

위의 예 말고도 원하는 특정한 조건일 때 멈추게 할수도 있거니와,
해당 BreakPoint에 걸렸을때 원하는 값으로 Set 시키는 용도로
사용할 수 있는 것입니다.  :)

Debugging중 상태 보기

Info

gdb로 디버깅 중, 현재 Register들의 상태라던지,
설치되어 있는 BreakPoint들의 상태가 궁금할 수 있습니다.
이럴떄 사용하는 명령어가 바로 info 입니다.
다음과 같이 사용할 수 있습니다.

info reg - 모든 레지스터들의 정보 출력
ex) info reg : 모든 레지스터들의 정보 출력

info reg 특정레지스터 - 특정레지스터의 정보 출력
ex) info reg eax - eax의 정보 출력
ex) info reg eax ebx - eax,ebx의 정보 출력

info breakpoints - 모든 BreakPoint들의 정보 출력
ex) info breakpoints - 모든 BreakPoint들의 정보 출력

info breakpoints BP번호 - 특정한 BP번호에 대한 정보 출력
ex) info breakpoints 1 - 1번 BP에 대한 정보 출력

info args - 프로세스가 시작될때 주어진 인자값 출력
ex) info args

info func - 프로세스가 사용하는 함수들에 대한 출력
ex) info func

info frame - 프로세스 프레임에 대한 정보 출력
ex)info frame

info display - 중단될 떄 마다 출력될 display들에 대한 출력
ex) info display

실제로 디버깅 도 중 info 명령을 이용해 정보를 표시해 보겠습니다.

(gdb) break main
Breakpoint 1 at 0x804845a
(gdb) run
Starting program: /home/dual5651/exam1
Breakpoint 1, 0x0804845a in main ()
(gdb) info reg
eax            0x1      1
ecx            0x1      1
edx            0x40156db4       1075146164
ebx            0x401558c0       1075140800
esp            0xbffffad0       0xbffffad0
ebp            0xbffffaf8       0xbffffaf8
esi            0x40016540       1073833280
edi            0xbffffb54       -1073743020
eip            0x804845a        0x804845a
eflags         0x10282  66178
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x0804845a <main+6>
       breakpoint already hit 1 time
(gdb)


Display
중단될 떄 마다 특정한 값을 출력하고 싶다면,
display 명령을 사용하면 됩니다.
다음과 같이 사용할 수 있습니다.

display $레지스터 - 특정 레지스터 값을 중단될 떄 마다 출력
ex)display $eax : eax의 값을 중단될 떄 마다 출력

실제로 어떻게 표시되는지 해보겠습니다.

(gdb) watch $eax
1 : $eax = 0
(gdb) nexti
0x080484a2 in main ()
1: $eax = 0
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1:   y  $eax


Watch

info와 특정한 레지스터의 값이 변경되었을 떄나,
변수의 값이 변경되었을 떄에 그 변경됨을 알고 싶다면,
watch 명령어를 사용할 수 있습니다.
다음과 같이 사용할 수 있습니다.

watch $레지스터 - 특정 레지스터의 값이 변경될 떄.
ex)watch $eax : $eax의 값이 변경될 떄 마다 알림

watch $주소 - 특정 주소의 값이 변경될 떄
ex)watch $804981c : 0x804981c의 값이 변경될때 알림

*watch는 BP와 마찬가지로 info watchpoints를 통해서
목록을 볼 수 있고, break관리에 쓰던 명령들을 쓸 수 있음.

실제로 진행 시켜 보면서 eax의 값이 변경되었을 떄
어떻게 gdb가 표시해주는지 보겠습니다.

(gdb) watch $eax
Watchpoint 2: $eax
(gdb) cont
Continuing.
Watchpoint 2: $eax
Old value = 1
New value = 0
0x08048462 in main ()
(gdb) info watchpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x0804845a <main+6>
       breakpoint already hit 1 time
2   watchpoint     keep y              $eax
       breakpoint already hit 1 time
(gdb)



Printf

printf는 c언어를 해보신 분이라면 다 아는 함수죠.
지정한 형식에 따라 값을 출력해 줍니다.
다음과 같이 사용할 수 있습니다.

printf “포맷스트링”, 인자1, 인자2, 인자3, ..., 인자n
ex) printf "%x",$eax :eax 레지스터의 값을 16진수로 표시

x/포맷문자

메모리에 있는 값을 출력해야 할 떄가 있습니다.
그떄 사용하는 것이, x/ 입니다.
다음과 같이 사용할 수 있습니다.

x/x 주소 - 특정한 주소의 값을 16진수로 출력
ex) x/x 0x8048454 : 0x8048454의 값을 16진수로 출력

x/s 주소 - 특정한 주소의 값을 문자열로 출력
ex) x/s 0x8048454 : 0x8048454의 값을 문자열로 출력

x/50x 주소 - 특정한 주소부터 50개 만큼 16진수로 출력
ex) x/50x 0x8048454 : 0x8048454부터 50개만큼 출력

x/c 주소 - 특정한 주소의 값을 문자값으로 출력
ex) x/c 0x8048454 : 0x8048454에 있는 값을 문자로 출력

다 예를 들 수 없어서 이만 생략합니다. :)
실제로 사용하면 어떻게 출력되는지 해보겠습니다.

(gdb) x/s 0x8048680
0x8048680 <_IO_stdin_used+28>:   "Name : "
(gdb) x/10c 0x8048680
0x8048680 <_IO_stdin_used+28>:  78 'N'  97 'a'  109 'm' 101 'e' 32 ' '  58 ':' 32 ' '   0 '\0'
0x8048688 <_IO_stdin_used+36>:  83 'S'  101 'e'
(gdb) x/5x 0x8048680
0x8048680 <_IO_stdin_used+28>:  0x4e    0x61    0x6d    0x65    0x20
(gdb)


Disas

특정한 주소의 코드가 보고 싶을 떄 사용하는 명령어 입니다.
다음과 같이 사용할 수 있습니다.

disas - 가장 처음 부터 Disassemble한다.
ex) disas

disas 함수 - 특정한 함수만 Disassemble 한다.
ex) disas main

disas 시작주소 끝주소 - 시작주소 부터 끝주소 까지 Disassemble
ex) disas 0x804845c 0x804849d
ex) disas main main+5

Debugging 진행

Nexti

Debugging을 할떄에 step by step을 하며 한줄씩 실행 시켜야
할떄가 있습니다. 그럴 떄 사용하는 명령어가 nexti입니다.
다음과 같이 사용할 수 있습니다.

nexti - 다음 명령어 까지 실행
ex)nexti : 다음 명령어 까지 실행

nexti 갯수 - 갯수 만큼의 명령어 실행
ex)nexti 5 : 5개의 명령어 실행

실제 사용해 보면 다음과 같습니다.

(gdb) nexti
0x0804845d in main ()
(gdb) nexti 5
0x08048477 in main ()
(gdb)

Cont

Debugging을 할때에 다음 BP까지의 명령들은 step by step을
건너 뛰고 싶을때 사용하는 명령어 입니다.
다음과 같이 사용할 수 있습니다.

cont - 다음 BP를 만날떄까지 실행
ex)cont - 다음 BP를 만날떄까지 실행

그 외의 명령어들

set - 특정한 값으로 변경 시킬때 사용합니다.
ex) set $eax=3 : eax의 값을 3으로 만듭니다.

quit - gdb를 종료합니다.
bt - 콜 스택을 보여줍니다.
cd - 작업 폴더 변경
pwd - 현재 폴더 출력
help - 도움말 정보를 출력합니다.
 


 

사용자 로그인