Você está na página 1de 18

31/10/2019 perldebug - perldoc.perl.

org

O depurador Perl
Se você chamar Perl com a opção -d , seu script será executado no depurador de origem Perl. Isso
funciona como um ambiente Perl interativo, solicitando comandos do depurador que permitem
examinar o código-fonte, definir pontos de interrupção, obter retornos de pilha, alterar os valores
das variáveis etc. Isso é tão conveniente que você geralmente aciona o depurador sozinho para
teste Perl constrói interativamente para ver o que eles fazem. Por exemplo:

1. $ perl - d -e 42

No Perl, o depurador não é um programa separado da maneira como costuma ser no ambiente
compilado típico. Em vez disso, o sinalizador -d diz ao compilador para inserir informações de
origem nas árvores de análise que está prestes a ser entregue ao intérprete. Isso significa que seu
código deve primeiro compilar corretamente para que o depurador funcione nele. Então, quando o
intérprete é iniciado, ele pré-carrega um arquivo de biblioteca Perl especial que contém o
depurador.

O programa será interrompido imediatamente antes da primeira instrução executável em tempo de


execução (mas veja abaixo as instruções em tempo de compilação) e solicitará que você insira um
comando debugger. Ao contrário das expectativas populares, sempre que o depurador interrompe
e mostra uma linha de código, ele sempre exibe a linha que está prestes a executar, em vez da que
acabou de executar.

Qualquer comando não reconhecido pelo depurador é executado diretamente (  eval 'd) como
código Perl no pacote atual. (O depurador usa o pacote DB para manter suas próprias informações
de estado.)

Observe que o dito  eval está vinculado por um escopo implícito. Como resultado, qualquer
variável lexical recém-introduzida ou qualquer conteúdo do buffer de captura modificado é
perdido após a avaliação. O depurador é um ambiente agradável para aprender Perl, mas se você
experimenta interativamente o material que deve estar no mesmo escopo, coloque-o em uma
linha.

Para qualquer texto digitado no prompt do depurador, os espaços em branco à esquerda e à


direita são removidos primeiro antes do processamento. Se um comando debugger coincidir com
alguma função em seu próprio programa, basta preceder a função com algo que não se parece
com um comando debugger, como um líder  ;  ou talvez um  +  , ou envolvendo-o com
parênteses ou chaves.

Chamando o depurador
Existem várias maneiras de chamar o depurador:

perl -d nome_do_programa
No programa especificado identificado por  program_name  .

perl -d -e 0
Forneça interativamente um  expression  uso arbitrário  -e  .

perl -d: ptkdb nome_do_programa


Depure um determinado programa através da  Devel::ptkdb  GUI.
https://perldoc.perl.org/perldebug.html 1/18
31/10/2019 perldebug - perldoc.perl.org

perl -dt threaded_program_name


Depure um determinado programa usando threads (experimental).

Comandos do depurador
O depurador interativo compreende os seguintes comandos:

h
Imprime uma mensagem de ajuda resumida

h [comando]
Imprime uma mensagem de ajuda para o comando debugger fornecido.

hh
O argumento especial de produz toda a página de ajuda, que é bastante longa. h h

Se a saída do comando (ou qualquer comando, por sinal) passar pela tela, preceda o
comando com um símbolo de canal inicial para que ele passe pelo pager, como em h h

1. DB > | h h

Você pode alterar o pager que é usado via comando. o pager=...

p expr
O mesmo que no pacote atual. Em particular, como essa é apenas a função do Perl , isso
significa que estruturas e objetos de dados aninhados não são descartados, ao contrário
do comando. print {$DB::OUT} expr print x

O  DB::OUT  manipulador de arquivo é aberto para / dev / tty , independentemente de onde o


STDOUT possa ser redirecionado.

x [profundidade máxima] expr


Avalia sua expressão no contexto da lista e despeja o resultado de uma maneira bem
impressa. As estruturas de dados aninhadas são impressas recursivamente, diferentemente
da  print função real no Perl. Ao despejar hashes, você provavelmente prefere 'x \% h' em
vez de 'x% h'. Consulte Dumpvalue se você quiser fazer isso sozinho.

O formato de saída é controlado por várias opções descritas em Opções configuráveis .

Se o  maxdepth  estiver incluído, deve ser um número N ; o valor é despejado apenas N níveis


de profundidade, como se a  dumpDepth  opção foi temporariamente definido para N .

V [pkg [vars]]
Exiba todas (ou algumas) variáveis no pacote (padrão  main  ) usando uma impressora bonita
de dados (os hashes mostram suas chaves e valores para que você veja o que é, caracteres de
controle são imprimíveis etc.). Certifique-se de não colocar o especificador de tipo (como  $  )
lá, apenas os nomes dos símbolos, como este:

1. Linha do nome do arquivo V DB

Use e para expressões positivas e negativas. ~pattern !pattern

É semelhante a chamar o  x comando em cada var aplicável.


https://perldoc.perl.org/perldebug.html 2/18
31/10/2019 perldebug - perldoc.perl.org

X [vars]
O mesmo que . V currentpackage [vars]

y [nível [vars]]
Exiba todas (ou algumas) variáveis lexicais (mnemônicas:  mY  variáveis) no escopo atual ou
nos escopos de nível mais altos. Você pode limitar as variáveis que vê com vars, que
funcionam exatamente como nos comandos  V  e  X . Requer
a  PadWalker  versão do módulo 0.08 ou superior; avisará se isso não estiver instalado. A saída
é bastante impressa no mesmo estilo que para  V  e o formato é controlado pelas mesmas
opções.

T
Produza um rastreamento de pilha. Veja abaixo os detalhes sobre sua saída.

s [expr]
Único passo. Executa até o início de outra instrução, descendo para chamadas de sub-
rotina. Se for fornecida uma expressão que inclua chamadas de função, ela também será
executada em uma única etapa.

n [expr]
Próximo. Executa sob chamadas de sub-rotina, até o início da próxima instrução. Se for
fornecida uma expressão que inclua chamadas de função, essas funções serão executadas
com paradas antes de cada instrução.

r
Continue até o retorno da sub-rotina atual. Despejar o valor de retorno se a  PrintRet  opção
estiver configurada (padrão).

<CR>
Repita o último  n  ou  s comando.

c [linha | sub]
Continue, opcionalmente, inserindo um ponto de interrupção único na linha ou sub-rotina
especificada.

eu
Listar a próxima janela de linhas.

l min + incr
Listar linhas começando em . incr+1 min

l min-max
Linhas da lista  min  através de  max  .  l -  é sinônimo de  -  .

eu linha
Liste uma única linha.

l subname
Listar a primeira janela de linhas da sub-rotina. subname pode ser uma variável que contém
uma referência de código.

https://perldoc.perl.org/perldebug.html 3/18
31/10/2019 perldebug - perldoc.perl.org

Listar a janela anterior das linhas.

v [linha]
Veja algumas linhas de código em torno da linha atual.

.
Retorne o ponteiro do depurador interno para a última linha executada e imprima essa linha.

nome do arquivo f
Alterne para exibir um arquivo ou  eval instrução diferente . Se o nome do arquivo não for
um nome de caminho completo encontrado nos valores de% INC, será considerado um
regex.

eval strings ed (quando acessíveis) são consideradas nomes de arquivos: e acesse o corpo


da sétima edição ed (na ordem de execução). Os corpos das seqüências atualmente
executadas e das que definem sub-rotinas são salvos e, portanto,
acessíveis. f(eval 7) f eval 7\b eval eval eval

/padronizar/
Pesquise o padrão (um regex Perl); final / é opcional. A pesquisa não diferencia maiúsculas de
minúsculas por padrão.

?padronizar?
Pesquise para trás o padrão; final ? é opcional. A pesquisa não diferencia maiúsculas de
minúsculas por padrão.

L [abw]
Listar (padrão todas) ações, pontos de interrupção e expressões de observação

S [[!] Regex]
Liste os nomes das sub-rotinas [não] que correspondem ao regex.

t [n]
Alterne para o modo de rastreamento (consulte também a  AutoTrace  opção). Argumento
opcional é o número máximo de níveis a serem rastreados abaixo do atual; qualquer coisa
mais profunda do que isso ficará em silêncio.

t [n] expr
Rastrear através da execução de  expr  . O primeiro argumento opcional é o número máximo
de níveis a serem rastreados abaixo do atual; qualquer coisa mais profunda do que isso ficará
em silêncio. Consulte Exemplos de saída da lista de quadros em perldebguts para obter
exemplos.

b
Define o ponto de interrupção na linha atual

b [linha] [condição]
Defina um ponto de interrupção antes da linha especificada. Se uma condição for
especificada, ela será avaliada sempre que a instrução for atingida: um ponto de interrupção
será obtido apenas se a condição for verdadeira. Os pontos de interrupção podem ser
definidos apenas nas linhas que iniciam uma instrução executável. As condições não
usam  if :

https://perldoc.perl.org/perldebug.html 4/18
31/10/2019 perldebug - perldoc.perl.org

1. b 237 $ x > 30
2. b 237 ++ $ count237 < 11
3. b 33 / padrão / i

Se o número da linha for  .  , define um ponto de interrupção na linha atual:

1. b . $ n > 100

b [arquivo]: [linha] [condição]


Defina um ponto de interrupção antes da linha especificada em um arquivo (possivelmente
diferente). Se uma condição for especificada, ela será avaliada sempre que a instrução for
atingida: um ponto de interrupção será obtido apenas se a condição for verdadeira. Os
pontos de interrupção podem ser definidos apenas nas linhas que iniciam uma instrução
executável. As condições não usam  if :

1. b lib / MyModule . pm : 237 $ x > 30


2. b / usr / lib / perl5 / site_perl / CGI . pm : 100 ++ $ count100 < 11

b subnome [condição]
Defina um ponto de interrupção antes da primeira linha da sub-rotina
nomeada. subname pode ser uma variável que contém uma referência de código (nesse caso,
a condição não é suportada).

b adiar o subnome [condição]


Defina um ponto de interrupção na primeira linha da sub-rotina após a compilação.

b carregar nome do arquivo


Defina um ponto de interrupção antes da primeira linha executada do nome do arquivo , que
deve ser um nome de caminho completo encontrado entre os valores de% INC.

b nome da compilação
Define um ponto de interrupção antes da primeira instrução executada após a compilação da
sub-rotina especificada.

Linha B
Exclua um ponto de interrupção da linha especificada .

B*
Exclua todos os pontos de interrupção instalados.

desativar [arquivo]: [linha]


Desative o ponto de interrupção para não interromper a execução do programa. Os pontos
de interrupção são ativados por padrão e podem ser reativados usando o  enable  comando

desativar [linha]
Desative o ponto de interrupção para não interromper a execução do programa. Os pontos
de interrupção são ativados por padrão e podem ser reativados usando o  enable  comando

Isso é feito para um ponto de interrupção no arquivo atual.

ativar [arquivo]: [linha]


Habilite o ponto de interrupção para interromper a execução do programa.
https://perldoc.perl.org/perldebug.html 5/18
31/10/2019 perldebug - perldoc.perl.org

ativar [linha]
Habilite o ponto de interrupção para interromper a execução do programa.

Isso é feito para um ponto de interrupção no arquivo atual.

um comando [linha]
Defina uma ação a ser executada antes da linha ser executada. Se a linha for omitida, defina
uma ação na linha a ser executada. A sequência de etapas executadas pelo depurador é

1. 1. verificação para um ponto de interrupção na presente linha


2. 2. imprima a linha, se necessário ( rastreamento )
3. 3. realizar alguma ação associada a essa linha
4. 4. prompt de utilizador se em um ponto de interrupção ou no único -
etapa
5. 5. linha de avaliação

Por exemplo, isso imprimirá $ foo toda vez que a linha 53 for passada:

1. uma cópia 53 "DB FOUND $ foo \ n"

Uma linha
Exclua uma ação da linha especificada.

UMA *
Exclua todas as ações instaladas.

w expr
Adicione uma expressão de observação global. Sempre que um global observado muda, o
depurador para e exibe os valores antigos e novos.

W expr
Excluir expressão de observação

W*
Exclua todas as expressões de observação.

o
Exibe todas as opções.

o booloption ...
Defina cada opção booleana listada para o valor  1  .

o anyoption? ...
Imprima o valor de uma ou mais opções.

o opção = valor ...


Defina o valor de uma ou mais opções. Se o valor tiver espaço em branco interno, ele deverá
ser citado. Por exemplo, você pode definir menos chamadas com essas opções
específicas. Você pode usar aspas simples ou duplas, mas, se o fizer, deve escapar de
quaisquer instâncias incorporadas do mesmo tipo de cotação com que começou, além de
escapar de quaisquer escapes que precedam imediatamente a cotação, mas que não

https://perldoc.perl.org/perldebug.html 6/18
31/10/2019 perldebug - perldoc.perl.org

pretendem escapar da cotação. em si. Em outras palavras, você segue regras de aspas
simples, independentemente da cotação; por exemplo: ou . o pager="less -
MQeicsNfr" o option='this isn\'t bad' ooption="She said, \"Isn't it?\""

Por razões históricas,  =value  é opcional, mas o padrão é 1 somente onde é seguro fazê-lo -
ou seja, principalmente para opções booleanas. É sempre melhor atribuir um valor específico
usando  =  . O  option  pode ser abreviado, mas para maior clareza provavelmente não
deveria ser. Várias opções podem ser definidas juntas. Consulte Opções configuráveis para
obter uma lista delas.

<?
Liste todas as ações de comando Perl pré-prompt.

<[comando]
Defina uma ação (comando Perl) para ocorrer antes de cada prompt do depurador. Um
comando de várias linhas pode ser inserido com a barra invertida das novas linhas.

<*
Exclua todas as ações de comando Perl pré-prompt.

<< comando
Adicione uma ação (comando Perl) para acontecer antes de cada prompt do depurador. Um
comando de várias linhas pode ser digitado retrocedendo as novas linhas.

>?
Liste as ações do comando Perl pós-prompt.

> comando
Defina uma ação (comando Perl) para ocorrer após o prompt quando você acabou de
fornecer um comando para retornar à execução do script. Um comando de várias linhas pode
ser inserido com uma barra invertida nas novas linhas (apostamos que você não poderia ter
adivinhado isso até agora).

>*
Exclua todas as ações de comando Perl pós-prompt.

>> comando
Adiciona uma ação (comando Perl) para ocorrer após o prompt quando você acabou de
fornecer um comando para retornar à execução do script. Um comando de várias linhas pode
ser inserido com a barra invertida das novas linhas.

{?
Liste os comandos do depurador antes do prompt.

{[comando]
Defina uma ação (comando debugger) para ocorrer antes de cada prompt do depurador. Um
comando de várias linhas pode ser inserido da maneira habitual.

Como esse comando é novo em alguns sentidos, um aviso será emitido se você
aparentemente inserir um bloco acidentalmente. Se é isso que você pretende fazer, escreva
como com ou mesmo . ;{ ... } do { ... }

{*
https://perldoc.perl.org/perldebug.html 7/18
31/10/2019 perldebug - perldoc.perl.org

Exclua todos os comandos do depurador antes do prompt.

{{command
Adicione uma ação (comando debugger) a ocorrer antes de cada prompt do depurador. Um
comando de várias linhas pode ser inserido, se você puder adivinhar como: veja acima.

! número
Refaça um comando anterior (o padrão é o comando anterior).

! -número
Refazer o número do comando anterior.

! padronizar
Refaça o último comando iniciado com padrão. Veja também. o recallCommand

!! cmd
Execute o cmd em um subprocesso (lê DB :: IN, grava em DB :: OUT)
Consulte também. Observe que o shell atual do usuário (bem, sua variável) será usado, o que
pode interferir na interpretação adequada do status de saída ou das informações do sinal e
do coreedump. o shellBang $ENV{SHELL}

arquivo fonte
Leia e execute comandos debugger do arquivo . O próprio arquivo pode
conter  source  comandos.

Número H
Exibe os últimos n comandos. Apenas comandos com mais de um caractere são listados. Se
o número for omitido, liste todos eles.

q ou ^ D
Sair. ("sair" não funciona para isso, a menos que você tenha criado um alias) Essa é a única
maneira suportada de sair do depurador, embora digitar  exit duas vezes possa funcionar.

Defina a  inhibit_exit  opção como 0 se desejar poder finalizar o script. Você também pode
precisar definir $ done como 0 se quiser passar pela destruição global.

R
Reinicie o depurador  exec() inserindo uma nova sessão. Tentamos manter seu histórico, mas
configurações internas e opções de linha de comando podem ser perdidas.

Atualmente, a seguinte configuração é preservada: histórico, pontos de interrupção, ações,


opções do depurador e as opções da linha de comando Perl -w , -I e -e .

| dbcmd
Execute o comando debugger, canalizando DB :: OUT para o seu pager atual.

|| dbcmd
O mesmo que o DB :: OUT também está temporariamente ed. |dbcmd select

= [valor alternativo]
Defina um alias de comando, como

1. = sair q
https://perldoc.perl.org/perldebug.html 8/18
31/10/2019 perldebug - perldoc.perl.org

ou liste os aliases atuais.

comando
Execute o comando como uma instrução Perl. Um ponto e vírgula à direita será fornecido. Se
a instrução Perl seria confundida para um depurador Perl, use um ponto e vírgula à esquerda
também.

m expr
Liste quais métodos podem ser chamados no resultado da expressão avaliada. A expressão
pode ser avaliada como uma referência a um objeto abençoado ou a um nome de pacote.

M
Exiba todos os módulos carregados e suas versões.

homem
Apesar do nome, isso chama o visualizador de documentação padrão do sistema na página
fornecida ou no próprio visualizador, se a página de manual for omitida. Se esse visualizador
for man , as  Config  informações atuais serão usadas para chamar manusando a opção
apropriada MANPATH ou -M manpath . As pesquisas com falha do formulário  XXX  que
correspondem às páginas de manual conhecidas do
formulário perlXXX serão tentadas novamente. Isso permite digitar ou no
depurador. man debug man op

Em sistemas tradicionalmente desprovidos de um comando man utilizável , o depurador


chama perldoc . Ocasionalmente, essa determinação é incorreta devido a fornecedores
recalcitrantes ou, de maneira mais satisfatória, a usuários empreendedores. Se você se
enquadra em qualquer uma das categorias, defina manualmente a variável $ DB :: doccmd
como qualquer visualizador para exibir a documentação do Perl no seu sistema. Isso pode ser
definido em um arquivo rc ou através de atribuição direta. Ainda estamos aguardando um
exemplo de trabalho de algo como:

1. $ DB :: doccmd = 'netscape -remote http://something.here/ ' ;

Opções configuráveis
O depurador tem várias opções configuráveis usando o  o  comando, de forma interativa ou a
partir do ambiente ou de um arquivo rc. (./.perldb ou ~ / .perldb no Unix.)

recallCommand  ,  ShellBang


Os caracteres usados para recuperar um comando ou gerar um shell. Por padrão, ambos
estão definidos como  !  , o que é lamentável.

pager
Programa a ser usado para saída de comandos canalizados por pager (aqueles que começam
com um  |  caractere.) Por padrão, será usado. Como o depurador usa as características
atuais do terminal para negrito e sublinhado, se o pager escolhido não passar sequências de
escape inalteradas, a saída de alguns comandos do depurador não será legível quando
enviada pelo pager. $ENV{PAGER}

tkRunning
Execute Tk enquanto solicita (com ReadLine).

https://perldoc.perl.org/perldebug.html 9/18
31/10/2019 perldebug - perldoc.perl.org

signalLevel  ,  warnLevel  , dieLevel


Nível de verbosidade. Por padrão, o depurador deixa suas exceções e avisos em paz, pois
alterá-los pode interromper a execução correta dos programas. Ele tentará imprimir uma
mensagem quando chegarem sinais INT, BUS ou SEGV não capturados. (Mas veja a menção
de sinais nos BUGS abaixo.)

Para desativar esse modo de segurança padrão, defina esses valores para algo maior que 0.
No nível 1, você obtém retornos ao receber qualquer tipo de aviso (geralmente irritante) ou
exceção (geralmente valioso). Infelizmente, o depurador não pode discernir exceções fatais
das não fatais. Se  dieLevel  for igual a 1, suas exceções não fatais também serão rastreadas
e alteradas sem cerimônia se vierem de  eval'ed strings ou de qualquer tipo
de  eval módulo que você esteja tentando carregar. E se dieLevel  é 2, o depurador não se
importa de onde eles vieram: usurpa o manipulador de exceções e imprime um rastreamento
e modifica todas as exceções com seus próprios enfeites. Talvez isso seja útil para alguns fins
de rastreamento, mas tende a destruir irremediavelmente qualquer programa que leve a sério
o tratamento de exceções.

AutoTrace
Modo de rastreamento (semelhante ao  t  comando, mas pode ser colocado
em  PERLDB_OPTS  ).

LineInfo
Arquivo ou canal para imprimir as informações do número da linha. Se for um canal
(digamos ), uma mensagem curta será usada. Este é o mecanismo usado para interagir com
um editor escravo ou depurador visual, como o special ou hooks, ou o depurador
gráfico. |visual_perl_db vi emacs ddd

inhibit_exit
Se 0, permite sair do final do script.

PrintRet
Imprima o valor retornado após o  r  comando, se definido (padrão).

ornaments
Afeta a aparência da tela da linha de comando (consulte Term :: ReadLine ). Atualmente, não
há como desabilitá-las, o que pode tornar ilegíveis algumas saídas em alguns monitores ou
com alguns pagers. Isso é considerado um bug.

frame
Afeta a impressão de mensagens ao entrar e sair das sub-rotinas. Se for falso, as mensagens
serão impressas apenas na entrada. (Imprimir na saída pode ser útil se intercalado com outras
mensagens.) frame & 2

Se , argumentos para funções forem impressos, mais informações sobre contexto e
chamadas. Se , sobrecarregado e d está habilitado nos argumentos impressos. Se , o valor de
retorno da sub-rotina é impresso. frame & 4 frame & 8 stringify tie FETCH frame & 16

O comprimento em que a lista de argumentos é truncada é governado pela próxima opção:

maxTraceLen
Comprimento para truncar a lista de argumentos quando o  frame  bit 4 da opção é definido.

https://perldoc.perl.org/perldebug.html 10/18
31/10/2019 perldebug - perldoc.perl.org

windowSize
Altere o tamanho da janela da lista de códigos (o padrão é 10 linhas).

As seguintes opções afetam o que acontece com  V  ,  X  e  x  ordena:

arrayDepth  ,  hashDepth


Imprima apenas os primeiros N elementos ('' para todos).

dumpDepth
Limite a profundidade de recursão a N níveis ao despejar estruturas. Valores negativos são
interpretados como infinito. Padrão: infinito.

compactDump  ,  veryCompact


Altere o estilo da matriz e da saída de hash. Se  compactDump  , uma matriz curta pode ser
impressa em uma linha.

globPrint
Se deve imprimir o conteúdo dos globs.

DumpDBFiles
Despejar matrizes contendo arquivos depurados.

DumpPackages
Despejar tabelas de símbolos de pacotes.

DumpReused
Despejar conteúdo de endereços "reutilizados".

quote  ,  HighBit  , undefPrint


Mude o estilo do despejo de string. O valor padrão para  quote  é  auto  ; é possível ativar o
formato de aspas duplas ou aspas simples configurando-o para  "  ou  '  ,
respectivamente. Por padrão, os caracteres com seu conjunto de bits alto são impressos
literalmente.

UsageOnly
Despejo rudimentar de uso de memória por pacote. Calcula o tamanho total de strings
encontradas nas variáveis do pacote. Isso não inclui léxicos no escopo de arquivo de um
módulo ou perdidos em fechamentos.

HistFile
O caminho do arquivo a partir do qual o histórico (assumindo um back-end Term :: ReadLine
utilizável) será lido na inicialização do depurador e no qual ele será salvo no desligamento
(para persistência nas sessões). Conceito semelhante ao arquivo de Bash . .bash_history

HistSize
A contagem das linhas salvas no histórico (assumindo  HistFile  acima).

Depois que o arquivo rc é lido, o depurador lê a variável de ambiente e analisa isso como o
restante de uma linha "O ...", como se pode digitar no prompt do depurador. Você pode colocar as
opções de inicialização , , , e lá. $ENV{PERLDB_OPTS} TTY noTTY ReadLine NonStop

Se o seu arquivo rc contiver:

https://perldoc.perl.org/perldebug.html 11/18
31/10/2019 perldebug - perldoc.perl.org

1. parse_options ( "NonStop = 1 LineInfo = db.out AutoTrace" ) ;

seu script será executado sem intervenção humana, colocando informações de rastreamento no
arquivo db.out . (Se você interromper, é melhor redefinir  LineInfo  para / dev / tty se você espera
ver alguma coisa.)

TTY
O TTY a ser usado para depuração de E / S.

noTTY
Se definido, o depurador entrará no  NonStop  modo e não se conectará a um TTY. Se
interrompido (ou se o controle for para o depurador via configuração explícita de $ DB ::
signal ou $ DB :: single do script Perl), ele se conectará a um TTY especificado na  TTY  opção
na inicialização ou a um tty encontrado em tempo de execução usando
o  Term::Rendezvous  módulo de sua escolha.

Este módulo deve implementar um método nomeado  new  que retorna um objeto com dois
métodos:  IN  e  OUT  . Eles devem retornar identificadores de arquivo a serem usados para
depuração de entrada e saída correspondente. O  new  método deve inspecionar um
argumento que contenha o valor de na inicialização ou de outra forma. Esse arquivo não é
inspecionado quanto à propriedade adequada, portanto, riscos de segurança são
teoricamente possíveis. $ENV{PERLDB_NOTTY} "$ENV{HOME}/.perldbtty$$"

ReadLine
Se falso, o suporte da linha de leitura no depurador será desativado para depurar aplicativos
que usam eles mesmos o ReadLine.

NonStop
Se definido, o depurador entrará no modo não interativo até ser interrompido ou
programaticamente, definindo $ DB :: signal ou $ DB :: single.

Aqui está um exemplo de uso da variável: $ENV{PERLDB_OPTS}

1. $ PERLDB_OPTS = "Quadro NonStop = 2" myprogram perl -d

Isso executará o script myprogram sem intervenção humana, imprimindo a árvore de chamadas


com pontos de entrada e saída. Observe que isso é equivalente a , e que, originalmente, as opções
poderiam ser abreviadas exclusivamente pela primeira letra (modulo as opções). No entanto, é
recomendável que você sempre os explique por completo para legibilidade e compatibilidade
futura. NonStop=1 frame=2 N f=2 Dump*

Outros exemplos incluem

1. $ PERLDB_OPTS = "NonStop LineInfo = quadro de listagem = 2" perl -d myprogram

que executa o script de maneira não interativa, imprimindo informações sobre cada entrada em
uma sub-rotina e cada linha executada no arquivo chamado listagem . (Se você interrompê-lo, é
melhor redefinir  LineInfo  para algo "interativo"!)

Outros exemplos incluem (usando a sintaxe padrão do shell para mostrar configurações de
variáveis de ambiente):

https://perldoc.perl.org/perldebug.html 12/18
31/10/2019 perldebug - perldoc.perl.org

1. $ ( PERLDB_OPTS = "Quadro NonStop = 1 AutoTrace LineInfo = tperl.out"


2. perl -d myprogram )

o que pode ser útil para depurar um programa que se usa  Term::ReadLine  . Não esqueça de
desanexar seu shell do TTY na janela que corresponde a / dev / ttyXX , digamos, emitindo um
comando como

1. $ sleep 1000000

Veja Internos do Depurador em perldebguts para obter detalhes.

Entrada / Saída do Depurador


Pronto
O prompt do depurador é algo como

1. DB <8>

ou mesmo

1. DB << 17 >>

onde esse número é o número do comando e que você usaria para acessar com
o mecanismo de histórico semelhante ao csh . Por exemplo, repetiria o comando número 17.
A profundidade dos colchetes angulares indica a profundidade do aninhamento do
depurador. Você pode obter mais de um conjunto de colchetes, por exemplo, se já estiver em
um ponto de interrupção e depois imprimir o resultado de uma chamada de função que
possui um ponto de interrupção, ou se você entrar em uma expressão
por comando. !17 s/n/t expression

Comandos de várias linhas


Se você deseja inserir um comando de várias linhas, como uma definição de sub-rotina com
várias instruções ou um formato, escape da nova linha que normalmente encerraria o
comando debugger com uma barra invertida. Aqui está um exemplo:

1. DB <1> para ( 1 .. 4 ) { \
2. cont : imprime "ok \ n" ; \
3. cont : }
4. Está bem
5. Está bem
6. Está bem
7. Está bem

Observe que esse negócio de escapar de uma nova linha é específico para comandos
interativos digitados no depurador.

Rastreamento de pilha
Aqui está um exemplo de como um backtrace de pilha via  T  comando pode parecer:

https://perldoc.perl.org/perldebug.html 13/18
31/10/2019 perldebug - perldoc.perl.org

1. $ = main :: infested chamado do arquivo 'Ambulation.pm' linha 10


2. @ = Ambulation :: legs ( 1 , 2 , 3 , 4 ) chamado do arquivo
'camel_flea'
3. linha 7
4. $ = main :: pests ( 'bactrian' , 4 ) chamado do arquivo 'camel_flea'
5. linha 4

O caractere esquerdo indica o contexto no qual a função foi chamada,


com  $  e  @  significando contextos escalares ou de lista, respectivamente, e  .  significando
contexto nulo (que na verdade é uma espécie de contexto escalar). A exibição acima diz que
você estava na função  main::infested  quando executou o despejo de pilha e que foi
chamado no contexto escalar da linha 10 do arquivo Ambulation.pm , mas sem nenhum
argumento, o que significa que foi chamado como  &infested  . O próximo quadro de pilha
mostra que a função  Ambulation::legs  foi chamada no contexto de lista
do arquivo camel_flea com quatro argumentos. O último quadro de pilha mostra
que  main::pests  foi chamado no contexto escalar, também de camel_flea , mas da linha 4.

Se você executar o  T  comando de dentro de uma  use  instrução ativa , o backtrace conterá


um  require quadro e um  eval quadro.

Formato de Listagem de Linha


Isso mostra os tipos de saída que o  l  comando pode produzir:

1. DB << 13 >> l
2. 101: @i {@i} = ();
3. 102: b @isa {@ i, $ pack} = ()
4. 103 if (existe $ i {$ prevpack} || existe $ isa {$ pack});
5. 104}
6. 105
7. 106 próximo
8. 107 ==> if (existe $ isa {$ pack});
9. 108
10. 109: a if ($ extra--> 0) {
11. 110:% isa = ($ pacote, 1);

Linhas quebráveis estão marcadas com  :  . Linhas com pontos de interrupção são marcadas
por  b  e aquelas com ações por  a  . A linha que está prestes a ser executada é marcada
por  ==>  .

Esteja ciente de que o código nas listagens de depurador pode não ser igual ao seu código-
fonte original. Diretivas de linha e filtros de fonte externa podem alterar o código antes que o
Perl o veja, fazendo com que o código se mova de suas posições originais ou assuma formas
totalmente diferentes.

Listagem de quadros
Quando a  frame  opção é definida, o depurador imprime sub-rotinas inseridas (e
opcionalmente encerradas) em diferentes estilos. Veja perldebguts para exemplos
incrivelmente longos deles.

Depurando instruções em tempo de compilação

https://perldoc.perl.org/perldebug.html 14/18
31/10/2019 perldebug - perldoc.perl.org

Se você tiver instruções executáveis em tempo de compilação (como código nos blocos
ou  use instruções BEGIN, UNITCHECK e CHECK ), elas não serão interrompidas pelo depurador,
embora os  require blocos s e INIT o façam, e as instruções em tempo de compilação possam ser
rastreadas com o  AutoTrace  conjunto de opções in  PERLDB_OPTS  ). No seu próprio código Perl,
no entanto, você pode transferir o controle de volta para o depurador usando a seguinte instrução,
que é inofensiva se o depurador não estiver em execução:

1. $ DB :: único = 1 ;

Se você definir  $DB::single  2, é equivalente a apenas digitar o  n  comando, enquanto um valor 1
significa o  s  comando. A  $DB::trace  variável deve ser definida como 1 para simular a digitação
do  t  comando.

Outra maneira de depurar o código em tempo de compilação é iniciar o depurador, definir um


ponto de interrupção na carga de algum módulo:

1. DB <7> b carga f : / perllib / lib / Carp . PM


2. Vai parar na carga de 'f: /perllib/lib/Carp.pm' .

e, em seguida, reinicie o depurador usando o  R  comando (se possível). Pode-se usar para o


mesmo propósito. b compile subname

Personalização do Depurador
O depurador provavelmente contém ganchos de configuração suficientes para que você nunca
precise modificá-lo. Você pode alterar o comportamento do depurador de dentro do depurador
usando seu  o  comando, da linha de comando por  PERLDB_OPTS  meio da variável de ambiente e
dos arquivos de personalização.

Você pode fazer algumas customizações configurando um arquivo .perldb , que contém o código
de inicialização. Por exemplo, você pode criar aliases como estes (o último é aquele que as pessoas
esperam estar lá):

1. $ DB :: alias { 'len' } = 's / ^ len (. *) / P length ($ 1) /' ;


2. $ DB :: alias { 'stop' } = 's / ^ stop (em | in) / b /' ;
3. $ DB :: alias { 'ps' } = 's / ^ ps \ b / p escalar /' ;
4. $ DB :: alias { 'quit' } = 's / ^ quit (\ s *) / exit /' ;

Você pode alterar as opções de .perldb usando chamadas como esta;

1. parse_options ( "NonStop = 1 LineInfo = db.out AutoTrace = 1 quadro = 2" ) ;

O código é executado no pacote  DB  . Observe que .perldb é processado antes do


processamento  PERLDB_OPTS  . Se .perldb definir a sub-rotina  afterinit  , essa função será
chamada após o término da inicialização do depurador. .perldb pode estar contido no diretório
atual ou no diretório inicial. Como esse arquivo é originado pelo Perl e pode conter comandos
arbitrários, por motivos de segurança, ele deve ser de propriedade do superusuário ou do usuário
atual e gravável por ninguém além de seu proprietário.

Você pode simular a entrada TTY no depurador adicionando comandos arbitrários ao @DB ::
typeahead. Por exemplo, seu arquivo .perldb pode conter:

https://perldoc.perl.org/perldebug.html 15/18
31/10/2019 perldebug - perldoc.perl.org

1. sub afterinit { push @DB :: typeahead , "b 4" , "b 6" ; }

O que tentaria definir pontos de interrupção nas linhas 4 e 6 imediatamente após a inicialização do
depurador. Observe que @DB :: typeahead não é uma interface suportada e está sujeita a
alterações em versões futuras.

Se você deseja modificar o depurador, copie o perl5db.pl da biblioteca Perl para outro nome e
corte-o no conteúdo do seu coração. Você desejará definir sua  PERL5DB  variável de ambiente para
dizer algo como isto:

1. INICIAR { requer "myperl5db.pl" }

Como último recurso, você também pode usar  PERL5DB  para personalizar o depurador, definindo
diretamente variáveis internas ou chamando as funções do depurador.

Observe que quaisquer variáveis e funções que não estão documentadas neste documento (ou
no perldebguts ) são consideradas apenas para uso interno e, como tal, estão sujeitas a alterações
sem aviso prévio.

Suporte / Histórico da Readline no depurador


Conforme enviado, o único histórico de linha de comando fornecido é simplista que verifica os
principais pontos de exclamação. No entanto, se você instalar os módulos Term :: ReadKey e Term ::
ReadLine do CPAN (como Term :: ReadLine :: Gnu, Term :: ReadLine :: Perl, ...), você terá recursos
completos de edição, como os O GNU readline (3) fornece. Procure-os no diretório modules / by-
module / Termno CPAN. Entretanto, eles não oferecem suporte à edição normal da linha de
comando vi .

Também está disponível uma conclusão rudimentar da linha de comando, incluindo variáveis
lexicais no escopo atual, se o  PadWalker módulo estiver instalado.

Sem o suporte da Readline, você pode ver os símbolos "^ [[A", "^ [[C", "^ [[B", "^ [[B", "^ [[D" "," ^
H ", ...) ao usar as teclas de seta e / ou a tecla backspace.

Suporte do editor para depuração


Se você possui a versão do emacs do GNU instalada em seu sistema, ele pode interagir com o
depurador Perl para fornecer um ambiente de desenvolvimento de software integrado
remanescente de suas interações com os depuradores C.

Versões recentes do Emacs vêm com um arquivo inicial para fazer o emacs agir como um editor
direcionado à sintaxe que compreende (algumas) as sintaxes do Perl. Veja perlfaq3 .

Os usuários do vi também devem procurar no vim e gvim , a versão com e sem vento, para colorir
as palavras-chave do Perl.

Observe que somente o perl pode realmente analisar o Perl; portanto, todas essas ferramentas
CASE ficam um pouco abaixo da marca, especialmente se você não programar o seu Perl como um
programador em C.

O Perl Profiler
https://perldoc.perl.org/perldebug.html 16/18
31/10/2019 perldebug - perldoc.perl.org

Se você deseja fornecer um depurador alternativo para o Perl executar, chame seu script com dois
pontos e um argumento de pacote fornecido ao sinalizador -d . Os depuradores alternativos do
Perl incluem um gerador de perfil Perl, Devel :: NYTProf , que está disponível separadamente como
uma distribuição CPAN. Para criar um perfil do seu programa Perl no arquivo mycode.pl , digite:

1. $ perl - d : NYTProf mycode . pl

Quando o script termina, o criador de perfil cria um banco de dados com as informações do perfil
que você pode transformar em relatórios usando as ferramentas do criador de perfil. Veja
<perlperf> para detalhes.

Depurando expressões regulares


use re 'debug'  permite que você veja os detalhes sangrentos de como o mecanismo de
expressão regular do Perl funciona. Para entender essa saída geralmente volumosa, é necessário
não apenas ter alguma idéia sobre como a correspondência de expressões regulares funciona em
geral, mas também saber como as expressões regulares de Perl são compiladas internamente em
um autômato. Esses assuntos são explorados com alguns detalhes em Depurando expressões
regulares no perldebguts .

Depurando o uso de memória


O Perl contém suporte interno para relatar seu próprio uso de memória, mas esse é um conceito
bastante avançado que requer alguma compreensão de como funciona a alocação de
memória. Consulte Depurando o uso de memória Perl em perldebguts para obter detalhes.

VEJA TAMBÉM
Você tem e ativado, não é? use strict use warnings

perldebtut , perldebguts , re , DB , Devel :: NYTProf , Dumpvalue e perlrun .

Ao depurar um script que usa #! e, portanto, é normalmente encontrado em $ PATH, a opção -S faz
com que o perl procure por $ PATH, para que você não precise digitar o caminho
ou . which $scriptname

1. $ perl - Sd foo . pl

INSETOS
Você não pode obter informações do quadro da pilha ou de qualquer forma funções de depuração
que não foram compiladas pelo Perl, como as de extensões C ou C ++.

Se você alterar seus argumentos @_ em uma sub-rotina (como com  shift  ou  pop ), o backtrace
da pilha não mostrará os valores originais.

Atualmente, o depurador não funciona em conjunto com a opção de linha de comando -W ,


porque não está livre de avisos.

https://perldoc.perl.org/perldebug.html 17/18
31/10/2019 perldebug - perldoc.perl.org

Se você estiver em uma syscall lenta (como  wait ing,  accept ing ou  read ing do teclado ou de
um soquete) e não tiver configurado seu próprio manipulador, não poderá fazer o CTRL-C retornar
ao depurador , porque o próprio manipulador do depurador não entende que ele precisa gerar
uma exceção para longjmp (3) de syscalls lentos. $SIG{INT} $SIG{INT}

https://perldoc.perl.org/perldebug.html 18/18

Você também pode gostar