Você depura código C ++ no Vim? Quão?

152

A questão é para todas as pessoas que usam o Vim para desenvolver aplicativos C ++.

Houve um período em minha vida, que pode ser descrito como 'Eu odeio Vim !!!' .. 'Vim é legal!'

No entanto, tendo crescido principalmente nos IDEs de desenvolvimento da Microsoft, eu me acostumei a esses F5- F11atalhos ao depurar código, janela de observação, pilha de chamadas e código principal - todos visíveis sem a necessidade de digitar nenhum comando GDB.

Então aqui está a questão:

Você usa o Vim também para depuração? Ou você muda para algum IDE para esse fim? Qual?

Para aqueles que usam o Vim para depurar código: existem plugins para definir pontos de interrupção no editor, realce a linha que estamos depurando atualmente, navegação automática durante a etapa, passo a passo, passo a passo?

Por favor, não me diga que você usa o GDB como linha de comando, veja apenas uma linha que está depurada, etc.

Andrew_Lvov
fonte
1
Tenho certeza que você ainda pode encontrar pessoas desenvolvendo e depurando com "ed".
e2-e4
55
Oh meu Deus, eles respondem perguntas "depurar meu código C ++ plz", mas fecham isso como muito localizado ... ridículo!
usar o seguinte comando
17
Tente gdb -tui.
Jayesh
1
Você está preso no Vim ou está disposto a procurar outros editores como o Emacs, que possui uma grande integração de gdb integrada? O principal problema do gdb é a saída de linha única por padrão ou para evitar digitar l (ist) constantemente com o qual o gdb -tui ajuda?
JLA
1
Superset: stackoverflow.com/questions/4237817/configuring-vim-for-c Mas peço que você use o Eclipse com as teclas de atalho do Vim para a conscientização da classe.
Ciro Santilli # 28/19

Respostas:

76

Em contraste com as outras respostas, há pelo menos três opções que fazem exatamente o que você precisa: clewn , pyclewn e vimgdb .

Todos os três projetos estão relacionados. O vimgdb é um patch contra o Vim e requer que o Vim seja recompilado. O clewn é um programa independente que se comunica com o Vim por meio da interface de soquete do Netbeans. Isso requer que o Vim seja construído com a +netbeansopção (este é o caso nas distribuições recentes do Linux, portanto não deve ser um problema).

Para citar o site do clewn:

O Clewn implementa suporte completo a gdb no editor vim: pontos de interrupção, variáveis ​​de observação, conclusão de comandos gdb, janelas de montagem etc.

Eu acho que você definitivamente deveria tentar.

A página inicial do site da pyclewn mostra uma comparação entre os três projetos.

Alguns meses atrás eu tentei pyclewn. Foi um pouco difícil de configurar, mas parece bem promissor. Acabei de fazer alguns testes e você pode definir marcadores, etc., as coisas comuns que você esperaria de um depurador gráfico. Acabei por não usá-lo por motivos contingentes, mas estou ansioso para tentar novamente.

UncleZeiv
fonte
6
O Conque GDB é uma boa alternativa. Fácil de instalar, simples e muito poderoso.
Druesukker
@UncleZeiv vimgdb está desatualizado. Eu expressei a necessidade de uma atualização aqui: github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117
@Druesukker, sua resposta merece uma resposta formal!
Solotim
@UncleZeiv Seu link para vimgdb não. Ele deve ir para github.com/larrupingpig/vimgdb-for-vim7.4 , eu acho
mcepl
2
Apenas para adicionar um depurador vim "like" baseado no GDB - cgdb.github.io
Jimmy MG Lim
24

O Vim adicionou um depurador embutido oficialmente na versão 8.1, lançada em maio de 2018. O recurso também estava presente em alguns dos lançamentos da versão 8.0, já em agosto de 2017.

Os seguintes comandos vim carregam o plug-in e iniciam o depurador.

:packadd termdebug
:Termdebug

O último comando aceita um programa como argumento opcional ou, alternativamente, um programa pode ser carregado da gdbjanela com o filecomando

Com o plugin carregado, gdbpode ser usado interativamente na janela correspondente. Por exemplo, pontos de interrupção podem ser definidos, código pode ser percorrido e variáveis ​​podem ser inspecionadas.

Os comandos do Vim podem ser emitidos para interagir com gdb. Alguns comandos relevantes incluem :Step, :Over, :Finish, :Continue, :Stop, :Break, :Clear, e :Evaluate.

Além disso, existem botões clicáveis ​​na parte superior da janela do editor para interagir gdb.

A janela do editor é atualizada para refletir o estado da depuração. Os pontos de interrupção são indicados com >>e a linha atual é destacada.

A página de ajuda interna inclui documentação completa.

:help terminal-debug

Recentemente, escrevi uma postagem no blog que mostra uma sessão de exemplo.

https://www.dannyadam.com/blog/2019/05/debugging-in-vim/

dannyadam
fonte
14

O Vim é um bom editor, mas para depurar eu uso um depurador (como o GDB).

Mas você não precisa usar o GDB no modo de texto; você pode usar um front-end gráfico como KDbg , DDD ou Insight .

Existem maneiras de obter o GDB no Vim (mas você obtém a depuração baseada em texto).

Johan
fonte
10

editComando GDB

Abre um editor na linha atual usando o comando:

$EDITOR +<current-line> <current-file>

O padrão editoré ex, mas vimtambém entende o +<current-line>formato.

Ao sair do editor, você volta ao gdb.

Isso permite que você navegue livremente na fonte e é especialmente poderoso se você tiver ctagsintegração.

Essa é a integração do gdb para o vim de um pobre homem: a principal coisa que falta é definir pontos de interrupção no Vim.

edit e centro

editpor padrão, não centraliza o Vim em torno da fonte, por isso criei um script Python que faz isso: Como abrir o arquivo atual na linha atual em um editor de texto do GDB?

Comando do ponto de interrupção para o auxiliar da área de transferência

Este comando vim copia um especificador de ponto de interrupção do tipo:

b <file-path>:<line-number>

para a área de transferência:

command! Xg :let @+ = 'b ' . expand('%:p') . ':' . line('.')

Então você pode simplesmente colar isso gdb.

Essa é a integração do vim com o gdb para facilitar a definição de pontos de interrupção.

Painel GDB

https://github.com/cyrus-and/gdb-dashboard

Isso não tem nada a ver com o Vim, mas é uma solução leve que alcança muito e pode se adequar a outros Vimmers por aí.

Outros mencionaram o GDB TUI, mas eu o achei muito quebrado e não poderoso o suficiente para ser suportável.

Então, mudei para soluções baseadas em API Python, como o GDB Dashboard.

Descrevi usado e justificativa com mais detalhes em: exibição dividida gdb com código

Aqui está uma captura de tela do que ele oferece:

insira a descrição da imagem aqui

Consulte também: /vi/2046/how-can-i-integrate-gdb-with-vim

Desista e use um IDE real

Com tudo isso dito, esta é a melhor solução para a maioria das pessoas, inclusive eu. A maioria das pessoas ganhará muito tempo se puder pular as definições de maneira ciente da classe C ++ sem selecionar e instalar vários plugins diferentes, e isso inclui etapas de depuração. Em 2020, o pior para mim foi o Eclipse: https://www.slant.co/topics/1411/~best-ides-for-c-on-linux

Ciro Santilli adicionou uma nova foto
fonte
4

O uso de um depurador no nível da fonte é apenas uma das muitas maneiras de diagnosticar o comportamento defeituoso do programa, e raramente me vejo iniciando um - apesar do fato de ser muito fácil de fazer.

Portanto, para mim, simplesmente não há vantagem inerente ao uso de um editor de texto que também é um depurador . Em vez disso, eu uso o editor de texto que eu prefiro - independentemente do depurador que eu escolher usar. No momento, uso principalmente o gedit e o kdbg para esses fins, mas essas opções evoluem de forma independente ao longo do tempo.

Brent Bradburn
fonte
1
A menos que você esteja desenvolvendo remotamente em um host de desenvolvimento sem kde / gnome.
user826955
3

Atualização 2020: Há um novo plugin vimspector usando o Debug Adapter Protocol

  1. Instale o plug-in https://github.com/puremourning/vimspector#installation

  2. Configurar (gravar .vimspector.json)

  3. Compilar com o símbolo de depuração g++ cpp.cpp -ggdb -o cpp

  4. Pressione F4para iniciar a depuração

insira a descrição da imagem aqui

  • Observe meu .vimspector.jsonno meu diretório pessoal (então trabalhe em qualquer subdiretório)
{
"configurations": {
  "Python - Launch": {
    "adapter": "vscode-python",
    "configuration": {
      "name": "Python: Launch current file",
      "type": "python",
      "request": "launch",
      "stopOnEntry": true,
      "stopAtEntry": true,
      "console": "externalTerminal",
      "debugOptions": [],
      "cwd": "${cwd}",
      "program": "${file}"
    }
  },
  "Perl - Launch": {
    "adapter": "vscode-perl-debug",
    "configuration": {
      "name": "Perl: Launch current file",
      "type": "perl",
      "request": "launch",
      "exec": "/usr/bin/env perl",
      "execArgs": [],
      "stopOnEntry": true,
      "stopAtEntry": true,
      "console": "externalTerminal",
      "sessions": "single",
      "debugOptions": [],
      "cwd": "${cwd}",
      "program": "${file}"
    }
  },
  "C - Launch": {
    "adapter": "vscode-cpptools",
    "configuration": {
      "name": "Cpp: Launch current file",
      "type": "cppdbg",
      "request": "launch",
      "externalConsole": true,
      "logging": {
        "engineLogging": true
      },
      "stopOnEntry": true,
      "stopAtEntry": true,
      "debugOptions": [],
      "MIMode": "gdb",
      "cwd": "${cwd}",
      "program": "${fileDirname}/${fileBasenameNoExtension}"
    }
  },
  "Java - Launch": {
    "adapter": "vscode-java",
    "configuration": {
      "name": "Java: Launch current file",
      "request": "launch",
      "mainClass": "com.vimspector.test.TestApplication",
      "sourcePaths": [ "${workspaceRoot}/src/main/java" ],
      "classPaths": [ "${workspaceRoot}/target/classes" ],
      "args": "hello world!",
      "stopOnEntry": true,
      "console": "integratedTerminal"
    }
  }
} }
Tinmarino
fonte
1

Tendo trabalhado recentemente em um aplicativo por um longo tempo que exigia um monte de coisas para serem instaladas na caixa em que estava sendo executado (configuração do dispositivo), escrevi código no vim, tinha scripts que automatizavam a construção, enviando-o para um servidor , que tinha um script para observar o arquivo sentinela enviado juntamente com os binários. Isso reiniciaria os serviços apropriados na caixa e, em outra janela ssh, eu tail -fcorria no meu arquivo de log.

Para encurtar a história, eu não usei um depurador. Se algo tivesse morrido inesperadamente, eu aumentaria os níveis de registro, refizê-lo e veria qual foi a última coisa registrada antes que ele morresse, depois analise e corrija o problema.

O bom era que, quando algo apresentava problemas no ambiente do cliente, eu apenas solicitava um log no nível de Depuração e podia identificar o problema sem precisar sequer acessar o servidor.

... mas sim, houve momentos em que seria bom ter um depurador.

Shawn D.
fonte
0

Apenas para adicionar acima:

O IMO vim tende a ser um editor bastante leve e a depuração tende a aumentar o peso. Existem maneiras de fazer isso, ou seja, usando o vim7.4 + com

:terminal

e executando um dos seguintes depuradores da linha de comando (maldições). Alguns são usados ​​por padrão para IDEs que você nunca conheceu. ou seja, lldb = xcode.

Obviamente, existem mais cli; @all sinta-se livre para sugerir e adicionar à lista. obrigado!

Jimmy MG Lim
fonte