Como você depura sem um IDE? [fechadas]

61

Toda vez que procuro um IDE (atualmente estou mexendo no Go), encontro um tópico cheio de pessoas recomendando Vi, Emacs, Notepad ++ etc.

Eu nunca fiz nenhum desenvolvimento fora de um IDE; Acho que fui mimada. Como você depura sem um IDE? Você está limitado apenas ao registro?

ConditionRacer
fonte
53
Depuração estilo printf oldschool, tanto quanto eu sei :-)
Andrew Walters
25
Nos dias anteriores aos IDEs, usamos depuradores anexados a um processo em execução ou agrupados no processo para permitir a etapa ou introspecção do estado do programa. (gdb, perl -d, etc ...) A integração de depuradores nos IDEs torna conveniente, mas eles existem separadamente. Depuradores com falha, registro ... apenas verifique se o registro não altera o estado do programa para quando é retirado e reintroduz o bug que você estava tentando encontrar.
7
depurador de linha de comando, (vários depuradores IDE são baseadas neles)
catraca aberração
14
Devagar e com cuidado.
FrustratedWithFormsDesigner
3
Embora as impressões sejam bastante comuns, seu uso pode ocultar alguns erros mais sutis, como condições de corrida.
James

Respostas:

86

Usando um depurador. Na maioria das vezes, isso também é o que um IDE faz nos bastidores - apenas envolve a experiência em uma GUI.

No Unix, um dos depuradores mais usados ​​é o GNU gdb, que substituiu amplamente os depuradores Unix anteriores, como dbx.

Para ter uma idéia da aparência / aparência da depuração na linha de comando, consulte o manual do gdb .

Como em outras áreas, o uso de um depurador na linha de comando exige o aprendizado de uma sintaxe e de um conjunto de comandos, mas traz muita flexibilidade e capacidade de script. Por outro lado, se você já se sente à vontade trabalhando em um editor como o vim ou emacs, pode achar que seu editor favorito possui um plug-in para seu depurador favorito.

jimwise
fonte
18
+1 para "Usando um depurador". O I no IDE significa "Integrated" :)
joshin4colours
11
Se você escreve em Python, pdbé realmente melhor do que qualquer depurador IDE que eu encontrei.
asthasr
11
@syrion E ipdbé melhor do que isso;)
Izkata
Excelente - eu não sabia que existia, Izkata. Obrigado.
asthasr
@ joshin4colours integrado! = coleção, não?
Cole Johnson
35

Eu usei um depurador por vários anos enquanto escrevia drivers gráficos. Eu tinha um segundo computador que executava o depurador no primeiro (porque a tela no computador principal não funcionava quando o driver gráfico estava quebrado). Era essencial poder parar o código e ir até o ponto em que pendurei o hardware para saber o que estava acontecendo.

Para problemas puramente de software, acho que pensar sobre o problema e testar o sistema para aprender mais sobre o problema é muito mais útil do que percorrer o código linha por linha. Com as declarações de impressão, tenho uma lista de tudo o que aconteceu na linha de comando ou no arquivo de log que posso ver e reconstruir o que aconteceu, indo e voltando mais facilmente do que nunca com um depurador.

Os erros mais difíceis geralmente são resolvidos entendendo o problema longe do computador. Às vezes com um pedaço de papel ou quadro branco, e às vezes a resposta se revela enquanto estou fazendo outra coisa. Os bugs mais complicados são resolvidos observando cuidadosamente o código, como jogar Where's Waldo. Todo o resto parece mais fácil com instruções de impressão ou instruções de log.

Pessoas diferentes têm estilos diferentes, e estilos diferentes são melhores para tarefas diferentes. As instruções de impressão não são necessariamente um abandono de um depurador. Dependendo do que você está fazendo, eles podem ser ainda melhores. Especialmente em um idioma que não possui um depurador nativo (o Go?).

GlenPeterson
fonte
7
Este. Absolutamente isso. Acho que, pelo menos para mim, os problemas tendem a ser erros lógicos ou interações que um depurador não tornaria mais aparente. Você precisa entender por que algo está dando errado, não apenas o que .
Nome falso
2
+1 inteiramente para going backwards. Frequentemente, tenho a experiência: "Ei - espere, isso não é o valor certo! Como isso se tornou isso ?", E tenho que ir e voltar na saída enquanto lê o código. Depuradores são ruins para trás.
precisa saber é o seguinte
sim, o gdb é bom para examinar o núcleo despejado, mas em situações como essa, descobri que o uso gratuito de declarações impressas realmente ajudou.
Brian
Depuradores são úteis, mas efêmeros. Com uma boa estrutura de registro, acho que posso construir minha sessão de depuração. Use o depurador para ajudar a entender a situação, complementando com instruções de impressão para tornar a sessão de depuração permanente. Eu acho que com o tempo eu processar o depurador cada vez menos e se tornar mais e mais produtivo
Newtopian
Sim, pensar com um pedaço de papel ou quadro branco ou apenas na sua mente é a melhor maneira de depurar. Muitas vezes, corrige seu processo de raciocínio. Depurador às vezes é um caminho mais fácil que pode não resolver o problema original a respeito de porque erros acontecem em seu programa :)
Nishant
11

Algumas pessoas usam o gdb na linha de comando ou em um plugin . Também existem front-ends independentes da GUI para o gdb, como o DDD . Dependendo do seu idioma, existem GUIs de depurador independentes específicas do idioma, como Winpdb para python ou jswat para java. Como esses projetos se concentram apenas na depuração, geralmente são superiores aos depuradores integrados.

O outro pequeno segredo sujo sobre IDEs é que todos valem a pena: permitem especificar um editor personalizado, para que você possa usar partes do IDE para determinadas tarefas, mas use um editor decente para edição. Não é incomum iniciar apenas um IDE para usar seu depurador, especialmente se é isso que todos os seus colegas usam.

Karl Bielefeldt
fonte
11
+1 A outra opção, claro, é para definir o esquema de cores e keybinds no editor do IDE, e fingir :)
darvids0n
11
@ darvids0n, eu uso IDEs há mais de vinte anos, e ainda tenho que encontrar um com um editor que até comece a sugerir pensar em talvez algum dia sugerir que algum dia no próximo século possa pensar em tentar começar a tentar segure uma vela no GNU Emacs.
John R. Strohm
6

Alguns idiomas oferecem um REPL - ou seja, você pode escrever e executar código linha por linha enquanto o escreve, o que pode ser o primeiro passo na verificação de um trecho de código. Muitos deles também oferecem facilidades de depuração. O GHC para Haskell vem com o GHCi, que pode ser usado para depurar interativamente um programa na linha de comando, semelhante ao que um IDE faria.

CodexArcanum
fonte
2

Não entendo por que existe uma aversão à depuração com o uso de instruções printf. Houve um tempo em que demorou muito tempo para recompilar e vincular um programa, mas hoje leva apenas alguns segundos. Acho muito fácil depurar usando o tipo de saída cout, printf, qDebug () etc. As instruções Printf fornecem um histórico de tudo o que o programa fez, que você pode analisar após o fato, enquanto a execução no depurador faz com que você precise se lembrar manualmente do fluxo do programa enquanto ele é executado. Com printf, você pode converter o valor de variáveis ​​em unidades específicas, exibi-las em hexadecimal, decimal, qualquer que seja. As instruções printf podem listar os nomes das rotinas e variáveis ​​e os números das linhas também. Você pode listar apenas certos elementos da matriz, dependendo de outras variáveis. Você pode seguir indiretos. Você pode controlar a saída com muita facilidade, coloque contadores, imprima apenas determinados momentos através de um loop, adicione e remova instruções de impressão enquanto depura, possui diferentes níveis de saída de depuração, grava em arquivos etc. É muito mais fácil ver o histórico do seu programa gravado em um arquivo do que em tente se lembrar de todos os lugares pelos quais você passou manualmente e talvez precise anotar o conteúdo das variáveis ​​conforme elas mudam com o tempo, para descobrir o que o programa fez. E finalmente, com as instruções printf, você pode deixá-las permanentemente, ativadas e desativadas, para depuração futura. é muito mais fácil ver o histórico do seu programa gravado em um arquivo do que tentar lembrar todos os lugares pelos quais você percorreu manualmente e talvez precise anotar o conteúdo das variáveis ​​à medida que elas mudam ao longo do tempo, para descobrir o que o programa foi feito. E finalmente, com as instruções printf, você pode deixá-las permanentemente, ativadas e desativadas, para depuração futura. é muito mais fácil ver o histórico do seu programa gravado em um arquivo do que tentar lembrar todos os lugares pelos quais você percorreu manualmente e talvez precise anotar o conteúdo das variáveis ​​à medida que elas mudam ao longo do tempo, para descobrir o que o programa foi feito. E finalmente, com as instruções printf, você pode deixá-las permanentemente, ativadas e desativadas, para depuração futura.

Robert Felten
fonte
3
"Houve um tempo em que demorou muito tempo para recompilar e vincular um programa, mas hoje leva apenas alguns segundos". Depende do seu idioma e tamanho do projeto. Se eu mudar um arquivo de cabeçalho no meu projeto atual, vai demorar cerca de 65 minutos para recriar em uma máquina de 32 CPU com 256 GB RAM (não estou brincando)
Nemanja Trifunovic
As pessoas não têm "aversão" à depuração com instruções de impressão, apenas preferem um depurador. Conheço muito mais "pessoas printf" que nunca usam depuradores do que "pessoas depuradoras" que nunca depuram usando printfs.
Karl Bielefeldt
11
É surpreendentemente difícil usar um depurador para um sistema suficientemente distribuído, mas é possível (com alguma imprecisão devido a um problema de sincronização do relógio) correlacionar logs. Se o seu sistema de software for composto de binários executados em 100 máquinas diferentes, os logs / "printf debugging" podem ser mais fáceis do que usar depuradores e tentar manter tudo em uma etapa de bloqueio suficiente para que você não esteja introduzindo outros problemas.
Vatine 19/05/19
2

jimwise respondeu muito bem à pergunta, mas pensei em acrescentar que, caso você opte por trabalhar sem um IDE completo, o Microsoft que fornece o depurador de linha de comando para Windows é chamado CDB . O CDB vem com várias outras ferramentas, incluindo o WinDBG, que é o equivalente da GUI, quando você baixa o Windows SDK.

Drew Marsh
fonte
4
você poderia explicar com mais detalhes como isso responde à pergunta?
Gnat
Você está certo, por si só, não responde à pergunta. Eu senti que a resposta do @ jimwise era uma boa resposta para a pergunta, mas não incluía nenhuma informação sobre onde encontrar um depurador de linha de comando para Windows. Por isso, pensei em aderir a uma resposta adicional para aqueles que se deparam com isso e me pergunto como fazê-lo no Windows. Vou atualizar minha resposta para dizer o mesmo.
Drew Marsh
2

Normalmente, não uso um depurador, talvez uma vez a cada duas semanas, mas não é a primeira coisa que vou.

A ferramenta mais importante no meu trabalho é tão onipresente que quase me esqueci de mencioná-la - empilhar rastreamentos. Mais de 90% dos problemas que encontro podem ser resolvidos examinando um rastreamento de pilha. Essa ferramenta nem sempre é muito útil, dependendo do seu idioma, mas quando eles são implementados bem por um idioma, você pode economizar uma quantidade incrível de tempo.

Acho que a segunda maneira mais comum de detectar problemas simples é que provavelmente é o código que acabei de alterar. Eu executo testes de unidade com frequência, então geralmente sei o que acabei de quebrar.

Para desenvolvimento e depuração mais complexos, posso adicionar algumas instruções de log no nível de depuração ou rastreamento. Considero os problemas de desenvolvimento um bom guia para me ajudar a colocar informações de log de rastreamento / depuração da produção, o que me leva a:

Você nem sempre tem um depurador à mão. Na produção, pode ser impossível executar um depurador (Heck, pode ser impossível acessar as máquinas de produção, exceto os logs, dependendo da segurança da sua empresa). Também existem idiomas nos quais conectar um depurador leva muito tempo ou talvez não haja bons depuradores disponíveis.

Se você estiver codificando o tempo todo usando o log de nível de lógica e depuração / rastreamento, pode ser simplesmente o caso de examinar suas excelentes instruções de log (possivelmente aumentando o nível de log) para descobrir o problema sem acessar o hardware.

Embora eu ache que os depuradores são uma ferramenta poderosa, não permita que eles sejam a única ferramenta na sua caixa de ferramentas!

Bill K
fonte
1

Não há razão para que você não possa usar o depurador em um IDE ao lado de um editor de texto independente. Eu costumava usar o! Zap para editar, o JBuilder para depurar em outra máquina e um servidor de arquivos no porão. Tradicionalmente, depuradores eram programas independentes sem arrastar ao longo de um IDE, e isso também funciona.

Vale notar que testes abrangentes substituem a depuração. Vale a pena considerar um bug relatado como sendo um bug nos seus testes e não no seu código.

Há também printf. Pode ser útil criar uma grande quantidade de "log" e pesquisar por ele, em vez de parar para cada linha. Acho particularmente útil se você pode modificar classes de bibliotecas que você não seria capaz de modificar em produção, por exemplo, usando -Xbootclasspath/p:para hackear classes de bibliotecas Java.

Tom Hawtin - linha de orientação
fonte
"Vale a pena notar que testes abrangentes substituem a depuração". - Eu diria que reduz, ao invés de "desloca". Existem ocasiões definidas em que a execução de código através de um depurador é benéfica, mesmo ao executar TDD - por exemplo, quando um teste fornece um resultado completamente inesperado, descobrir exatamente onde deu errado pode ser muito útil - é certo, a menos que esteja no pequeno pedaço do código que você acabou de escrever, isso significa que você perdeu um caso crítico nos testes anteriores, mas isso acontece ... #
197 Jules
1

Concorde que o melhor dos problemas pode ser resolvido fora do computador com caneta e papel ou apenas pensando no problema. Isso é mais útil do que usar depuradores ao vivo. Muitas vezes, corrige seu processo de raciocínio.

Você pode usar o pudb, que é um console baseado em uma interface de usuário simples. Você pode escolher seu depurador preferido, como pdb ou ipdb, se desejar inserir um REPL e examinar com mais detalhes.

Além disso, consulte o PythonDebuggingTools Wiki para obter uma coleção mais abrangente de ferramentas disponíveis.

Nishant
fonte
A pergunta original era sobre Go, não Python.
TMN
Certo, eu perdi isso de alguma forma. Ele apareceu na minha pesquisa quando eu estava procurando por um depurador Python.
Nishant