본문 바로가기

개발자 기본 소양

개발디버깅 명령어 ( nm , ldd , lsof )

[출처] 개발디버깅 명령어 ( nm , ldd , lsof )|작성자 심즈

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

[예제 프로그램]

# vi hello.c
--
#include <stdio.h>

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