Depurar una aplicación C/C++ que requiere privilegios de root usando Eclipse CDT

¡Hola! Ha pasado mucho tiempo, ¡pero este blog sigue con vida! El problema fue que en todo este tiempo, todos los temas con los que me topé ya estaban documentados en detalle en la web. Es un placer informar que hoy encontré una buena razón para postear, ya que la información estaba en la web, pero desperdigada entre diversos sitios. Así que la recopilé aquí para referencia futura.

Volviendo al problema mencionado en el título: inicialmente, uno pensaría que para un escenario así, la única solución sería ejecutar Eclipse con privilegios administrativos, o sea como root. Sin embargo, más allá de los potenciales problemas de seguridad, hacer eso implicaría perder toda la configuración de Eclipse, porque la misma está asociada al usuario original, que no es root.

La mejor solución sería refactorizas la aplicación para que no requiera privilegios administrativos. A veces, eso puede hacerse incluso sin tocar el código fuente. Por ejemplo, puede que exista un grupo de usuarios con los permisos específicos que necesita la app, y sólo hay que agregar al usuario que corre la app a ese grupo. Si el grupo no existe, puede crearse; lo único complicado será configurar ese grupo con los permisos pertinentes. También se puede separar el código que requiere el acceso elevado del resto de la app, idealmente en otro binario. Si todos estos cambios no son prácticos, una solución de compromiso puede ser la siguiente:

  • Ejecutar Eclipse de manera normal, sin privilegios de root.
  • Ejecutar el debugger (depurador), típicamente gdb, con privilegios de root.

Configurar Eclipse para que corra gdb con privilegios de root es bastante directo. En primer lugar, hay que encontrar el control dropdown de Debug configurations en la interfaz gráfica de Eclipse. A continuación, seleccionar la configuración de Debug y clickear el ícono de engranaje para editarla. En mi máquina, dicho ícono se encuentra donde se ha señalado con un círculo rojo:

En este ejemplo, la configuración de debug que se desea editar es la llamada "scamper". También se puede llegar a esta pantalla desde el menú principal, vía Debug - Debug Configurations .... Una vez dentro del formulario, ir a la pestaña Debugger. Allí, asumiendo que se está utilizando Ubuntu u otra distro basada en Debian, sólo hay que agregar sudo antes de gdb, como se observa en la captura marcada con rojo:

Para otras distribuciones de Linux, será preciso reemplazar sudo con su equivalente. Sin embargo, esto no es suficiente, ya que por defecto sudo requiere que el usuario ingrese su contraseña. Cuando Eclipse intente correr gdb, dará un error diciendo que es necesario especificar la contraseña del usuario root. Para resolver esto, es posible configurar sudo para que no pida contraseña en el caso de ciertos comandos. Para hacer esto, en una terminal, ingresar el comando sudo visudo.

Esto abrirá el archivo de configuración de sudo para editarlo. Buscar la línea que contiene el texto #includedir /etc/sudoers.d cerca del final, y debajo de la misma, agregar una línea para el binario de gdb, y otra para la aplicación a depurar. En mi caso, el contenido del archivo quedó así, con el texto agregado resaltado con rojo:

Será necesario reemplazar "dario" en ambas líneas con el nombre del usuario no root a utilizar. Además, gdb puede estar instalado en otra ubicación. Es posible revisar esto último corriendo which gdb en la terminal. La ubicación de la app a depurar también será otra, por lo que habrá que editarla pertinentemente. Luego de guardar los cambios, para que entren en efecto, será necesario:

  • Reiniciar Ubuntu O cerrar sesión y abrirla de nuevo O correr sudo service sudo restart en una terminal. Yo reinicié Ubuntu.
  • Reiniciar Eclipse.

Como se dijo antes, esto no es lo mejor en términos de seguridad, pero logra su cometido. ¡Feliz depuración!

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x