Tutorial sobre Desarrollo con herramientas GNU | ||||||||||||||||||
Este tutorial pretende explicar cómo desarrollar software usando las
herramientas de GNU en lenguajes tales como
C/C++ y/o objetive C. Se asume que el lector tiene experiencia en dichos
lenguajes de programación.
IDEs / Entornos de desarrollo
Hoy en día existen alguno IDEs comerciales o libres pero no es mi
intención explicarlos. Las herramientas descriptas en este tutorial son de
línea de comando. Para editar la fuentes de un programa se puede uar
cualquier editor de texto, no obstante algunos editores tienen
características interesantes para los programadores:
El más rápido y simple; para hacer un "save & quit" basta presionar CTRL+D
vi tiene soporte para sintaxis "highlight" aunque puede ser difícil de
usar para quien no está acostumbrado.
Emacs es enorme, lento y tiene millones de funciones que no nunca serán
usadas. Es totalmente configurable a través de un tipo de LISP donde se puede
hacer de todo, desde redefinir teclas hasta nuevos modos de sintaxis
highlight. La funcionalidad básica es relativamente fácil de usar, pero el
resto...
Pico es de los editores más fáciles de utilizar, no tiene sintaxis
highlight pero es bien simple.
Un poco parecido a emacs, tiene soporte para sintaxis higlight pero no es
lento ni grande como emacs (es el que yo prefiero)
Dicen que también es parecido a emacs pero nunca lo usé.
Etc, etc, etc. Existen decenas de editores de texto pero lo que están en
la lista son los más conocidos (por mí).
gcc - El compilador C
El gcc es el compilador GNU con soporte para los lenguajes C, C++,
objective C, Fortran y posiblemente otros. GCC asumirá cuál es el lenguaje
usado por el código fuente según la extensión del archivo. Las siguientes
extensiones son válidas:
Para compilar un archivo en C basta usar el siguiente comando:
gcc programa.c -o programa
Donde programa.c es el archivo que contiene el código fuente y programa es
el archivo ejecutable a ser generado.
Se puede especificar más de un archivo fuente al mismo tiempo. Ejemplo:
gcc archivo1.c archivo2.c archivo3.c -o programao
Algunas opciones útiles de línea de comando:
Para generar un ejecutable a partir de un archivo1.o y archivo2.o basta lo
siguiente:
gcc arquivo1.o arquivo2.o -o programao
gdb depurador
Cuando un programa realiza una operación ilegal, como dividir por cero,
ejecución de una instrucción ilegal o acceso a un área de memoria no
permitida, este programa será terminado con una senial del tipo SIGSEGV y se
generará un archivo core, es lo que sucede cuando uno ve:
Segmentation fault (core dumped)
Los archivos core contienen una imagen de la memoria del proceso generada
en el momento en que dicho programa ejecutó la operación ilegal. Para ver lo
que sucedió se puede utilizar GDB (GNU debugger) para analizar cuál fue esa
operación ilegal y sus motivos. Es neceario que el programa haya sido
compilado con la opción -g para que gdb pueda mostrar información.
gdb programa core
Con esta instrucción gdb cargará el programa con el archivo core el en
directorio actual.
Dado el siguiente programa:
#include <stdlib.h>
char *foo(char *str)
strcpy(p, str);
int main(int argc, char **argv)
Compilado de la siguiente forma:
Y ejecutado como:
% ./hello
Ejecutamos gdb: (nota: donde se lee sparc-sun-etc, leáse i686-gnu-linux-etc)
% gdb hello core
Para hacer un backtrace (ver el contenido de la pila de ejecución) se usa
el comando bt:
(gdb) bt
La primera línea del backtrace dice:
#0 0xef723d34 in strcpy () from /usr/lib/libc.so.1
Y lo de la segunda:
#1 0x106c4 in foo (str=0x11288 "Hello, World") at hello.c:9
Continuando el análisis, vimos que la función en donde ocurrió la operación
ilegal fue strcpy(), o sea, una función del sistema. Suponiendo que el
sistema esté libre de bugs tan estúpidos que un programa tan simple como este
pueda encontrar, deducimos que la culpa es de quien llamó a strcpy(), o sea,
foo()
Para cambiar el contexto de gdb al contexto de la función foo(), se usa el
comando frame:
La función en donde se manifiesta el problema es strcpy() que se supone
libre de problemas en sí misma. Entonces es probable que el problema se
encuentre en lo parámetros pasados a ella:
Aparentemente, el valor de str no tiene ningún error pero el de "p" es una
dirección nula, que es la causa del problema. ahora para ver las fuentes
donde esa función fue definida se usa el comando list
El comando list lista algunas líneas del programa en la función que está
causando problemas. Para obtener más información sobre ella, use 'help list'.
Ahora ya se está en condiciones de reparar el programa.
Otros comandos útiles:
Make
Make facilita bastante el mantenimiento de un programa con un tamanio
razonable (más de 2 o 3 archivos fuente). Después de definir algunas reglas
de administración basta tipear make para tener el programa compilado en lugar
de tipear toda una línea de comando gcc.
Archivo en donde se debe colocar las reglas de compilación para un
programa es Makefile
Nota: deben utilizarse TABs en lugar de espacios en blanco.
Makefile puede ser adaptado para otros programas, sólo basta
cambiar la lista de archivos fuente, objetos, nombre del programa y alguna
flag o biblioteca que se precise.
Algunos includes y bibliotecas útiles.
|
Trademarks are owned by their owners.
Although the information given in this document is believed to be correct, the author will accept no liability for the content of this document. Use the tips and examples given herein at your own risk.
Copyright © 1999 by Brocoli. This document may be distributed only subject to the terms and conditions set forth in the LDP license.