ltrace는 리눅스에서 사용되는 디버깅 및 프로파일링 도구로, 실행 중인 프로그램이 호출하는 라이브러리 함수를 추적하고 분석하는 기능을 제공한다. 이를 통해 소프트웨어 개발자는 프로그램의 동작과 성능을 이해하고, 잠재적인 버그를 찾거나 성능 개선을 위한 힌트를 얻을 수 있다. 이번 글에서는 ltrace의 기본적인 사용법과 몇 가지 유용한 옵션에 대해 알아본다.
기본 사용법
ltrace는 추적하려는 프로그램과 인자를 함께 지정한다.
$ ltrace ./example
주요 Option
ltrace는 다양한 옵션을 제공하여 사용자의 추적 요구에 맞게 설정할 수 있다.
-e <function>
: 특정 함수만 추적한다. 예를 들어,-e printf
는 printf 함수만 추적한다.-f
: 자식 프로세스에서 발생하는 함수 호출도 추적한다.-o <output_file>
: 추적 결과를 파일로 저장한다.-s <size>
: 문자열 인자의 최대 크기를 지정한다.-tt
: 함수 호출 시간 정보를 출력한다.
이 외에도 ltrace는 다양한 옵션을 제공하므로, man ltrace
명령을 통해 상세한 도움말을 확인할 수 있다.
Example
다음은 간단한 C 프로그램으로, “Hello, World!”를 출력하고, sleep 함수를 호출한 후에 다시 “Goodbye!”를 출력한다.
#include <stdio.h>
#include <unistd.h>
void sleep_and_print(const char* message, int seconds)
{
sleep(seconds);
printf("%s\n", message);
}
int main()
{
printf("Hello, World!\n");
sleep_and_print("Goodbye!", 3);
return 0;
}
위의 예제 코드를 컴파일하여 실행 바이너리 파일을 생성한 후, ltrace를 사용하여 해당 프로그램을 추적한 결과는 다음과 같다.
$ gcc example.c -o example
$ ltrace ./example
__libc_start_main(0x4005ed, 1, 0x7ffd0ad07d68, 0x400690 <unfinished ...>
puts("Hello, World!"Hello, World!
) = 14
sleep(3) = 0
puts("Goodbye!"Goodbye!
) = 9
+++ exited (status 0) +++
출력 결과에서는 ltrace가 프로그램의 라이브러리 함수 호출을 추적하고, 호출된 함수와 해당 함수의 인자, 반환 값 등을 보여주고 있다. 위의 예제에서는 printf와 sleep 함수의 호출을 확인할 수 있다.
만약 제대로 trace를 하지 않고 있다면 “-no-pie” 옵션을 주어 컴파일 한다.
$ gcc -no-pie example.c -o example
참고
- https://man7.org/linux/man-pages/man1/ltrace.1.html
- https://ltrace.org/
- https://linux.die.net/man/1/ltrace