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
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:
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
:
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:
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 -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:
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.