[c++] Vim에서 C ++ 코드를 디버깅합니까? 어떻게?

문제는 Vim을 사용하여 C ++ 응용 프로그램을 개발하는 모든 사람들에게 있습니다.

내 인생에는 ‘나는 Vim을 싫어한다 !!!’라고 표현 될 수있는 기간이 있었다.

그러나 대부분의 Microsoft 개발 십오 일에, 나는 사람들에게 익숙해했습니다 성장하는 데 F5F11바로 가기를 코드, 시계 창, 호출 스택 및 주요 코드를 디버깅 할 때 – 어떤 GDB 명령을 입력 할 필요없이 모두 볼 수 있습니다.

그래서 여기에 질문이 있습니다 :

디버깅에도 Vim을 사용합니까? 아니면이 목적으로 일부 IDE로 전환합니까? 어느 것?

Vim을 사용하여 코드를 디버깅하는 사람들을 위해 : 편집기에서 중단 점을 설정하는 플러그인이 있습니까? 현재 디버깅중인 줄, 강조 표시하는 단계, 단계 시작, 단계 종료를 강조 표시합니까?

명령 줄로 GDB를 사용한다고 말하지 말고 디버깅 된 한 줄만 참조하십시오.



답변

다른 답변과 달리, clewn , pyclewnvimgdb같은 세 가지 옵션 만 있으면 됩니다.

세 프로젝트 모두 관련되어 있습니다. vimgdb 는 Vim에 대한 패치이며 Vim을 다시 컴파일해야합니다. clewn 은 Netbeans 소켓 인터페이스를 통해 Vim과 통신하는 독립형 프로그램입니다. 이를 위해서는 Vim을 +netbeans옵션 으로 빌드해야합니다 (최근 Linux 배포판의 경우 문제가되지 않습니다).

직원의 웹 사이트에서 인용하려면 :

Clewn은 vim 편집기에서 중단 점, 감시 변수, gdb 명령 완료, 어셈블리 창 등 전체 gdb 지원을 구현합니다.

나는 당신이 분명히 그것을 가야한다고 생각합니다.

pyclewn 웹 사이트의 홈페이지는 세 프로젝트 간의 비교를 보여줍니다.

몇 달 전에 나는 pyclewn을 시도했다. 설정하기가 조금 어려웠지만, 유망하고 유망하지만 잘 보입니다. 방금 몇 가지 테스트를 수행했으며 그래픽 디버거에서 기대할 수있는 일반적인 항목 등 북마크를 설정할 수 있습니다. 나는 우연한 이유로 그것을 사용하지 않았지만 다른 시도를하고 싶습니다.


답변

Vim은 2018 년 5 월에 릴리스 된 버전 8.1에 공식적으로 내장 디버거를 추가했습니다.이 기능은 2017 년 8 월 초에 일부 버전 8.0 릴리스에서도 제공되었습니다.

다음 vim 명령은 플러그인을로드하고 디버거를 시작합니다.

:packadd termdebug
:Termdebug

후자의 명령은 프로그램을 선택적 인수로 사용하거나 명령 을 사용하여 gdb창 에서 프로그램을로드 할 수 있습니다 file.

플러그인을로드 gdb하면 해당 창에서 대화식으로 사용할 수 있습니다. 예를 들어 중단 점을 설정하고 코드를 단계별로 실행하며 변수를 검사 할 수 있습니다.

와 상호 작용하기 위해 Vim 명령을 실행할 수 있습니다 gdb. 일부 관련 명령을 포함 :Step, :Over, :Finish, :Continue, :Stop, :Break, :Clear,와 :Evaluate.

또한 편집기 창 상단에는와 상호 작용할 수있는 클릭 가능한 버튼이 있습니다 gdb.

편집기 상태가 디버깅 상태를 반영하여 업데이트됩니다. 중단 점이 표시되고 >>현재 줄이 강조 표시됩니다.

내장 된 도움말 페이지에는 철저한 설명서가 포함되어 있습니다.

:help terminal-debug

최근에 예제 세션을 진행하는 블로그 게시물을 작성했습니다.

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


답변

Vim은 훌륭한 편집기이지만 디버깅을 위해 디버거 (예 : GDB)를 사용합니다.

그러나 텍스트 모드에서 GDB를 사용할 필요는 없습니다. KDbg , DDD 또는 Insight 와 같은 그래픽 프론트 엔드를 사용할 수 있습니다 .

GDB를 Vim으로 가져 오는 방법이 있지만 텍스트 기반 디버깅을 얻을 수 있습니다.


답변

GDB edit명령

다음 명령을 사용하여 현재 줄에서 편집기를 엽니 다.

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

기본값 editor은입니다 ex만 형식 vim도 이해 +<current-line>합니다.

편집기를 종료하면로 돌아갑니다 gdb.

이를 통해 소스를 자유롭게 탐색 할 수 있으며 ctags통합 된 경우 특히 강력합니다 .

이것은 빈약 한 사람의 내장 gdb-vim 통합 방법입니다. 가장 중요한 것은 Vim에서 중단 점을 설정하는 것입니다.

edit 그리고 중심

edit소스를 중심으로 Vim을 중심에 두지 않으므로 파이썬 스크립트를 만들었습니다 .GDB 의 텍스트 편집기에서 현재 줄의 현재 파일을 여는 방법은 무엇입니까?

클립 보드 도우미에 대한 중단 점 명령

이 vim 명령은 다음 유형의 중단 점 지정자를 복사합니다.

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

클립 보드로 :

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

그런 다음에 붙여 넣을 수 있습니다 gdb.

이것은 중단 점을 쉽게 설정하기 위해 gdb에 대한 빈약 한 사람의 vim 통합입니다.

GDB 대시 보드

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

이것은 Vim과 아무 관련이 없지만, 많은 성과를 거두고 다른 Vimmer에 적합 할 수있는 가벼운 솔루션입니다.

다른 사람들은 GDB TUI에 대해 언급했지만 너무 깨져 견딜 수 없을 정도로 강력하지는 않다는 것을 알았습니다.

그래서 대신 GDB Dashboard와 같은 Python API 기반 솔루션으로 옮겼습니다.

나는 gdb split view with code 에서 사용 및 이론적 근거를 더 자세히 설명했다.

다음은 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

참조 : /vi/2046/how-can-i-integrate-gdb-with-vim

실제 IDE 포기 및 사용

말한 바와 같이, 이것은 나 자신을 포함한 대부분의 사람들에게 최고의 솔루션입니다. 대부분의 사람들은 몇 가지 다른 플러그인을 스스로 선택하고 설치하지 않고 C ++ 클래스 인식 방식으로 정의를 뛰어 넘을 수 있다면 많은 시간을 얻습니다. 2020 년 현재 저에게 가장 최악은 Eclipse였습니다 : https://www.slant.co/topics/1411/~best-ides-for-c-on-linux


답변

소스 레벨 디버거를 사용하는 것은 잘못된 프로그램 동작을 진단하는 많은 방법 중 하나 일 뿐이며, 매우 쉬운 방법에도 불구하고 자신을 시작하는 경우는 거의 없습니다.

따라서 저에게 디버거이기도 한 텍스트 편집기를 사용하는 것의 장점은 없습니다 . 대신, 내가 선택한 디버거에 관계없이 내가 선호하는 텍스트 편집기를 사용합니다. 현재, 나는 주로 이러한 목적으로 geditkdbg 를 사용 하지만 이러한 선택은 시간이 지남에 따라 독립적으로 진화합니다.


답변

업데이트 2020 : 디버그 어댑터 프로토콜을 사용 하는 새로운 플러그인 Vimspector 가 있습니다

  1. 플러그인 https://github.com/puremourning/vimspector#installation을 설치 하십시오.

  2. 구성 (쓰기 .vimspector.json)

  3. 디버그 기호로 컴파일 g++ cpp.cpp -ggdb -o cpp

  4. 눌러서 F4디버그 시작

여기에 이미지 설명을 입력하십시오

  • 참고 내 .vimspector.json홈 디렉토리에 (모든 하위 디렉터리에서 작업 때문에)
{
"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"
    }
  }
} }


답변

최근에 오랫동안 응용 프로그램에서 작업 한 상자에 많은 물건을 배치해야했지만 (기기 설정) vim에 코드를 작성하고 스크립트를 작성하여 건물을 자동화하여 서버로 푸시했습니다. , 센티넬 파일이 바이너리와 함께 푸시되었음을 알리는 스크립트가 있습니다. 그러면 상자에서 적절한 서비스가 다시 시작되고 다른 ssh 창 tail -f에서 로그 파일 에서 실행 중이었습니다.

간단히 말해 디버거를 전혀 사용하지 않았습니다. 예기치 않게 죽는 것이 있으면 로깅 수준을 높이고 다시 실행 한 다음 마지막으로 기록 된 것이 무엇인지 확인한 다음 분석하고 문제를 해결합니다.

좋은 점은 고객 환경에서 문제가 발생했을 때 디버그 수준 로그를 요청하고 서버에 액세스하지 않고도 문제를 식별 할 수 있다는 것입니다.

…하지만 예, 디버거를 사용하는 것이 좋을 때가있었습니다.