Cómo utilizar ltrace para rastrear llamadas a la biblioteca

Conteúdo

Bash Shell

Você está interessado em consertar aqueles bugs de biblioteca e bugs que você vê ao instalar um novo programa legal no Linux?? Confira este artigo que mostra como usar ltrace e fornece a ferramenta necessária para depurar chamadas de biblioteca.

Que e um Biblioteca?

A maioria das pessoas está familiarizada com .dll/.DLL registros (bibliotecas de links dinâmicos) no Windows. O Linux idêntico é um .so Arquivo, um objeto compartilhado, muitas vezes referido simplesmente como uma biblioteca.

Uma biblioteca pode ser usada por um aplicativo que permite que esse programa use funcionalidades externas ao seu código de programa.. Como um exemplo, um servidor da web pode querer usar uma biblioteca de E / Disco S escrito pelo fornecedor do sistema operacional ou outro terceiro. É uma forma de compartilhar bens e interesses comuns na maioria, se não em tudo, sistemas operacionais.

As bibliotecas podem ser carregadas dinamicamente em tempo de execução (quando o programa de chamada está começando, como um exemplo) ou eles podem ser compilados em um aplicativo de destino / trilhas. É por isso que, sempre carregará (sejam eles usados ​​ou não), como parte e enquanto o aplicativo que os compilou for iniciado / integrado.

Para obter mais informações sobre bibliotecas, suas dependências e ldd ferramenta, você pode querer ler sobre como trabalhar com dependências de objetos compartilhados no linux. a ldd é outra ferramenta útil para ter em qualquer caixa de ferramentas de usuário Linux mais avançada.

o que é empate?

Existem vários utilitários de rastreamento no Linux, como strace para rastrear chamadas e sinais do sistema e o traceroute para rastrear o roteamento da rede. a ltrace Utilitário / ferramenta rastreia todas as chamadas da biblioteca.

Se você leu nosso trabalho com dependências de objetos compartilhados (biblioteca) no artigo Linux (ligado acima), Você já viu como pode descobrir quais bibliotecas um binário específico está fadado a usar o ldd ferramenta. O propósito e a funcionalidade de ltrace é algo diferente; muito em linha com strace, a ltrace O comando rastreia todas as chamadas de biblioteca que um determinado programa faz durante a execução.

Igual a strace, podemos iniciar um programa abaixo (pense nisso como uma hierarquia) ltrace. Simplesmente especificamos o programa que ltrace deve começar como a primeira escolha para ltrace, e ltrace vai iniciar esse programa para nós e começar imediatamente (em um nível superior) para rastrear todas as chamadas para qualquer biblioteca (sistema operacional ou terceiros instalados).

Ele faz isso interceptando e gravando o dinâmico chamadas de biblioteca feitas pelo programa em execução. Ao mesmo tempo, ele rastreará qualquer sinal enviado para o programa em execução, muito idêntico a strace (e, se você desejar, esta funcionalidade pode ser desabilitada especificando o -b ou idêntico --no-signals opção a ltrace).

Observe que o termo dinâmico é de grande importância aqui; ltrace rastreará chamadas para externo bibliotecas (na forma de .so o .a registros), em outras palavras, bibliotecas não compiladas diretamente em um programa; dinâmico Bibliotecas. É por isso que, se você tiver um binário com bibliotecas estaticamente (compiladas), ltrace não será capaz de ver / rastrear essas chamadas internas.

Instalando empate

Instalando ltrace en la línea de comando con apt

Instalar empate em sua distribuição Linux baseada em Debian / Apt (como Ubuntu e Mint), execute o seguinte comando em seu terminal:

sudo apt install ltrace

Instalar empate em sua distribuição Linux baseada em RedHat / Yum (como RHEL, Centos e Fedora), execute o seguinte comando em seu terminal:

sudo yum install ltrace

Usando ltrace

Configuremos un pequeño entorno de prueba:

sudo apt install tar xz-utils
mkdir ~/workspace && cd ~/workspace
touch a b c

Aquí instalamos tar e xz instalando xz-utils (puedes usar sudo yum install tar xz em seu lugar, si está usando Centos / RHEL / Fedora). A continuación creamos un directorio ~/workspace y saltó a él. Posteriormente hicimos tres archivos vacíos usando el touch comando, a saber, registros a, b e c.

Comencemos comprimiendo nuestros tres archivos en un (alcatrão combinado y xz comprimido) archive.tar.xz Arquivo, mientras se ejecuta el mismo bajo ltrace, y observando el ltrace Produção:

Nuestro primer trazo de alquitrán

ltrace tar -hcf --xz archive.tar.xz *

Vemos apenas uma pequena quantidade de saída. Podemos ver que nosso programa terminou com sucesso (arquivo de arquivo foi criado), em outras palavras, status 0: um código de saída de 0 sempre significa sucesso no Linux (mesmo que o programa precise ter códigos de saída implementados corretamente).

Isso não é muito útil até agora. Motivo de alguns segundos sobre como tar operará aqui irá revelar rapidamente nossa próxima abordagem. O leitor ávido pode, ao mesmo tempo, ter entendido que o tar O comando chamaria internamente o xz comando. a --xz opção passada para o nosso tar linha de comando irá garantir que o xz O programa é usado para compressão.

O procedimento secundário (ou o terceiro na hierarquia geral) em outras palavras xz (hierarquia: ltrace > tar > xz) será iniciado por tar quando for necessário. Como tal, precisamos rastrear os processos filhos do programa em execução sob ltrace, em outras palavras tar. Podemos fazer isso especificando o seguinte (-f) opção a ltrace:

traço de alcatrão seguir (-f) para rastrear processos filhos

ltrace -f tar -hcf --xz archive.tar.xz *

Observe que é essencial especificar o -f opção diretamente atrás ltrace e não mais tarde na linha de comando após tar como um exemplo. A razão é que queremos especificar esta opção para ltrace e não para tar comando. Todas as alternativas depois tar comando são tar opções específicas enquanto -f é uma alternativa específica para ltrace.

O resultado é um pouco mais interessante. Ainda não vimos nenhuma chamada para a biblioteca (de jeito nenhum), mas pelo menos vemos que dois tópicos são bifurcados (Nota exec()) e que ambos os tópicos terminam com status 0. Prático e tudo de bom.

Então, ¿dónde están las llamadas de nuestra biblioteca? Comprobación tar e xz (los dos programas que utilizará el comando para crear el archivo de almacenamiento) com ldd, nos damos cuenta rápidamente de que la mayoría de las bibliotecas que usan ambos programas son bibliotecas del sistema:

Descubriendo más sobre las bibliotecas utilizadas por tar y xz usando el comando ldd

whereis tar
whereis xz
ldd /bin/tar
ldd /usr/bin/xz

É por isso que, debemos ir un paso más allá y habilitar el seguimiento de las llamadas a la biblioteca del sistema especificando el -S opção a ltrace. Esta opción se encuentra deshabilitada / apagada de forma predeterminada, dado que la salida se volvería un poco detallada, y es probable que se asuma que las bibliotecas del sistema son de forma general mucho más estables y, Como tal, no es necesario rastrearlas para comenzar. Vamos dar uma olhada.

ltrace -fS tar -hcf --xz archive.tar.xz * 

O, con fines de prueba:

ltrace -S nos permite ver las llamadas al sistema también

ltrace -fS tar -hcf --xz archive.tar.xz * 2>&1 | head -n10
ltrace -fS tar -hcf --xz archive.tar.xz * 2>&1 | tail -n10

Como el resultado fue sustancial, tivemos que capturar as primeiras e últimas dez linhas usando um head e tail comando. Para usar esses comandos, tivemos que redirecionar stderr para stdout usando o 2>&1 redirecionar como ltrace irá relatar por padrão sobre stderr. Se você estiver interessado em aprender mais sobre redirecionamento, Bash Automation and Scripting Basics (Papel 3).

Agora que adicionamos o -S opção, podemos ver todas as bibliotecas que são acessadas. Como um exemplo, Nós vemos /etc/ld.so.preload sendo acessado. A saída é sequencial (de cima para baixo), então, se houver outros eventos (fio ramificado, etc.) No meio, eles serão exibidos online no momento em que ocorrerem. Ao mesmo tempo, poderíamos adicionar o -t opção para saída baseada em tempo:

ltrace -t nos permite ver a saída cronometrada

Final

Neste artigo, apresentamos e discutimos o versátil ltrace programa, que é uma ótima ferramenta que torna possível rastrear todas as chamadas de biblioteca dinâmica que um determinado programa faz. Nós instalamos ltrace, configurar um ambiente de teste e executar alguns ltrace comandos com as alternativas mais utilizadas.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.