개발 및 디버깅에 유용한 툴 몇가지를 간단히 소개하겠습니다. 아시는 분도 있지만 참조하세요! [예제 프로그램] # vi hello.c -------------------------------------------------------------------------------------------------------------------------------------------------------- #include int main() { printf(Hello, World!n); getchar(); return 0; } -------------------------------------------------------------------------------------------------------------------------------------------------------- # gcc -o hello hello.c # ./hello Hello, World! # -------------------------------------------------------------------------------------------------------------------------------------------------------- nm : list symbols from object files # nm hello 08048374 t Letext 080494d4 ? _DYNAMIC 080495ac ? _GLOBAL_OFFSET_TABLE_ 080484b0 R _IO_stdin_used 080495a0 ? __CTOR_END__ 0804959c ? __CTOR_LIST__ 080495a8 ? __DTOR_END__ 080495a4 ? __DTOR_LIST__ 080494d0 ? __EH_FRAME_BEGIN__ 080494d0 ? __FRAME_END__ 080495d0 A __bss_start 080494c4 D __data_start w __deregister_frame_info@@GLIBC_2.0 08048460 t __do_global_ctors_aux 080483a0 t __do_global_dtors_aux w __gmon_start__ U __libc_start_main@@GLIBC_2.0 w __register_frame_info@@GLIBC_2.0 080495d0 A _edata 080495e8 A _end 08048490 T _fini 080484ac R _fp_hw 080482c0 T _init 08048350 T _start 08048374 t call_gmon_start 080494cc d completed.4 080494c4 W data_start 080483f0 t fini_dummy 080494d0 d force_to_data 080494d0 d force_to_data 080483f8 t frame_dummy 08048374 t gcc2_compiled. 080483a0 t gcc2_compiled. 08048460 t gcc2_compiled. 08048490 t gcc2_compiled. 08048430 t gcc2_compiled. U getchar@@GLIBC_2.0 <=== glibc 2.0버전 라이브러이의 getchar함수를 사용하는 것을 알 수 있음 0804841c t init_dummy 08048484 t init_dummy 08048430 T main 080495d0 b object.11 080494c8 d p.3 U printf@@GLIBC_2.0 <=== glibc 2.0버전 라이브러이의 printf함수를 사용하는 것을 알 수 있음 ------------------------------------------------------------------------------------------------------------------------------------------------------- ldd : print shared library dependencies # ldd hello libc.so.6 => /lib/libc.so.6 (0x40029000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) -------------------------------------------------------------------------------------------------------------------------------------------------------- lsof : list open files 현재 실행중인 프로세스가 open한 모든 파일 목록을 출력해줍니다. 유닉스나 리눅스는 모든 것을 파일로 다루므로 일반 파일, 장치 디바이스, 디렉토리, Socket, FIFO, PIPE, 공유 라이브러리, ... 을 모두 출력해줍니다. 자기가 만들거나 다른 사람이 만든 어플리케이션이 어떤 장치 디바이스를 사용한다거나, 현재 open한 Socket의 개수를 알아보거나, 참조하는 공유 라이브러리가 무엇인지 등의 정보를 알 수 있습니다. 배포 패키지를 개발할때 참조하는 공유 라이브러리 정보를 알수 있으므로 유용하게 쓰일 수 있습니다. [터미널 1] # ./hello <=== 키 입력을 대기한다. [터미널 2] # lsof | grep hello COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME hello 11856 root cwd DIR 3,1 704 57679 /usr/src <=== cwd : 현재 작업 디렉토리 hello 11856 root rtd DIR 3,1 576 2 / hello 11856 root txt REG 3,1 13331 3216 /usr/src/hello hello 11856 root mem REG 3,1 435016 205533 /lib/ld-2.2.5.so <=== mem : 메모리 맵 파일, 사용중인 공유 라이브러리 hello 11856 root mem REG 3,1 5029105 205536 /lib/libc-2.2.5.so <=== mem : 메모리 맵 파일, 사용중인 공유 라이브러리 hello 11856 root 0u CHR 136,7 9 /dev/pts/7 <=== 0u(stdin), /dev/pts/7 : 사용중인 터미널 디바이스, 프로그램이 실행하면 세개의 화일인 stdin, stdout, stderr 자동생성한다. hello 11856 root 1u CHR 136,7 9 /dev/pts/7 <=== 1u(stdout), hello 11856 root 2u CHR 136,7 9 /dev/pts/7 <=== 2u(stderr) # -------------------------------------------------------------------------------------------------------------------------------------------------------- 결과가 나왔으면 [터미널 1]으로 이동하여 엔터키를 쳐서 hello 프로그램을 종료시킨다. -------------------------------------------------------------------------------------------------------------------------------------------------------- file : determine file type # file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped ELF 32-bit LSB executable : 실행파일형식 Intel 80386 : Intel 80386 어셈블리어로 되어있음 dynamically linked (uses shared libs) : 동적 라이브러리가 연결 가능하다. not stripped : 심볼 정보가 남아있는 경우 -------------------------------------------------------------------------------------------------------------------------------------------------------- strip : Discard symbols from object files. # strip hello # file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped <=== 심볼 정보가 삭제됐음을 알 수 있다. -------------------------------------------------------------------------------------------------------------------------------------------------------- |
'System > Linux' 카테고리의 다른 글
centos - python 2.6.x 설치 (1) | 2012.07.13 |
---|---|
CentOS - RPMforge EPEL Remi 저장소 설치 (0) | 2012.07.13 |
Linux - iptables를 이용한 포트포워딩 (1) | 2012.05.26 |
/etc/shadow (0) | 2012.05.25 |
BIND 설치 (0) | 2012.05.16 |