Índice
Disponibilizo algumas dicas para as pessoas aprenderem programação no sistema Debian o suficiente para rastrear o código fonte do pacote. Aqui estão pacotes notáveis e pacotes de documentação correspondentes para programação.
Tabela 12.1. Lista de pacotes para ajudar a programar
pacote | popcon | tamanho | documentação |
---|---|---|---|
autoconf
|
V:41, I:282 | 1846 |
"info autoconf " disponibilizado por
autoconf-doc
|
automake
|
V:42, I:279 | 1830 |
"info automake " disponibilizado por
automake1.10-doc
|
bash
|
V:791, I:999 | 6469 |
"info bash " disponibilizado por
bash-doc
|
bison
|
V:9, I:103 | 2815 |
"info bison " disponibilizado por
bison-doc
|
cpp
|
V:319, I:770 | 42 |
"info cpp " disponibilizado por cpp-doc
|
ddd
|
V:0, I:10 | 4184 |
"info ddd " disponibilizado por ddd-doc
|
exuberant-ctags
|
V:5, I:37 | 341 | exuberant-ctags(1) |
flex
|
V:9, I:93 | 1279 |
"info flex " disponibilizado por
flex-doc
|
gawk
|
V:368, I:454 | 2558 |
"info gawk " disponibilizado por
gawk-doc
|
gcc
|
V:165, I:604 | 45 |
"info gcc " disponibilizado por gcc-doc
|
gdb
|
V:13, I:114 | 9789 |
"info gdb " disponibilizado por gdb-doc
|
gettext
|
V:48, I:312 | 5843 |
"info gettext " disponibilizado por
gettext-doc
|
gfortran
|
V:11, I:98 | 16 |
"info gfortran " disponibilizado por
gfortran-doc (Fortran 95)
|
fpc
|
I:3 | 121 | fpc(1)
e html por fp-docs (Pascal)
|
glade
|
V:0, I:8 | 1730 | ajuda disponibilizada via menu (UI Builder) |
libc6
|
V:935, I:999 | 12771 |
"info libc " disponibilizado por
glibc-doc e glibc-doc-reference
|
make
|
V:157, I:609 | 1592 |
"info make " disponibilizado por
make-doc
|
xutils-dev
|
V:1, I:12 | 1466 | imake(1), xmkmf(1), etc. |
mawk
|
V:372, I:997 | 242 | mawk(1) |
perl
|
V:610, I:992 | 705 | perl(1)
e páginas html disponibilizadas por perl-doc e
perl-doc-html
|
python
|
V:293, I:923 | 68 | python(1)
e páginas html disponibilizadas por python-doc |
tcl
|
V:31, I:414 | 22 | tcl(3)
e manuais detalhados disponibilizados pelo tcl-doc |
tk
|
V:30, I:406 | 22 | tk(3)
e manuais detalhados disponibilizados pelo tk-doc |
ruby
|
V:137, I:318 | 35 | ruby(1)
e a referência interactiva disponibilizada pelo ri |
vim
|
V:106, I:398 | 3231 |
help(F1) menu disponibilizado por vim-doc
|
susv2
|
I:0 | 16 | buscar "The Single UNIX Specifications v2" |
susv3
|
I:0 | 16 | buscar "The Single UNIX Specifications v3" |
Estão disponíveis referências online ao escrever "man
nome
" após instalar os pacotes manpages
e
manpages-dev
. As referências online ás ferramentas GNU
está disponíveis ao escrever "info nome_do_programa
" após
instalar os pacotes de documentação pertinentes. Poderá ter de incluir os
arquivos contrib
e non-free
adicionalmente ao arquivo main
pois algumas documentações
GFDL não são consideradas compatíveis com DFSG.
![]() |
Atenção |
---|---|
Não use " |
![]() |
Cuidado |
---|---|
Deve instalar os programas compilados directamente a partir da fonte em
" |
![]() |
Dica |
---|---|
Os Exemplos de código da criação de "Song 99 Bottles of Beer" devem dar-lhe uma boa ideia de praticamente todas as linguagens de programação. |
O script de shell é um ficheiro de texto com o bit de execução definido e contém os comandos no seguinte formato.
#!/bin/sh ... linhas de comando
A primeira linha especifica o interpretador shell que lê e executa o conteúdo deste ficheiro.
Ler scripts de shell é a melhor maneira de compreender como um sistema tipo Unix funciona. Aqui, Dou alguns apontamentos e lembranças para programação de shell. Veja "Erros de Shell" (http://www.greenend.org.uk/rjk/2001/04/shell.html) para aprender a partir de erros.
Ao contrário do modo interativo de shell (veja Secção 1.5, “O comando simples da shell” e Secção 1.6, “Processamento de texto estilo Unix”), os scripts de shell usam frequentemente parâmetros, condicionais e ciclos.
Muitos scripts de sistema podem ser interpretados por qualquer uma das
shells POSIX (veja Tabela 1.13, “Lista de programas da shell”). A shell predefinida do sistema é
"/bin/sh
" o qual é uma ligação simbólica para o programa
real.
bash(1)
para lenny
ou mais antigo
dash(1)
para squeeze
ou mais recente
Evite escrever um script de shell com bashisms ou zshisms para fazê-loportável entre todas as shells do POSIX. Pode verificar isto a usar o checkbashisms(1).
Tabela 12.2. Lista dos 'bashisms' típicos
Bom: POSIX | Evitar: 'bashism' |
---|---|
if [ "$foo" = "$bar" ] ; then …
|
if [ "$foo" == "$bar" ] ; then …
|
diff -u file.c.orig file.c
|
diff -u file.c{.orig,}
|
mkdir /foobar /foobaz
|
mkdir /foo{bar,baz}
|
funcname() { … }
|
function funcname() { … }
|
formato octal: "\377 "
|
formato hexadecimal: "\xff "
|
O comando "echo
" tem de ser usado com os seguintes
cuidados porque a implementação dele difere entre o integrado na shell e os
comandos externos.
Evite usar quaisquer opções de comando excepto "-n
".
Evite usar sequências de escape na cadeia porque o manuseamento dele varia.
![]() |
Nota |
---|---|
Apesar da opção " |
![]() |
Dica |
---|---|
Use o comando " |
Parâmetros de shell especiais são frequentemente usados no script shell.
Tabela 12.3. Lista de parâmetros da shell
parâmetro da shell | valor |
---|---|
$0
|
nome da shell ou script de shell |
$1
|
primeiro(1) argumento shell |
$9
|
nono(9) argumento shell |
$#
|
quantidade de parâmetros de posição |
"$*"
|
"$1 $2 $3 $4 … "
|
"$@"
|
"$1" "$2" "$3" "$4" …
|
$?
|
estado de saída do comando mais recente |
$$
|
PID deste script shell |
$!
|
PID da tarefa de fundo iniciada mais recentemente |
As expansões de parâmetro básicas a lembrar são as seguintes.
Tabela 12.4. Lista de expansões de parâmetros de shell
formato da expressão do parâmetro |
valor se var estiver definido
|
valor se var não estiver definido
|
---|---|---|
${var:-string}
|
"$var "
|
"string "
|
${var:+string}
|
"string "
|
"null "
|
${var:=string}
|
"$var "
|
"string " (e corra "var=string ")
|
${var:?string}
|
"$var "
|
echo "string " para stderr (e termina com erro)
|
Aqui, o símbolo ortográfico dois pontos ":
" em todas
estas operações é na realidade opcional.
com ":
" = teste de
operador para existe e não nulo
sem ":
" = teste de
operador para apenas existe
Tabela 12.5. Lista de substituições de parâmetros de shell chave
formato de substituição de parâmetro | resultado |
---|---|
${var%suffix}
|
remover o modelo de sufixo menor |
${var%%suffix}
|
remover o modelo de sufixo maior |
${var#prefix}
|
remover o modelo de prefixo menor |
${var##prefix}
|
remover o modelo de prefixo maior |
Cada comando retorna um estado de saída que pode ser usado para expressões condicionais.
Sucesso: 0 ("True")
Erro: não 0 ("False")
![]() |
Nota |
---|---|
"0" no contexto condicional da shell significa "Verdadeiro", enquanto "0" no contexto condicional de C significa "Falso". |
![]() |
Nota |
---|---|
" |
Os idiomas condicionais básicos a lembrar são os seguintes.
"<comando> &&
<se_sucesso_corre_também_este_comando> || true
"
"<comando> ||
<se_não_sucesso_corre_também_este_comando> || true
"
Um fragmento de script de multi-linhas como o seguinte
if [ <expressão_condicional> ]; then <se_sucesso_corre_este-comando> else <se_não_sucesso_corre_este_comando> fi
Aqui o "|| true
" final foi necessário para assegurar que
estes script de shell não termina acidentalmente nesta linha quando a shell
é invocada com a flag "-e
".
Tabela 12.6. Lista de operadores de comparação de ficheiros na expressão condicional
equação | condição para retornar o verdadeiro lógico |
---|---|
-e <ficheiro>
|
<ficheiro> existe |
-d <ficheiro>
|
<ficheiro> existe e é um diretório |
-f <ficheiro>
|
<ficheiro> existe e é um ficheiro normal |
-w <ficheiro>
|
<ficheiro> existe e pode-se escrever nele |
-x <ficheiro>
|
<ficheiro> existe e é executável |
<ficheiro1> -nt <ficheiro2>
|
<ficheiro1> é mais recente que <ficheiro2> (modificação) |
<ficheiro1> -ot <ficheiro2>
|
<ficheiro1> é mais antigo que <ficheiro2> (modificação) |
<ficheiro1> -ef <ficheiro2>
|
<ficheiro1> e <ficheiro2> estão no mesmo aparelho e no mesmo número de inode |
Tabela 12.7. Lista de operadores de comparação de strings na expressão condicional
equação | condição para retornar o verdadeiro lógico |
---|---|
-z <str>
|
o comprimento de <str> é zero |
-n <str>
|
o comprimento de <str> não é zero |
<str1> = <str2>
|
<str1> and <str2> são iguais |
<str1> != <str2>
|
<str1> and <str2> não são iguais |
<str1> < <str2>
|
<str1> ordena antes de <str2> (dependente do locale) |
<str1> > <str2>
|
<str1> ordena após <str2> (dependente do locale) |
Os operadores de comparação Aritmética de
inteiros na expressão regular são "-eq
",
"-ne
", "-lt
",
"-le
", "-gt
" e
"-ge
".
Existem vários idiomas de ciclo para usar na shell POSIX.
"for x in foo1 foo2 … ; do command ; done
" faz ciclos ao
atribuir itens da lista "foo1 foo2 …
" à variável
"x
" e a executar o "comando
".
"while condition ; do command ; done
" repete o
"comando
" enquanto a "condição
" for
verdadeira.
"until condition ; do command ; done
" repete o
"comando
" enquanto a "condição
" não
for verdadeira.
"break
" permite sair do ciclo.
"continue
" permite resumir a próxima interacção do ciclo.
![]() |
Dica |
---|---|
A interacção numérica tipo linguagem C pode ser
realizada a usar
seq(1)
como o gerador de " |
A shell processa um script rudemente como a seguinte sequência.
A shell lê uma linha.
A shell agrupa uma parte de uma linha como um
testemunho se estiver dentro de "…"
ou
'…'
.
A shell divide a outra parte de uma linha em testemunhos como o seguinte.
Espaços em branco: <espaço> <tab>
<nova-linha>
Meta-caracteres: < > | ; & ( )
A shell verifica a palavra reservada para
cada testemunho para ajustar o comportamento dele se não dentro de
"…"
ou '…'
.
palavra reservada: if then elif
else fi for in while unless do done case esac
A shell expande o alias se não estiver
dentro de "…"
ou '…'
.
A shell expande o til se não dentro de
"…"
ou '…'
.
"~
" → diretório home do utilizador atual
"~<utilizador>
" → diretório home do
<utilizador>
A shell expande o parâmetro ao seu valor
se não dentro de '…'
.
parâmetro:
"$PARAMETER
" ou "${PARAMETER}
"
A shell expande a substituição do comando
se não dentro de '…'
.
"$( comando )
" → o resultado do
"comando
"
"` comando `
" → o resultado do
"comando
"
A shell expande o glob nome_de-caminho
aos nomes de ficheiros correspondentes se não dentro de
"…"
ou '…'
.
*
→ quaisquer caracteres
?
→ um caractere
[…]
→ qualquer um dos caracteres em
"…
"
A shell procura o comando a partir do seguinte e executa-o.
definição de função
comando builtin
ficheiro executável em
"$PATH
"
A shell vai à próxima linha e repete este processo outra vez a partir do topo desta sequência.
Citações singulares (') dentro de aspas não têm efeito.
Executar "set -x
" na shell ou invocar a shell com a opção
"-x
" faz a shell escrever todos os comandos
executados. Isto é muito útil para depuração.
De modo a tornar o seu programa de shell o mais portável possível entre os sistemas Debian, é uma boa ideia limitar os programas utilitários àqueles disponibilizados pelos pacotes essenciais.
"aptitude search ~E
" lista os pacotes essenciais.
"dpkg -L <nome_do-pacote> |grep '/man/man.*/'
"
lista as manpages (manuais) para comandos oferecidos pelo pacote
<nome_do_pacote>
.
Tabela 12.8. Lista de pacotes que contém programas utilitários pequenos para scripts de shell
pacote | popcon | tamanho | descrição |
---|---|---|---|
coreutils
|
V:891, I:999 | 17478 | utilitários de núcleo GNU |
debianutils
|
V:925, I:999 | 230 | utilitários variados específicos do Debian |
bsdmainutils
|
V:60, I:996 | 26 | colecção de mais utilitários do FreeBSD |
bsdutils
|
V:673, I:999 | 393 | utilitários básicos do 4.4BSD-Lite |
moreutils
|
V:11, I:35 | 237 | utilitários Unix adicionais |
![]() |
Dica |
---|---|
Apesar de |
A interface de utilizador de um programa simples de shell pode ser melhorada
a partir de interacção aborrecida pelos comandos echo
e
read
para uma mais interactiva ao usar um dos chamados
programas de diálogo, etc.
Tabela 12.9. Lista de programas de interface de utilizador
pacote | popcon | tamanho | descrição |
---|---|---|---|
x11-utils
|
V:180, I:599 | 712 | xmessage(1): mostra uma mensagem ou questão numa janela (X) |
whiptail
|
V:87, I:995 | 71 | mostra caixas de diálogo amigas do utilizador a partir de scripts de shell (newt) |
dialog
|
V:15, I:123 | 1222 | mostra caixas de diálogo amigas do utilizador a partir de scripts de shell (ncurses) |
zenity
|
V:87, I:409 | 384 | mostra caixas de diálogo gráficas a partir de scripts de shell (gtk2.0) |
ssft
|
V:0, I:0 | 75 | Ferramenta Frontend de Scripts de Shell (wrapper para o zenity, kdialog e dialog com o gettext) |
gettext
|
V:48, I:312 | 5843 |
"/usr/bin/gettext.sh ": traduz mensagem
|
Aqui está um script simples que cria uma imagem ISO com dados RS02 fornecidos por dvdisaster(1).
#!/bin/sh -e # gmkrs02 : Copyright (C) 2007 Osamu Aoki <osamu@debian.org>, Public Domain #set -x error_exit() { echo "$1" >&2 exit 1 } # Initialize variables DATA_ISO="$HOME/Desktop/iso-$$.img" LABEL=$(date +%Y%m%d-%H%M%S-%Z) if [ $# != 0 ] && [ -d "$1" ]; then DATA_SRC="$1" else # Select diretory for creating ISO image from folder on desktop DATA_SRC=$(zenity --file-selection --diretory \ --title="Select the diretory tree root to create ISO image") \ || error_exit "Exit on diretory selection" fi # Check size of archive xterm -T "Check size $DATA_SRC" -e du -s $DATA_SRC/* SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024)) if [ $SIZE -le 520 ] ; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="The data size is good for CD backup:\\n $SIZE MB" elif [ $SIZE -le 3500 ]; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="The data size is good for DVD backup :\\n $SIZE MB" else zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="The data size is too big to backup : $SIZE MB" error_exit "The data size is too big to backup :\\n $SIZE MB" fi # only xterm is sure to have working -e option # Create raw ISO image rm -f "$DATA_ISO" || true xterm -T "genisoimage $DATA_ISO" \ -e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC" # Create RS02 supplemental redundancy xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="ISO/RS02 data ($SIZE MB) \\n created at: $DATA_ISO" # EOF
Pode desejar criar um lançador no ambiente de trabalho com um conjunto de
comandos algo como "/usr/local/bin/gmkrs02 %d
".
O Make é um utilitário para manutenção de grupos
de programas Após a execução do
make(1),
o make
lê o ficheiro de regras,
"Makefile
" e atualiza um alvo se depender de ficheiros
pré-requisitados que foram modificados desde que o alvo foi modificado por
último, ou se o alvo não existir. A execução destas atualizações pode
ocorrer concorrentemente.
A regra de sintaxe do ficheiro é a seguinte.
target: [ pré-requisitos ... ] [TAB] comando1 [TAB] -comando2 # ignora erros [TAB] @comando3 # suprime os ecos
Aqui "[TAB]
" é um código TAB. Cada linha é interpretada
pela shell após fazer a substituição da variável. Use
"$$
" para inserir "$
" para valores de
ambiente para um script de shell.
Podem ser escritas regras implícitas para o destino e pré-requisitos, por exemplo, com o seguinte.
%.o: %.c header.h
Aqui, o alvo contém o caractere "%
" (exatamente um
deles). O "%
" pode corresponder a qualquer substring não
vazia nos nomes de ficheiros do próprio alvo. Os pré-requisitos usam
igualmente "%
" para mostrar como os seus nomes estão
relacionados ao próprio nome do alvo.
Tabela 12.10. Lista de variáveis automáticas do make
variável automática | valor |
---|---|
$@
|
alvo |
$<
|
primeiro pré-requisito |
$?
|
todos os novos pré-requisitos |
$^
|
todos os pré-requisitos |
$*
|
"% " estaminal correspondente no modelo de destino
|
Tabela 12.11. Lista de expansões da variável do make
expansão da variável | descrição |
---|---|
foo1 := bar
|
expansão de uma vez |
foo2 = bar
|
expansão recursiva |
foo3 += bar
|
acrescentar |
Corra "make -p -f/dev/null
" para ver as regras internas
automáticas.
Pode configurar um ambiente apropriado para compilar programas escritos na linguagem de programação C com o seguinte.
# apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential
O pacote libc6-dev
, isto é, a biblioteca C GNU,
disponibiliza uma biblioteca standard
C a qual é uma colecção de ficheiros cabeçalho e rotinas de
biblioteca usadas pela linguagem de programação C.
Veja referências para C nos seguintes.
"info libc
" (Referência de funções da biblioteca C)
gcc(1)
e "info gcc
"
cada-nome_de_função_da_biblioteca_C(3)
Kernighan & Ritchie, "A Linguagem de Programação C", 2ª edição (Prentice Hall)
Um simples exemplo, "example.c
" pode ser compilado com
uma biblioteca "libm
" num executável
"run_example
" com o seguinte.
$ cat > example.c << EOF #include <stdio.h> #include <math.h> #include <string.h> int main(int argc, char **argv, char **envp){ double x; char y[11]; x=sqrt(argc+7.5); strncpy(y, argv[0], 10); /* prevent buffer overflow */ y[10] = '\0'; /* fill to make sure string ends with '\0' */ printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]); return 0; } EOF $ gcc -Wall -g -o run_example example.c -lm $ ./run_example 1, 2.915, ./run_exam, (null) $ ./run_example 1234567890qwerty 2, 3.082, ./run_exam, 1234567890qwerty
Aqui, o "-lm
" é necessário para ligar a biblioteca
"/usr/lib/libm.so
" do pacote libc6
para o
sqrt(3).
A biblioteca real está em "/lib/
" com o nome de ficheiro
"libm.so.6
", o qual é uma ligação simbólica para
"libm-2.7.so
".
Olhe ao último parâmetro no texto resultante. Existem mais de 10 caracteres
mesmo com "%10s
" especificado.
O uso de funções de operação de memória de ponteiro sem verificações de limites como em sprintf(3) e strcpy(3), está descontinuado para prevenir exploits de sobrelotação do buffer que influenciam os efeitos de transbordo em cima. Em vez disso, use snprintf(3) e strncpy(3).
A depuração é uma parte importante das atividades de programação. Saber como depurar programas faz de si um bom utilizador de Debian capaz de produzir relatórios de bugs significantes.
O depurador principal em Debian é o gdb(1) que lhe permite inspeccionar um programa enquanto ele é executado.
Vamos instalar o gdb
e programas relacionados com o
seguinte.
# apt-get install gdb gdb-doc build-essential devscripts
Um bom tutorial do gdb
é disponibilizado pelo
"info gdb
" ou encontrado em qualquer sítio na web. Aqui está um
exemplo simples de uso do
gdb(1)
num "program
" compilado com a opção
"-g
" para produzir informação de depuração.
$ gdb program (gdb) b 1 # define ponto de paragem na linha 1 (gdb) run args # corre o programa com argumentos (gdb) next # próxima linha ... (gdb) step # passo em frente ... (gdb) p parm # escreve o parm ... (gdb) p parm=12 # define valor para 12 ... (gdb) quit
![]() |
Dica |
---|---|
Muitos comandos do gdb(1) podem ser abreviados. A expansão da Tab funciona como na shell. |
Como todos os binários instalados devem estar 'despidos' de símbolos no
sistema Debian por predefinição, a maioria dos símbolos de depuração são
removidos no pacote normal. De modo a depurar pacotes Debian com o
gdb(1),
ou os pacotes *-dbg
correspondentes ou
*-dbgsym
precisam de ser instalados
(ex. libc6-dbg
no caso do libc6
,
coreutils-dbgsym
no caso do
coreutils
).
Pacotes do estilo antigo proporcionariam o pacote *-dbg
dele correspondente. É posto directamente dentro do arquivo Debian main
juntamente com o próprio pacote original. Para os pacotes mais recentes,
eles podem gerar pacotes *-dbgsym
automaticamente quando
são compilados e esses pacotes de depuração são postos no arquivo debian-debug. Por favor consulte artigos na Debian Wiki para mais
informação.
Se um pacote a ser depurado não disponibilizar ou o pacote
*-dbg
ou *-dbgsym
dele, necessita
instalá-lo após recompilá-lo com o seguinte.
$ mkdir /path/new ; cd /path/new $ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get install fakeroot devscripts build-essential $ apt-get source package_name $ cd package_name* $ sudo apt-get build-dep ./
Corrigir bugs se necessário.
Mude a versão de pacote para uma que não colida com as versões oficiais de
Debian, por exemplo, uma adicionada com "+debug1
" quando
se recompila uma versão de pacote existente, ou uma adicionada com
"~pre1
" quando se compila uma versão de pacote ainda não
lançada com o seguinte.
$ dch -i
Compilar e instalar pacotes com símbolos de depuração com o seguinte.
$ export DEB_BUILD_OPTIONS=nostrip noopt $ debuild $ cd .. $ sudo debi nome_do_pacote*.changes
Necessita verificar os scripts de construção do pacote e assegurar o uso de
"CFLAGS=-g -Wall
" para compilar binários.
Quando encontrar um crash num programa, é uma boa ideia enviar um relatório de bug com informação de backtrace copiada-e-colada.
O backtrace pode ser obtido com os seguinte passos.
Correr o programa sob gdb(1).
Reproduzir o erro (crash).
Isso faz com que volte para o aviso do gdb
.
Escreva "bt
" no aviso do gdb
.
No caso do programa congelar, pode travar o programa ao pressionar
Ctrl-C
no terminal que correr o gdb
para obter o aviso do gdb
.
![]() |
Dica |
---|---|
Muitas vezes, vê um backtrace onde uma ou mais linhas do topo estão em
" |
$ MALLOC_CHECK_=2 gdb hello
Tabela 12.12. Lista de comandos gdb avançados
comando | descrição dos objetivos do comando |
---|---|
(gdb) thread apply all bt
|
obter um backtrace para todos os processos de um programa de multi-processo |
(gdb) bt full
|
obter parâmetros que vêm na pilha das chamadas de função |
(gdb) thread apply all bt full
|
obtém um backtrace e parâmetros como a combinação das opções precedentes |
(gdb) thread apply all bt full 10
|
obter um backtrace e parâmetros para as 10 chamadas do topo para cortar resultados irrelevantes |
(gdb) set logging on
|
escreve um relatório dos resultados do gdb para um
ficheiro (a predefinição é "gdb.txt ")
|
Se o programa do GNOME preview1
recebeu um erro do X,
deverá ver a mensagem que a seguir.
O programa 'preview1' recebeu um erro do X Window System.
Neste caso, pode tentar correr o programa com "--sync
" e
quebrar a função "gdk_x_error
" de modo a obter um
backtrace.
Use o ldd(1) para encontrar uma dependência de um programa em bibliotecas com o seguinte.
$ ldd /bin/ls librt.so.1 => /lib/librt.so.1 (0x4001e000) libc.so.6 => /lib/libc.so.6 (0x40030000) libpthread.so.0 => /lib/libpthread.so.0 (0x40153000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Para que o ls(1) funcione num ambiente 'chroot', as bibliotecas em cima têm de estar disponíveis no seu ambiente 'chroot'.
Aqui estão várias ferramentas de detecção de fugas de memória em Debian.
Tabela 12.13. Lista de ferramentas de detecção de fugas de memória
pacote | popcon | tamanho | descrição |
---|---|---|---|
libc6-dev
|
V:249, I:620 | 14357 | mtrace(1): funcionalidades de depuração do malloc em glibc |
valgrind
|
V:6, I:46 | 80378 | depurador e perfilador de memória |
electric-fence
|
V:0, I:5 | 70 | o depurador malloc(3) |
leaktracer
|
V:0, I:3 | 57 | rastreador de fugas de memória para programas C++ |
libdmalloc5
|
V:0, I:3 | 393 | biblioteca de depuração de alocação de memória |
Existem ferramentas tipo lint para análise estática de código.
Tabela 12.14. Lista de ferramentas para análise de código estático
pacote | popcon | tamanho | descrição |
---|---|---|---|
splint
|
V:0, I:4 | 2315 | ferramenta para verificação estática de programas C por bugs |
flawfinder
|
V:0, I:0 | 181 | ferramenta para examinar código fonte C/C++ e procurar por fraquezas na segurança |
perl
|
V:610, I:992 | 705 | interpretador com verificador de código estático interno: B::Lint(3perl) |
pylint
|
V:2, I:13 | 1371 | Verificador estático de código Python |
weblint-perl
|
V:0, I:1 | 32 | Verificado de sintaxe e estilo mínimo para HTML |
linklint
|
V:0, I:0 | 344 | verificador de ligações rápido e ferramenta de manutenção de sites web |
libxml2-utils
|
V:22, I:246 | 182 | utilitários com xmllint(1) para validar ficheiros XML |
O Flex é um gerador rápido de análise léxica compatível com o Lex.
O tutorial do
flex(1)
encontra-se em "info flex
".
Tem de fornecer o seu próprio "main()
" e
"yywrap()
". Caso contrário, o seu programa flex deverá
ficar como isto para compilar sem uma biblioteca. Isto é porque o
"yywrap
" é uma macro e a "%option
main
" liga implicitamente "%option noyywrap
".
%option main %% .|\n ECHO ; %%
Alternativamente, pode compilar com a opção "-lfl
" do
linker no final da sua linha de comandos
cc(1)
(como AT&T-Lex com "-ll
"). Nenhuma
"%opção
" é necessária neste caso.
Vários pacotes disponibilizam um gerador LR parser ou LALR parser compatível em frente com o Yacc em Debian.
Tabela 12.15. Lista de geradores de análise LALR compatíveis com Yacc
pacote | popcon | tamanho | descrição |
---|---|---|---|
bison
|
V:9, I:103 | 2815 | gerador de análise GNU LALR |
byacc
|
V:0, I:6 | 160 | Gerador de análise Berkeley LALR |
btyacc
|
V:0, I:0 | 243 |
gerador de análises de retrocesso baseado no byacc
|
O tutorial para o
bison(1)
encontra-se em "info bison
".
Tem de disponibilizar as suas próprias chamadas "main()
"
e "yyerror()
". "main()
" chama
"yyparse()
" que chama "yylex()
",
geralmente criada com Flex.
%% %%
Autoconf é uma ferramenta para produzir scripts de shell que configuram automaticamente pacotes de software em código fonte para se adaptarem a muitos tipos de sistemas tipo-Unix a usar o sistema de compilação completo do GNU.
O
autoconf(1)
produz o script de configuração "configure
". O
"configure
" cria automaticamente um
"Makefile
" personalizado a usar o modelo
"Makefile.in
".
![]() |
Atenção |
---|---|
Não substitua ficheiros do sistema com os seus programas compilados quando os instalar. |
Debian não toca nos ficheiros em "/usr/local/
" ou em
"/opt
". Portanto se compilar um programa a partir do
código-fonte, instale-o em "/usr/local/
" para que não
interfira com o Debian.
$ cd src $ ./configure --prefix=/usr/local $ make $ make install # isto coloca os ficheiros no sistema
Se tiver a fonte original e esta utilizar autoconf(1)/automake(1) e se se lembrar como o configurou, execute como o seguinte para desinstalar o programa.
$ ./configure "todas-as-opções-que-fornecer" # make uninstall
Em alternativa, se tiver a absoluta certeza que o processo de instalação
apenas coloca ficheiros sob "/usr/local/
" e não há lá
nada importante, pode apagar todos os seus conteúdos com o seguinte.
# find /usr/local -type f -print0 | xargs -0 rm -f
Se não tiver a certeza de onde os ficheiros estão instalados, deve
considerar usar o
checkinstall(8)
do pacote checkinstall
, que disponibiliza um caminho
limpo para a desinstalação. Agora suporta criar um pacote Debian com a opção
"-D
".
Apesar de quaisquer scripts AWK poderem ser reescritos automaticamente em Perl a usar o a2p(1), scripts AWK de uma linha ficam melhor convertidos manualmente para scripts Perl de uma linha.
Vamos pensar a seguir o fragmento do script AWK.
awk '($2=="1957") { print $3 }' |
Isto é equivalente a qualquer uma das seguintes linhas.
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
perl -lane 'print$F[2]if$F[1]eq+1957' |
Este último é um enigma. Aproveitei-me das seguintes funcionalidades do Perl.
O espaço em branco é opcional.
Existe a conversão automática de números para string.
Veja perlrun(1) para as opções de linha de comandos. Para mais scripts Perl doidos, Perl Golf pode ser interessante.
Páginas web dinâmicas interactivas podem ser feitas conforme a seguir.
As questões são apresentadas ao explorador do utilizador a usar formulários HTML.
Preencher e clicar nas entradas do formulário envia uma das seguintes strings de URL com parâmetros codificados do explorador para o servidor web.
"http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
"http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
"http://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
"
O "%nn
" no URL é substituído por um caractere com valor
hexadecimal nn
.
A variável de ambiente está definida como: "QUERY_STRING="VAR1=VAL1
VAR2=VAL2 VAR3=VAL3"
".
O programa CGI (qualquer um de
"program.*
") no servidor web executa-se a si próprio com
a variável de ambiente "$QUERY_STRING
".
O stdout
do programa CGI é enviado ao explorador web e é
apresentado como uma página web dinâmica e interactiva.
Por razões de segurança é melhor não embarcar em novos hacks para analisar parâmetros CGI. Existem módulos definidos para eles em Perl e Python. O PHP vem com estas funcionalidades. Quando é necessário o armazenamento de dados no cliente, usam-se cookies HTTP. Quando é necessário o processamento de dados no lado do cliente, usa-se frequentemente Javascript.
Para mais, veja Common Gateway Interface, The Apache Software Foundation e JavaScript.
Procurar "CGI tutorial" no Google ao escrever directamente o URL codificado http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial no endereço do explorador é uma boa maneira de ver o script CGI em acção no servidor da Google.
Existem programas para converter código-fonte.
Se desejar criar um pacote Debian, leia o seguinte.
Capítulo 2, Gestão de pacotes Debian para compreender o sistema básico de pacotes
Secção 2.7.13, “Portar um pacote ao sistema stable” para compreender o processo básico de portar
Secção 9.10.4, “Sistema chroot” para compreender as técnicas de chroot básicas
debuild(1), pbuilder(1) e pdebuild(1)
Secção 12.4.2, “Depurar o pacote Debian” para recompilar para depuração
Guia dos Novos Maintainers da
Debian como tutorial (o pacote maint-guide
)
Referência de Programadores da
Debian (o pacote developers-reference
)
Manual de Políticas Debian (o
pacote debian-policy
)
Guia dos Novos Maintainers da
Debian (o pacote debmake-doc
)
Existem pacotes como os debmake
,
dh-make
, dh-make-perl
, etc., que
auxiliam no processo em empacotamento.