¿Depura el código C ++ en Vim? ¿Cómo?

152

La pregunta es para todas las personas que usan Vim para desarrollar aplicaciones C ++.

Hubo un período en mi vida, que se puede describir como "¡Odio a Vim!" .. "¡Vim es agradable!"

Sin embargo, habiendo crecido principalmente en IDE de desarrollo de Microsoft, me he acostumbrado a esos F5- F11accesos directos al depurar código, ventana de observación, pila de llamadas y el código principal - todo visible sin necesidad de escribir ningún comando GDB.

Así que aquí está la cuestión:

¿Utiliza Vim también para la depuración? ¿O cambias a algún IDE para este propósito? ¿Cúal?

Para aquellos que usan Vim para depurar código: ¿hay complementos para establecer puntos de interrupción en el editor, resaltar la línea que estamos depurando actualmente, navegación automática durante el paso, entrar, salir?

Por favor, no me diga que usa GDB como línea de comando, vea solo una línea que se depura, etc.

Andrew_Lvov
fuente
1
Estoy seguro de que todavía puedes encontrar personas que se están desarrollando y depurando con "ed".
e2-e4
55
Dios mío, responden preguntas "depurar mi código C ++ por favor", pero cierran esto como demasiado localizado ... ¡ridículo!
P Shved
17
Tratar gdb -tui.
Jayesh
1
¿Estás atrapado en Vim o estás dispuesto a mirar a otros editores como Emacs que tiene una gran integración de gdb incorporada? ¿El problema principal con gdb es la salida de línea única por defecto o para evitar escribir l (ist) constantemente con lo que gdb -tui ayuda?
jla
1
Superconjunto: stackoverflow.com/questions/4237817/configuring-vim-for-c Pero le insto a usar Eclipse con Vim keybindinds para la conciencia de la clase.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

76

En contraste con las otras respuestas, hay al menos tres opciones que hacen exactamente lo que necesita: clewn , pyclewn y vimgdb .

Los tres proyectos están relacionados. vimgdb es un parche contra Vim y requiere que Vim se vuelva a compilar. clewn es un programa independiente que se comunica con Vim a través de la interfaz de socket Netbeans. Esto requiere que Vim se cree con la +netbeansopción (este es el caso en las distribuciones recientes de Linux, por lo que no debería ser un problema).

Para citar del sitio web del clewn:

Clewn implementa soporte completo de gdb en el editor vim: puntos de interrupción, variables de observación, finalización de comandos gdb, ventanas de ensamblaje, etc.

Creo que definitivamente deberías intentarlo.

La página de inicio del sitio web de pyclewn muestra una comparación entre los tres proyectos.

Hace unos meses probé pyclewn. Fue un poco difícil de configurar, pero se ve bien y prometedor. Acabo de hacer algunas pruebas y podría establecer marcadores, etc., lo habitual que esperaría de un depurador gráfico. Terminé no usándolo por razones contingentes, pero estoy ansioso por intentarlo de nuevo.

UncleZeiv
fuente
66
Conque GDB es una buena alternativa. Fácil de instalar, simple y muy potente.
Druesukker
@UncleZeiv vimgdb está desactualizado. Expresé la necesidad de una actualización aquí: github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117
@Druesukker, ¡su respuesta merece una respuesta formal!
solotim
@UncleZeiv Tu enlace a vimgdb no. Debería ir a github.com/larrupingpig/vimgdb-for-vim7.4 , supongo
mcepl
2
Solo para agregar un depurador vim "like" basado en GDB - cgdb.github.io
Jimmy MG Lim
24

Vim agregó oficialmente un depurador incorporado en la versión 8.1, lanzado en mayo de 2018. La característica también había estado presente en algunas de las versiones de la versión 8.0, ya en agosto de 2017.

Los siguientes comandos vim cargan el complemento e inician el depurador.

:packadd termdebug
:Termdebug

El último comando toma un programa como argumento opcional o, alternativamente, se puede cargar un programa desde la gdbventana con el filecomando.

Con el complemento cargado, gdbse puede utilizar de forma interactiva en la ventana correspondiente. Por ejemplo, se pueden establecer puntos de interrupción, se puede pasar el código y se pueden inspeccionar las variables.

Se pueden emitir comandos Vim para interactuar con gdb. Algunos comandos relevantes incluyen :Step, :Over, :Finish, :Continue, :Stop, :Break, :Clear, y :Evaluate.

Además, hay botones en los que se puede hacer clic en la parte superior de la ventana del editor para interactuar gdb.

La ventana del editor se actualiza para reflejar el estado de la depuración. Los puntos de interrupción se indican con >>y la línea actual se resalta.

La página de ayuda integrada incluye documentación exhaustiva.

:help terminal-debug

Recientemente escribí una publicación de blog que muestra una sesión de ejemplo.

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

dannyadam
fuente
14

Vim es un buen editor, pero para hacer la depuración utilizo un depurador (como GDB).

Pero no tiene que usar GDB en modo texto; puede usar una interfaz gráfica como KDbg , DDD o Insight .

Hay formas de obtener GDB en Vim (pero luego obtienes depuración basada en texto).

Johan
fuente
10

editComando GDB

Abre un editor en la línea actual usando el comando:

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

El valor predeterminado editores ex, pero vimtambién comprende el +<current-line>formato.

Cuando abandonas el editor, vuelves a entrar gdb.

Esto le permite navegar libremente por la fuente y es especialmente potente si tiene ctagsintegración.

Esta es una integración integrada de gdb a vim de un hombre pobre: ​​lo principal que falta es establecer puntos de interrupción desde Vim.

edit y centro

editno centra Vim de forma predeterminada alrededor de la fuente, por lo que he creado un script de Python que lo hace: ¿Cómo abrir el archivo actual en la línea actual en un editor de texto de GDB?

Comando de punto de interrupción para ayuda del portapapeles

Este comando vim copia un especificador de punto de interrupción de tipo:

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

al portapapeles:

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

Entonces puedes pegar eso gdb.

Esta es la integración de vim a gdb de un hombre pobre para facilitar el establecimiento de puntos de interrupción.

Panel de GDB

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

Esto no tiene nada que ver con Vim, pero es una solución ligera que logra mucho y podría adaptarse a otros Vimmers.

Otros han mencionado GDB TUI, pero lo encontré demasiado roto y no lo suficientemente poderoso como para ser soportable.

Por lo tanto, me mudé a soluciones basadas en API de Python como GDB Dashboard.

Describí el uso y la justificación con más detalle en: vista dividida de gdb con código

Aquí hay una captura de pantalla de lo que te da:

ingrese la descripción de la imagen aquí

Ver también: /vi/2046/how-can-i-integrate-gdb-with-vim

Ríndete y usa un IDE real

Con todo lo dicho, esta es la mejor solución para la mayoría de las personas, incluido yo mismo. La mayoría de las personas solo ganarán toneladas de tiempo si pueden saltar las definiciones de una manera consciente de la clase C ++ sin seleccionar e instalar varios complementos diferentes, y eso incluye mientras se depuran los pasos. A partir de 2020, el menos peor para mí fue Eclipse: https://www.slant.co/topics/1411/~best-ides-for-c-on-linux

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
4

El uso de un depurador de nivel fuente es solo una de las muchas formas de diagnosticar el comportamiento defectuoso del programa, y ​​rara vez me encuentro lanzando uno, a pesar de que es muy fácil de hacer.

Entonces, para mí, simplemente no hay una ventaja inherente al usar un editor de texto que también resulta ser un depurador . En cambio, uso el editor de texto que prefiero, independientemente de qué depurador elijo usar. Por el momento, uso principalmente gedit y kdbg para estos fines, pero estas elecciones evolucionan de forma independiente con el tiempo.

Brent Bradburn
fuente
1
A menos que esté desarrollando remotamente en un host de desarrollo libre de kde / gnome.
user826955
3

Actualización 2020: hay un nuevo plugin vimspector que utiliza el protocolo de adaptador de depuración

  1. Instale el complemento https://github.com/puremourning/vimspector#installation

  2. Configurar (escribir .vimspector.json)

  3. Compilar con el símbolo de depuración g++ cpp.cpp -ggdb -o cpp

  4. Presione F4para iniciar la depuración

ingrese la descripción de la imagen aquí

  • Tenga .vimspector.jsonen cuenta mi en mi directorio de inicio (así que trabaje en cualquier subdirectorio)
{
"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
fuente
1

Después de haber trabajado recientemente en una aplicación durante mucho tiempo que requería un montón de cosas en su lugar en la caja en la que se estaba ejecutando (configuración del dispositivo), escribí el código en vim, tenía scripts que automatizaban la construcción, empujándola a un servidor , que tenía una secuencia de comandos allí para notar el archivo centinela junto con los binarios. Esto reiniciaría los servicios apropiados en el cuadro, y en otra ventana ssh tuve una tail -fejecución en mi archivo de registro.

En pocas palabras, no utilicé un depurador en absoluto. Si algo muriera inesperadamente, simplemente subiría los niveles de registro, lo rehacería y vería qué fue lo último que se registró antes de que muriera, luego lo analizaría y solucionaría el problema.

Lo bueno fue que cuando algo tenía problemas en un entorno de cliente, solo pedía un registro de nivel de depuración y podía identificar el problema sin siquiera requerir acceso a su servidor.

... pero sí, hubo momentos en que hubiera sido bueno tener un depurador.

Shawn D.
fuente
0

Solo para agregar a lo anterior:

IMO vim tiende a ser un editor bastante ligero y la depuración tiende a aumentar el peso. Hay formas de hacerlo, es decir, usar vim7.4 + con

:terminal

y ejecutar uno de los siguientes depuradores de línea de comandos (maldiciones). Algunos se usan por defecto para IDEs que nunca conoció. es decir, lldb = xcode.

obviamente hay más cli; @todos siéntase libre de sugerir y agregar a la lista. ¡Gracias!

Jimmy MG Lim
fuente