공유 라이브러리를 추적하는 방법은 무엇입니까?

공유 라이브러리를 추적하는 방법은 무엇입니까?

특정 라이브러리에 대한 함수 호출을 추적하고 싶습니다. libfoo라고 부르겠습니다. 불행하게도 이에 대한 문서를 거의 찾지 못했기 때문에 질문이 많습니다.

libfoo 문서에는 foo_a, foo_b, foo_c.. 호출이 API 호출로 나열되어 있습니다. Windows DLL에서는 이러한 호출 목록을 생성하기가 쉽습니다. 모든 외부 호출은 dllexport(DLL) 또는 이와 유사한 것으로 선언되어야 하며 간단한 스크립트는 내보낸 모든 기호를 추출합니다. Linux 공유 객체에 대한 목록을 어떻게 생성합니까?

이러한 목록이 생성되면 이를 ltrace와 함께 사용하여 특정 프로그램을 사용하여 이루어진 호출 추적을 생성하려면 어떻게 해야 합니까? 또한 이러한 호출에서 (C) 문자열 매개변수를 어떻게 확장합니까?

답변1

이를 수행하는 데 사용할 수 있는 도구가 있습니다. 바로 사용할 수 있는 도구입니다 perf.

Firefox 프로세스에서 실시간으로 무슨 일이 일어나고 있는지 보고 싶다고 가정해 보겠습니다. perf top -p <pidof firefox>다음과 같은 결과가 표시됩니다.

Samples: 802  of event 'cycles', Event count (approx.): 374901537                                                
Overhead  Shared Object                Symbol                                                                    
   1.29%  libpthread-2.21.so           [.] pthread_mutex_unlock
   1.12%  [kernel]                     [k] ksize
   0.84%  firefox                      [.] 0x0000000000012bcc
   0.71%  libpthread-2.21.so           [.] pthread_mutex_lock
   0.64%  [kernel]                     [k] flat_send_IPI_mask
   0.63%  firefox                      [.] 0x0000000000012bdd
   0.61%  libmozsqlite3.so             [.] 0x000000000000cfd0
   0.60%  [kernel]                     [k] page_fault
   0.60%  libxul.so                    [.] 0x000000000233fa58
   0.56%  [kernel]                     [k] nf_nat_ipv4_local_fn

그런 다음 ?확대 기호를 사용하여 인터페이스에서 수행할 수 있는 작업을 확인할 수 있습니다 d. 기호 맵의 세부 정보를 찾아 프로세스의 정확한 호출을 확인할 수 있습니다.

perf record사용할 수 있는 데이터를 집계하고 싶을 수도 있습니다 perf top.

SystemTap실제 디버거 와 같은 다른 도구를 사용할 수도 있습니다 .

관련 정보