ltracing bibliotecas compartilhadas, como?

6

Eu gostaria de rastrear as chamadas de função para uma biblioteca específica, chamá-lo de libfoo. Infelizmente a documentação que encontrei é escassa, então tenho muitas perguntas.

Na documentação do libfoo, ele lista as chamadas foo_a, foo_b, foo_c .. como chamadas api. Em uma DLL do Windows, gerar uma lista de chamadas como essa é fácil, cada chamada externa deve ser declarada assim (dllexport (DLL) ou algo parecido), um script simples extrairia todos os símbolos exportados. Como eu poderia criar essa lista para objetos compartilhados do Linux?

Depois de gerar essa lista, como faço para usá-la com o ltrace para gerar um rastreamento das chamadas usando um determinado programa. Também como expandir os argumentos da string (C) nessas chamadas?

    
por Mouse.The.Lucky.Dog 16.04.2015 / 18:01

1 resposta

1

Existem algumas ferramentas que você pode usar para fazer isso; o que estará imediatamente disponível é perf .

Digamos que eu queira ver em tempo real o que está acontecendo com o processo do firefox; Eu poderia fazer perf top -p <pidof firefox> ; você verá a saída como:

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

Você poderia então usar ? para ver o que você pode fazer na interface; você pode aumentar o zoom em um símbolo usando d . Você pode procurar detalhes de um mapa de um símbolo para ver as chamadas exatas de um processo.

Você provavelmente deseja agregar dados; você pode usar perf record para fazer isso em vez de perf top .

Existem outras ferramentas que você pode usar, como SystemTap ou um depurador real.

    
por 09.07.2015 / 19:30

Tags