ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ltrace 도구
    2011. 6. 15. comments


    ltrace명령어는 프로그램가 받은 시그널과 동적 라이브러리 호출에 대하여 trace가능한 도구이다.

    strace와 마찬가지로, 디버깅의 목적프로그램의 동작방식의 이해를 위한 도구로 사용된다.

    ※ 비슷한 명령어로 strace가 있다.. 비슷하지만 trace하려는 내용이 서로 다르다.
        strace는 시스템콜과 시그널을 trace하는 도구이며, ltrace는 동적라이브러리(유저레벨)와 시그널을 trace한다.

    2011/06/12 - [IT Dictionary/Linux] - [Tool] strace


    man 명령어를 통해 ltrace에 대해 알아보도록 하자.

    morenice@ubuntu:~$ man ltrace

    NAME
           ltrace - A library call tracer
    
    SYNOPSIS
           ltrace  [-CfhiLrStttV] [-a column] [-A maxelts] [-D level] [-e expr] [-l filename] [-n nr] [-o file‐
           name] [-p pid] ...  [-s  strsize]  [-u  username]  [-X  extern]  [-x  extern]  ...  [--align=column]
           [--debug=level] [--demangle] [--help] [--indent=nr] [--library=filename] [--output=filename] [--ver‐
           sion] [command [arg ...]]
    
    DESCRIPTION
           ltrace is a program that simply runs the specified  command  until  it  exits.   It  intercepts  and
           records the dynamic library calls which are called by the executed process and the signals which are
           received by that process.  It can also intercept and print the system calls executed by the program.
    
           Its use is very similar to strace(1).
    
    OPTIONS
           -a, --align column
                  Align return values in a specific column (default column is 5/8 of screen width).
    
           -A maxelts
                  Maximum number of array elements to print  before  suppressing  the  rest  with  an  ellipsis
                  ("...")
    
           -c     Count time and calls for each library call and report a summary on program exit.
    
           -C, --demangle
                  Decode (demangle) low-level symbol names into user-level names.  Besides removing any initial
                  underscore prefix used by the system, this makes C++ function names readable.
    
    ...
    ...
    




     간단한 코드를 작성하고 컴파일한 바이너리를 ltrace로 돌려서 어떤 결과를 보여주는 확인해보면...

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char* argv[])
    {
      printf("hello ltrace test program\n");
    
      char temp[256] = {0};
      if( argc >= 2 )
      {
        memcpy( temp, argv[1], 255 );
      }
    
      printf("input data(%s) datalen(%d)\n", temp, strlen(temp) );
    
      return 0;
    }
    

     

    위의 코드는 전달받은 첫번재 인자를 새로운 메모리 공간에 copy하고 길이를 함께 출력해주는 소스코드이다.
    memcpy랑 strlen 함수 호출에 대해서 확인을 하기 위하여 간단하게 만든 것이다.
    빌드한 바이너리명은 test_ltrace이다. 일단 실행을 해보자.

    morenice@ubuntu:~$ ltrace ./test_ltrace 123
    
    __libc_start_main(0x8048514, 2, 0xbf9d1944, 0x80485d0, 0x8048630 
    puts("hello ltrace test program"hello ltrace test program
    )                                  = 26
    memcpy(0xbf9d177c, "123", 255)                                     = 0xbf9d177c
    strlen("123")                                                      = 3
    printf("input data(%s) datalen(%d)\n", "123", 3input data(123) datalen(3)
    )                   = 27
    +++ exited (status 0) +++
    



    결과를 보면 memcpy, strlen, printf 에 대해서 출력됨을 알 수 있다.

    프로그램이 오류가 발생할 때  ltrace를 통하여 실행하여 종료된 시점의 호출된 function이나 method를 기반으로  trace 함으로써, 오류의 원인을 찾는데 도움이 될 것이다.

    마지막으로 실행중인 프로그램에  옵션(-p) 을 통하여 attach 시킬수도 있다.

    아래는 apache 프로세스의 pid를 확인하고 attach 한 결과입니다.

    morenice@ubuntu:~$ ps -ef | grep apache
    root       865     1  0 19:25 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data   875   865  0 19:25 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data   876   865  0 19:25 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data   878   865  0 19:25 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data   880   865  0 19:25 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data   881   865  0 19:25 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data  1570   865  0 21:35 ?        00:00:00 /usr/sbin/apache2 -k start
    www-data  1571   865  0 21:36 ?        00:00:00 /usr/sbin/apache2 -k start
    morenice  1619  1097  0 21:43 pts/0    00:00:00 grep --color=auto apache
    
    morenice@ubuntu:~$ sudo ltrace -p 865
    



    음...... 음.... 뭔가 나올줄 알았는데 아무런 결과도 안나온다.. ^^;  시그널을 대기하고 있는것 같다. 여튼 ltrace 또한 디버깅을 도와주는 도구이다.
    시스템에 문제가 생기거나, 프로세스가 갑자기 죽거나 할 때 로그 기록 확인과 동시에 이런 도구들을 통하여 문제 원인을 빠르게 파악하는데 도움이 되었으면 한다.


    반응형

    댓글

Designed by Tistory.