– Este sí que es un caso misterioso.  ¿Qué cree usted que hay detrás de esto?

– No poseo todavía datos. Constituye un craso error el teorizar sin poseer datos. Uno empieza de manera insensible a retorcer los hechos para acomodarlos a sus hipótesis, en vez de acomodar las hipótesis a los hechos.

Sherlock Holmes al Dr. Watson en Un escándalo en BohemiaSir Arthur Conan Doyle

En días pasados, en varios foros linuxeros que visito con regularidad (incluso dentro de algunos grupos de Google+ y Facebook), he visto varios mensajes donde solicitan apoyo con diferentes aplicaciones con un denominador común:

Al dar clic en el icono de la aplicación […] no abre nada y no manda mensaje de error, me pueden ayudar?

Después se molestan porque varios usuarios les contestan con el clásico RTFM:

RTFM

Obviamente, la comunidad del Software Libre ha prosperado gracias al apoyo incesante entre sus miembros, ávidos por compartir el conocimiento… pero vamos!! Al menos hay que demostrar un mínimo esfuerzo de haber realizado una investigación acerca de la solución.

Siempre he creído que algo que nos caracteriza, es la búsqueda incesante del saber como funcionan las cosas.

Cada uno tiene su propio método de analizar cuando se presentan fallas, en este post quiero compartirles el mío:

NOTA: Antes que nada, busco en internet el error tal cual me aparece en la consola, log, etc; ya sea en Google, en la base de conocimientos de Red Hat, o en algún foro especializado, además de los sitios que en cada post recomiendo (nixCraft, The Geek Stuff, HowtoForge y systemadmin.es) y los que pueden encontrar en la sección derecha del blog.

1. Checar el mensaje de error en la terminal

Básico. Al ejecutar cualquier programa en Linux desde la terminal, nos mostrará si corrió bien, en caso contrario, tendremos un indicio de lo que falló:

term

En este ejemplo, al ejecutar spotify nos indica que no encuentra una librería en particular, la cual podríamos buscar con yum:

[root@hobbiton ~]# yum provides libQtGui.so.4
Loaded plugins: langpacks, refresh-packagekit
updates/20/x86_64/metalink | 14 kB 00:00:00 
1:qt-x11-4.8.6-10.fc20.i686 : Qt GUI-related libraries
Repo : updates
Matched from:
Provides : libQtGui.so.4

[root@hobbiton ~]#

Después de instalar el paquete, volvemos a ejecutar el launcher de la aplicación:

[root@hobbiton ~]# spotify 
/usr/local/lib/spotify-client/spotify: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
[root@hobbiton ~]#

Esto puede llegar a ser un proceso muy largo de esta manera, entonces,  utilizaremos un comando que nos ayudara a validar que el binario cuente con todas las dependencias necesarias:

2. ldd (list dynamic dependencies)

Con esta herramienta podemos verificar si nuestro binario en cuestión cuenta con todas las dependencias necesarias para ejecutarse:

[root@hobbiton ~]# ldd /usr/local/lib/spotify-client/spotify | grep "not found"
/usr/local/lib/spotify-client/spotify: /usr/local/lib/spotify-client/libssl.so.1.0.0: version `OPENSSL_1.0.0' not found (required by /usr/local/lib/spotify-client/spotify)
/usr/local/lib/spotify-client/spotify: /usr/local/lib/spotify-client/libcrypto.so.1.0.0: version `OPENSSL_1.0.0' not found (required by /usr/local/lib/spotify-client/spotify)
 libXss.so.1 => not found
[root@hobbiton ~]#

Ya con esto podríamos buscar e instalar todos los paquetes que cumplan con las dependencias necesarias y ejecutar nuestro binario:

spotify-OK

Si la falla implica algún servicio de red, verificamos si el puerto en cuestión esta siendo utilizado y que proceso lo utiliza:

3. netstat (network statistics)

[root@hobbiton ~]# netstat -anp | grep spotify
tcp 0 0   127.0.0.1:4371          0.0.0.0:*         LISTEN      2821/spotify 
tcp 0 0   0.0.0.0:57621           0.0.0.0:*         LISTEN      2821/spotify 
tcp 0 0   127.0.0.1:4381          0.0.0.0:*         LISTEN      2821/spotify 
tcp 0 0   127.0.0.1:8099          0.0.0.0:*         LISTEN      2821/spotify 
tcp 0 0   192.168.122.122:53395   178.236.4.227:443 ESTABLISHED 2821/spotify 
tcp 0 0   192.168.122.122:49229   54.230.4.100:443  ESTABLISHED 2821/spotify 
tcp 0 0   192.168.122.122:60232   50.18.187.163:443 ESTABLISHED 2821/spotify 
tcp 0 0   192.168.122.122:34614   54.230.6.66:443   ESTABLISHED 2821/spotify 
tcp 0 200 192.168.122.122:54652   54.230.5.149:80   ESTABLISHED 2821/spotify 
tcp 0 0   192.168.122.122:54651   54.230.5.149:80   ESTABLISHED 2821/spotify 
udp 0 0   0.0.0.0:57621           0.0.0.0:*                     2821/spotify 
[root@hobbiton ~]#

Esta revisión es de forma interna, dentro del equipo que esta ejecutando el servicio o la aplicación. Si el servicio/aplicación, tuviera que publicarse, tendríamos que revisarlo de forma externa:

4. nmap (network mapper)

Existen muchas combinaciones y ejemplos de lo poderosa que puede llegar a ser esta herramienta, para cuestiones rápidas, la ejecutamos como:

[root@isengard ~]# nmap -PN 192.168.122.122

Starting Nmap 6.45 ( http://nmap.org ) at 2014-08-02 16:38 CDT
Nmap scan report for 192.168.122.122
Host is up (0.00023s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
22/tcp open ssh
MAC Address: 52:54:00:DB:A9:AA (QEMU Virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 7.62 seconds
[root@isengard ~]#

Si requerimos conocer si algún binario esta en uso, usamos la herramienta:

5. lsof (list open files)

[root@hobbiton ~]# lsof /usr/local/lib/spotify-client/spotify 
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
 Output information may be incomplete.
COMMAND PID  USER          FD  TYPE DEVICE SIZE/OFF NODE   NAME
spotify 2821 alex.callejas txt REG  253,0  28871528 405137 /usr/local/lib/spotify-client/spotify
spotify 2832 alex.callejas txt REG  253,0  28871528 405137 /usr/local/lib/spotify-client/spotify
[root@hobbiton ~]#

Si requerimos de conocer el funcionamiento del binario, para identificar alguna falla, podemos utilizar:

6. strace (system call tracer)

[root@hobbiton ~]# strace ls

Como la herramienta hace una traza a las llamadas del sistema para poder ejecutar el binario, la salida es muy grande, si la quieren checar, den clic aquí.

También nos puede resultar provechoso el conocer el contenido del binario, para esto, usamos las herramientas:

7. strings

Este comando busca e imprime en pantalla las cadenas de texto que encuentra  embebidos dentro de los binarios:

[root@hobbiton ~]# strings /usr/bin/ls

8. hexdump

La salida de este comando imprime una representación visible de todos los bites de un archivo:

[root@hobbiton ~]# hexdump -C /usr/bin/ls

Con ayuda de estas herramientas podríamos encontrar cual es la fuente de falla de nuestra aplicación/servicio y poderla solucionar para que funcione correctamente.

Estas herramientas son las que considero mi navaja suiza, espero les sirvan…

swiss-army-knife-lnx