개발 및 디버깅에 유용한 툴 몇가지를 간단히 소개하겠습니다. 아시는 분도 있지만 참조하세요! 

[예제 프로그램] 

# 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 <=== 심볼 정보가 삭제됐음을 알 수 있다. 
--------------------------------------------------------------------------------------------------------------------------------------------------------

출처 - http://k.daum.net/qna/view.html?qid=00gVK

'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
Posted by linuxism
,