Blog do Eduardo Costa Meu blog pessoal

31Jul/080

Depurar execução de programas Linux sem o GDB

Alguma vez já precisou configurar um programa usando bibliotecas externas? Por exemplo, o IBM Websphere Broker precisa que configuremos um arquivo ".odbcini" (definido em uma variável $ODBCINI) que apontam para os SOs dos provedores ODBC (tipo o UKora823.so).

Após um upgrade feito pela consultoria, o broker parou de iniciar. Sem log nem nada, não tinha como avaliar o que ocorria. Então, usando meus conhecimentos arcanos sobre Linux, usei o seguinte comando:

( LD_DEBUG=libs mqsistart BROKER ) 2>&1 | less

Na hora, consegui um log de como o Linux carrega as bibliotecas, e, de brinde, achei o seguinte no log gerado:

calling init: /opt/ibm/mqsi/6.1/merant/lib/UKor823.so
/opt/ibm/mqsi/6.1/merant/lib/UKor823.so: error: symbol lookup error:
undefined symbol: SQLGetConnectAttr (fatal)

Junto com muitas outras linhas similares. Bastou usar o GREP para descobrir que o arquivo libsqora.so.10.1 não estava no LD_LIBRARY_PATH. Adicionando-o, funcionou.

Agora, uma explicação sobre o comando mágico. Ele pode ser dividido assim:

1: (
2:   LD_DEBUG=libs mqsistart BROKER
3: )
4: 2>&1
5: | less

A linha 2 é a principal. Tem o comando que quero executar ("mqsistart BROKER") e um extra ("LD_DEBUG=libs") que informa ao LD do linux para emitir ao STDERR o que ele está fazendo com relação às libs. Usando "LD_DEBUG=help", você recebe uma lista de opções que podem ser usadas. Para quem não sabe, é possível passar variáveis de ambiente extra, no Linux, usando essa sintaxe. Outro exemplo:

ORACLE_HOME=/xpto sqlplus

Assim, você pode executar o "sqlplus" com outra instalação do Oracle.

Voltando ao comando arcano, se você executar apenas a linha 2, vai receber quilômetros de log. Claro que você vai querer paginar, então, logo pensa na linha 5, para redirecionar a saída ao comando de paginação "less". Entretanto, o LD_DEBUG emite no STDERR da aplicação, logo, precisa usar a linha 4 para redirecionar o STDERR para o STDOUT (que será enviado, via pipe, ao less).

Só que, sem as linhas 1 e 3, você estará redirecionando a saída do mqsistart, e não do LD_DEBUG. Os parênteses agrupam um ou mais comandos em um "comando" só, permitindo que o STDERR do LD_DEBUG vá para o less.

28Jul/085

Razões para odiar Zope/Plone

Desde meu primeiro contato com o Zope/Plone que eu senti que havia algo errado com o sujeito. Descobri que eu estava certo quando fiz um curso no meu emprego anterior. "Medonho" é pouco para descrever a interface administrativa.

Eu poderia gerar quilômetros de posts descrevendo os problemas, mas acho que imagens valem mais do que palavras.

Injeção no Zope/Plone dos outros é refresco

Veja que maravilha pode ser injetada (e fotografada) na tela de comentários. Não é um bug nem uma invasão. É somente um recurso muito útil para fazer a festa no blog de seus amigos (e de seus inimigos). Podemos até chamar de "undocumented feature".

Pois é... Injeção no Zope/Plone dos outros é refresco...