리눅스 일반

[리눅스] 성능 툴 ltrace 사용 방법

트리스탄1234 2024. 3. 23. 05:54
728x90
반응형

 
안녕하세요 이웃님들 ^.^
좋은 아침 입니다. 
 
오늘은 리눅스 시스템 상에서 Application의 성능을 측정 하는 툴 중에 하나인 lterac의 사용 방법에 대해서 
포스팅을 해보겠습니다. 
 

리눅스에서 ltrace는 프로그램이 라이브러리 함수를 호출하는 방식을 추적하는 데 사용되는 유틸리티입니다. strace와 유사하지만, strace가 시스템 호출을 추적하는 데에 비해 ltrace는 라이브러리 함수를 추적합니다. 다음은 ltrace의 기본 사용법입니다.

반응형


우선 ltrace를 사용하기 위해서는 설치가 되어 있어야 하구요. Ubuntu와 Debian계열 에서는
아래의 명령을 사용해 설치를 할수 있습니다.

sudo apt-get install ltrace


그리고 ltrace를 사용하는 방법은 아래와 같습니다.


ltrace [옵션] [프로그램] [인수]

ltrace [옵션] [프로그램] [인수]


여기서 옵션은 ltrace의 동작을 제어하는 데 사용됩니다. 프로그램은 추적할 대상 프로그램이며, 인수는 해당 프로그램에 전달될 인수들입니다.

728x90


예를들면  ls 명령이 호출하는 라이브러리 함수를 추적하려면 다음과 같이 사용할 수 있습니다.
ltrace ls
이 명령은 ls 명령이 호출하는 라이브러리 함수를 모두 나열합니다.
실행을 시키고 로그를 보면 아래와 같이 나옵니다. 

ubuntu@DESKTOP-H5OIPJC:~$ ltrace ls
strrchr("ls", '/')                                                        = nil
setlocale(LC_ALL, "")                                                     = "C.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale")                          = "/usr/share/locale"
textdomain("coreutils")                                                   = "coreutils"
__cxa_atexit(0x556815c14fe0, 0, 0x556815c2a008, 0x736c6974756572)         = 0
isatty(1)                                                                 = 1
getenv("QUOTING_STYLE")                                                   = nil
getenv("COLUMNS")                                                         = nil
ioctl(1, 21523, 0x7ffdd2069e10)                                           = 0
getenv("TABSIZE")                                                         = nil

 
위의 출력물을 해석을 해보면 아래와 같습니다. 
 
 1)문자열 "ls"에서 '/' 문자를 찾습니다. 하지만 '/' 문자가 없으므로 strrchr() 함수는 nil을 반환합니다.
 2)지역화 설정이 이루어집니다 (setlocale() 호출). 여기서는 "C.UTF-8"로 설정됩니다.
 3) 텍스트 도메인이 "coreutils"로 설정됩니다 (textdomain() 호출).
 4) __cxa_atexit() 함수가 호출됩니다. 이 함수는 프로그램이 종료될 때 실행될 함수를 등록합니다.
 5) 표준 출력이 터미널에 연결되어 있는지 확인합니다 (isatty() 호출). 결과는 1(참)입니다.
 6) getenv() 함수를 사용하여 환경 변수 "QUOTING_STYLE", "COLUMNS", "TABSIZE"를 확인합니다. 모두 nil(값이 없음)을 반환합니다.
 7) ioctl 시스템 콜을 사용하여 파일 디스크립터 1(표준 출력)의 속성을 설정합니다.
 
이런식으로 어던 명령을 실행 시키거나, 프로그램을 실행을 시키면 어떤 함수들을 호출을 하고 사용하는지 추적을 할수 있있지요. 

그럼 사용 가능한 옵션을 한번 살펴 볼까요?
1) -c: 각 라이브러리 함수 호출의 횟수를 요약하여 보여줍니다. 이 옵션은 각 함수 호출의 횟수를 보여주는 통계를 생성하여 사용자가 프로그램의 동작을 파악하는 데 도움을 줍니다.

2) -e: 특정 라이브러리 함수 호출만 추적하도록 지정합니다. 예를 들어, -e 옵션을 사용하여 특정 함수만 추적할 수 있습니다. 사용 방법은 아래와 같고 여러 함수를 추적할때는 쉼표로 구분을 하여 함수를 나열하여 사용하면 됩니다. 

3) -f: 자식 프로세스에서의 함수 호출도 추적합니다. 이 옵션을 사용하면 추적 대상 프로그램에서 생성되는 모든 자식 프로세스의 함수 호출도 추적합니다.

4)-o: 출력을 파일로 리디렉션하여 저장합니다. 이 옵션을 사용하면 추적 결과를 파일로 저장하여 나중에 분석할 수 있습니다.

5) -t: 각 라이브러리 함수 호출의 시간을 출력합니다. 이 옵션은 각 함수 호출이 발생한 시간을 보여줍니다.

그럼 실제 사용하는 예를 살펴 봅시다. 
아래 명령은 crul 프로그램을 이용하셔 http://example.com 사이트를 호출할 경우 어떤 함수를 호출 하는지 보여 줍니다. 
 

이 로그 설명 해줘

ChatGPT
이 로그는 ltrace를 사용하여 curl 명령을 실행한 결과입니다. ltrace는 프로그램이 실행될 때 호출되는 라이브러리 함수의 사용을 추적합니다.

여기서 curl 명령은 http://example.com에 대한 요청을 하고 있습니다.

ubuntu@DESKTOP-H5OIPJC:~$ ltrace curl http://example.com
pipe(0x7fff84e94c80)                                                      = 0
close(3)                                                                  = 0
close(4)                                                                  = 0
signal(SIGPIPE, 0x1)                                                      = 0
malloc(1304)                                                              = 0x55d11bafe940
curl_global_init(3, 0, 1313, 0x55d11bafee50)                              = 0
curl_version_info(5, 0, 0x12800, 0)                                       = 0x7f7579b7c020
curl_strequal(0x7f7579b5edd2, 0x55d11b30b307, 0x12800, 0)                 = 1
curl_strequal(0x7f7579b6110d, 0x55d11b30b307, 0xffffff9f, 0)              = 0
curl_strequal(0x7f7579b6110d, 0x55d11b2fdbff, 3, 0)                       = 1
curl_strequal(0x7f7579b5ee13, 0x55d11b30b307, 0xffffff9f, 0)              = 0
curl_strequal(0x7f7579b5ee13, 0x55d11b2fdbff, 3, 0)                       = 0
curl_strequal(0x7f7579b5ee13, 0x55d11b30b353, 8, 0)                       = 1
curl_strequal(0x7f7579b5edd7, 0x55d11b30b307, 0xffffff9f, 0)              = 0
curl_strequal(0x7f7579b5edd7, 0x55d11b2fdbff, 3, 0)                       = 0
curl_strequal(0x7f7579b5edd7, 0x55d11b30b353, 8, 0)                       = 0
curl_strequal(0x7f7579b5edd7, 0x55d11b30b30c, 0xffffff9f, 0)              = 1
curl_strequal(0x7f7579b5eddc, 0x55d11b30b307, 0xffffff9f, 0)              = 0
curl_strequal(0x7f7579b5eddc, 0x55d11b2fdbff, 3, 0)                       = 0


로그를 살펴 보면 아래와 같습니다. 
1)pipe() 함수가 호출되어 파이프가 생성됩니다.
2) 파일 디스크립터 3과 4가 닫힙니다 (close() 호출).
3) SIGPIPE 신호에 대한 핸들러가 설정됩니다 (signal() 호출).
4) 메모리 할당이 이루어집니다 (malloc() 호출).
5) curl_global_init() 함수가 호출되어 libcurl을 초기화합니다.
6) curl_version_info() 함수가 호출되어 curl 라이브러리의 버전 정보를 가져옵니다.
7) curl_strequal() 함수가 여러 번 호출되어 문자열 비교를 수행합니다. (curl_strequal()은 libcurl 내부에서 사용되는 함수로, 문자열을 비교합니다).

이제 ltrace를 사용해서 어떤 함수가 호출 되는지 추적을 하실 수 있겠죠?
그럼 오늘 하루도 행복하고 즐거운 하루 되세요. 
 
 
 
 

728x90
반응형