2009년 11월 29일 일요일

Solaris 10 에서 sparc용 64비트 gdb 컴파일 하기

주로 64비트 Solaris 개발을 많이 하게 되는데, sunfreeware 에서는 32비트 gdb 패키지만 제공한다. 그래서 직접 컴파일 해보기로 했다.

1. configure 하기

가장 중요한 부분이다.
1) ./configure ==> 일반적인 32비트 컴파일
2) CC="gcc -m64" ./configure ==> 일반적인 64비트 컴파일

64비트 컴파일을 위해 2)번 방식을 사용했는데 make를 하면 에러가 나온다. 이 때부터 구글 검색이 시작되었다. ㅋㅋㅋ

결론은
3) CC="gcc -m64" ./configure --disable-tui
이렇게 configure를 수행하니 잘 된다. tui가 뭐하는 녀석인지 모르겠지만 컴파일이 안되게한 원흉임이 분명하다.

$ CC="gcc -m64" ./configure --disable-tui
checking build system type... sparc-sun-solaris2.10
checking host system type... sparc-sun-solaris2.10
checking target system type... sparc-sun-solaris2.10
checking for a BSD-compatible install... /usr/local/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /usr/local/bin/sed
checking for gawk... no
...

2. make, make install

생략...

3. 간단한 gdb 사용...

간단히 버그를 내포한 코드를 빌드한다. -m64는 64비트 빌드를 의미하고, -g는 디버깅을 위한 옵션이다. 코드 내용은 생략한다.

$ gcc -g -m64 test.c -o test
$ ./test
세그멘테이션 결함(Segmentation Fault)(코어 덤프)
$ ls
a.out core gdb test test.c

hk9:/src1/hk9/test$ gdb -c core test
GNU gdb (GDB) 7.0
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10".
For bug reporting instructions, please see:
...
Reading symbols from /src1/hk9/test/test...done.

warning: exec file is newer than core file.
Reading symbols from /usr/lib/sparcv9/libc.so.1...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 1 (LWP 1)]
Loaded symbols for /usr/lib/sparcv9/libc.so.1
Reading symbols from /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1...(no debugging symbols found)...done.
Loaded symbols for /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1
Reading symbols from /lib/sparcv9/ld.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/sparcv9/ld.so.1
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0xffffffff7f2371b8 in strlen () from /usr/lib/sparcv9/libc.so.1
(gdb) where
#0 0xffffffff7f2371b8 in strlen () from /usr/lib/sparcv9/libc.so.1
#1 0xffffffff7f29f968 in _ndoprnt () from /usr/lib/sparcv9/libc.so.1
#2 0xffffffff7f2a1b9c in printf () from /usr/lib/sparcv9/libc.so.1
#3 0x000000010000085c in main () at test.c:5
(gdb)

2009년 11월 26일 목요일

Sun Studio 12 GUI 디버깅 툴 dbxtool 사용하기



솔라리스에서 GUI 디버깅 툴을 찾는 중 dbxtool 이란 것을 접하게 되었다.

Sun Studio 12 Update 1에서부터 제공되는 tool로써 dbx 디버거를 쉽게 사용하도록 한 GUI라고 볼 수 있다.

1. 설치

● 우선 Sun Studio 12를 아래 링크에서 다운 받는다. 자신이 설치하고자 하는 flatform과 언어를 적절히 선택한다.

● 패키지를 다운로드 받고 적당한 위치에 압축을 해제한다.
ex > # bzcat downloaded_directory/SunStudio12u1-SunOS-SPARC-pkgs-ML.tar.bz2 | /bin/tar -xf -

● 압축을 푼 디렉토리로 이동한다.
ex> cd SunStudio12u1-SunOS-SPARC-pkgs-ML

● 대부분 GUI를 사용하지 못하는 환경일 것이다. Command-Line 모드로 설치를 진행하겠다.
# su -
# ./SunStudio12u1-SunOS-SPARC-pkgs.sh --non-interactive-accept-license

● 기본적으로 /opt 아래에 설치가 되기 때문에 경로를 지정해야 할 경우 아래와 같이 설치 경로를 변경해 줄 수 있다.
# ./SunStudio12u1-SunOS-SPARC-pkgs.sh --non-interactive-accept-license --installation-location 설치할 경로

● 설치와 관련된 추가적인 부분은 문서에서 확인할 수 있다.

● 설치하는 데 시간이 오래 걸린다. 차라도 한잔 마시고 오는게 좋겠다.

● 이제 실행해 본다.
# dbxtool
Sun Studio is unable to find a supported version of Java.
Sun Studio supports Java version 1.5.0_16 and newer and looks for a valid Java installation in the following order:
1) Location specified with --jdkhome command line option
2) In PATH environment variable
3) At /usr/jdk/latest location, if exists
4) At /usr/java location, if exists
5) At /usr location, if exists

근데 안된다... 자바 버전을 확인해보니... 버전이 낮았다.
# java -version
java version "1.5.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
Java HotSpot(TM) Server VM (build 1.5.0_01-b08, mixed mode)

다시 자바를 새로 설치한다. 설치 과정은 생략... 아래 링크 참조...

참고로 자바 설치 후 아래와 같이 링크를 변경해 주었다.

# ls -al
총 18
drwxr-xr-x 5 root bin 512 11월 27일 16:27 .
drwxr-xr-x 44 root sys 1024 2009년 3월 18일 ..
drwxr-xr-x 3 root bin 512 2005년 6월 14일 instances
lrwxrwxrwx 1 root other 7 2005년 6월 14일 j2sdk1.4.2_06 -> ../j2se
lrwxrwxrwx 1 root other 18 2005년 6월 14일 jdk1.5.0_01 -> instances/jdk1.5.0
drwxr-xr-x 10 root root 512 11월 27일 16:27 jdk1.6.0_06
lrwxrwxrwx 1 root root 11 11월 27일 16:27 latest -> jdk1.6.0_06
lrwxrwxrwx 1 root other 11 2005년 6월 14일 latest_old -> jdk1.5.0_01
drwxr-xr-x 7 root bin 512 2005년 6월 14일 packages
# pwd
/usr/jdk

2. 실행

보통 xmanager를 통해 서버에 직접 접속하거나, 서버 앞 모니터로 이동해서 GUI를 띄워야 한다. 난 이것이 너무 귀찮기 때문에 xming과 ssh 터미널을 이용해서 원격에서 GUI를 구동했다.

ssh 터널링을 사용해서 원격에서 X-window 어플리케이션을 실행하는 방법인데, 이건 추후에 정리하도록 하겠다.

터미널에서 dbxtool을 수행하면 끝...
# dbxtool

그런데 사용하다 보니 xming을 이용할 경우 GUI가 오작동 한다. java로 된 프로그램을 xming으로 사용하는데 문제가 있는 듯 하다.

다시 xmanager를 이용해서 dbxtool을 실행해 보았더니 잘 동작한다.

자세한 사용 법은 아래 문서를 참조하면 되겠다.





솔라리스 64비트 바이너리 코어 분석

1. 서론

리눅스와 솔라리스에서 개발할 때 가장 큰 차이는 개발 환경인 듯하다.
리눅스는 설치하면 gcc, gdb 같이 개발에 필요한 대부분의 것이 갖추어져 있다.
솔라리스의 경우 http://www.sunfreeware.com/에서 필요한 툴은 다운 받아 직접 설치해야 한다. 의존성 문제나 기타 여러가지 이유로 해서 상당히 귀찮다. 그리고 가장 큰 문제는 64비트용 gdb가 제공되지 않는다는 것이다.

이 글에서는 Sun Studio의 dbx를 이용한 디버깅 방법을 소개하겠다.

2. 버그 실행 파일 생성

먼저 버그를 내포한 실행 파일을 생성해 보겠다.

# vi test.c

#include

int main(void)
{
printf("test %s\n", 1);
return 1;
}

왜 코어가 발생하는지 설명하지는 않겠다.

아래와 같이 컴파일 한다. 반드시 64비트로 컴파일 한다.
# gcc -m64 -o test test.c

이제 바이너리를 실행하고 코어를 생성해 본다.

# ./test
# ls -al
drwx------ 2 hk9 staff 512 11월 27일 10:18 .
drwxr-xr-x 43 hk9 staff 1536 11월 27일 10:16 ..
-rw------- 1 hk9 staff 1661108 11월 27일 10:18 core
-rwx------ 1 hk9 staff 8168 11월 27일 10:17 test
-rw------- 1 hk9 staff 75 11월 27일 10:16 test.c

3. 코어 분석

- pstack 사용

기본적으로 pstack을 이용해 분석하고, gdb를 이용하는게 일반적이다.

# pstack core
core 'core' of 8496: ./test
ffffffff7f2371b8 strlen (10000090f, ffffffff7ffff898, ffffffff7f29dbf0, ffffffff7fffefe9, 1, 10000090e) + 18
ffffffff7f2a1b94 printf (100000908, 2000, ffffffff7f3ea224, ffffffff7f3ea228, ffffffff7f3e0000, 4) + e4
0000000100000854 main (1, ffffffff7ffff988, ffffffff7ffff998, 100100d60, 100000000, ffffffff7f400100) + 20
00000001000006e4 _start (0, 0, 0, 0, 0, 0) + 7c

printf 함수에서 스트링 출력을 위해 strlen 함수를 호출하다가 코어가 발생했음을 알 수 있다.

- gdb 사용

이제 gdb를 사용해 보자. 근데 뭔가 이상하다.

# gdb test core
GNU gdb 6.6
Copyright (C) 2006 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 "sparc-sun-solaris2.10"...
(no debugging symbols found)
Reading symbols from /usr/lib/sparcv9/libc.so.1...(no debugging symbols found)...done.

warning: sol_thread_new_objfile: td_ta_new: Debugger service failed
Loaded symbols for /usr/lib/sparcv9/libc.so.1
Reading symbols from /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1...(no debugging symbols found)...done.

warning: sol_thread_new_objfile: td_ta_new: Debugger service failed
Loaded symbols for /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1
Reading symbols from /lib/sparcv9/ld.so.1...(no debugging symbols found)...done.

warning: sol_thread_new_objfile: td_ta_new: Debugger service failed
Loaded symbols for /lib/sparcv9/ld.so.1

warning: Couldn't find general-purpose registers in core file.

warning: Wrong size fpregset in core file.

warning: Couldn't find general-purpose registers in core file.

warning: Wrong size fpregset in core file.
#0 0x0000000000000000 in ??
()
(gdb) where
#0 0x0000000000000000 in ?? ()
(gdb)

http://www.sunfreeware.com/에서 배포하는 gdb는 32비트용으로 64를 지원하지 않는다. 그래서 엉뚱한 결과를 얻게 된다. 물론 64비트로 gdb를 컴파일 해서 사용할 수도 있지만, 생각처럼 간단한 작업은 아닌 듯하다. 몇 번 시도해봤지만 번번히 실패했다.

- dbx 사용

dbx는 썬 스튜디오에서 제공하는 소스-레벨 디버깅 툴이다. 자세한 사항은 링크를 참조한다..
기본적으로 사용 법은 gdb와 비슷하다. where 명령으로 어디에서 코어가 발생했는지 확인해 보자.

# dbx test core
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.6' in your .dbxrc
Reading test
core file header read successfully
Reading ld.so.1
Reading libc.so.1
Reading libc_psr.so.1
program terminated by signal SEGV (no mapping at the fault address)
0xffffffff7f2371b8: strlen+0x0018: ldub [%o2], %o1
(dbx) where
=>[1] strlen(0x1, 0x53, 0x1, 0x0, 0x1, 0x53), at 0xffffffff7f2371b8
[2] _ndoprnt(0x10000090f, 0xffffffff7ffff898, 0xffffffff7f29dbf0, 0xffffffff7fffefe9, 0x1, 0x10000090e), at 0xffffffff7f29f960
[3] printf(0x100000908, 0x2000, 0xffffffff7f3ea224, 0xffffffff7f3ea228, 0xffffffff7f3e0000, 0x4), at 0xffffffff7f2a1b94
[4] main(0x1, 0xffffffff7ffff988, 0xffffffff7ffff998, 0x100100d60, 0x100000000, 0xffffffff7f400100), at 0x100000854
(dbx) quit

gdb를 사용했을 경우와 비슷한 결과를 얻을 수 있다.

한가지 더 재미있는 것은 Sun Studio에 내장된 cc 컴파일러로 컴파일 했을 경우
아래와 같이 보다 정확한 디버깅 정보가 표시된다. 역시 Sun 플랫폼에서는 cc 컴파일러를 써야 하는 것 같다.

# cc -g -m64 test.c -o test
# dbx test core
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.7' in your .dbxrc
Reading test
core file header read successfully
Reading ld.so.1
Reading libc.so.1
Reading libc_psr.so.1
program terminated by signal SEGV (no mapping at the fault address)
0xffffffff7f2371b8: strlen+0x0018: ldub [%o2], %o1
Current function is main
5 printf("test %s\n", 1);
(dbx) where
[1] strlen(0x1, 0x53, 0x1, 0x0, 0x1, 0x53), at 0xffffffff7f2371b8
[2] _ndoprnt(0x1000008bf, 0xffffffff7ffff248, 0xffffffff7f29dbf0, 0xffffffff7fffe999, 0x1, 0x1000008be), at 0xffffffff7f29f960
[3] printf(0x1000008b8, 0x2000, 0xffffffff7f3ea224, 0xffffffff7f3ea228, 0xffffffff7f3e0000, 0x4), at 0xffffffff7f2a1b94
=>[4] main(), line 5 in "test.c"
(dbx) quit

자세한 사용법은 Sun Studio 11: Debugging a Program With dbx
문서를 참고하기 바란다.

4. 마치며

솔라리스 64비트 환경에서는 기본적으로 Sun studio 에서 제공하는 개발환경을 이용하는 것이 가장 현명할 것 같다. 컴파일러만 제공하는 것이 아니라 MS의 Visual Studio처럼 통합 개발환경을 제공하기 때문이다. 하지만 나와 같이 gcc에 길들여진 개발자가 64비트 환경에서 개발할 때 gdb 대신에 dbx를 사용하는 것만으로도 개발에 큰 도움이 되지 않을까 싶다.

2009년 11월 25일 수요일

엠피온 하이패스 교통정보 이름 짓기 공모


엠피온으로 유명한 서울통신기술(우리 회사입니다 ㅠㅠ, 제가 만드는 건 아니고 옆에서 열심히 만들고 있습니다. ㅋㅋ)이 하이패스 교통정보 이름 공모를 합니다.

현재 경부고속도로 양재~안성, 영동고속도로 신갈~호법 구간에서 시범 운영하고 있으며, 내년 1월부터 전국 고속도로에 이어, 오는 2012년 전국 모든 지역으로 확대 적용된다고 합니다.

실제 써봤는데 뭐 하이패스를 통해 수집한 데이터를 이용하다 보니 오차가 거의 없습니다. 중요한건 공짜인데다 일반 국도까지 확대 적용한다고 하니 기대가 크네요 ㅎㅎ


* 시상내역

구분

내역

시상금/경품

최우수상: 1명

우수상 : 5명

입선 : 10명

-최우수: 200만원

- 우수 : 최고급 엠피온 내비게이션 (모델명: SEN-100)

- 입선 : 최고급 엠피온 하이패스 (모델명: SET-130G)

http://www.mpeon.com 에서 응모할 수 있습니다.

로드 인포, 하이 로드, 엠피로드 ㅋㅋ 이게 제 상상력의 한계인가 봅니다.