[c++] Vim에서 C ++ 코드를 디버깅합니까? 어떻게?
문제는 Vim을 사용하여 C ++ 응용 프로그램을 개발하는 모든 사람들에게 있습니다.
내 인생에는 ‘나는 Vim을 싫어한다 !!!’라고 표현 될 수있는 기간이 있었다.
그러나 대부분의 Microsoft 개발 십오 일에, 나는 사람들에게 익숙해했습니다 성장하는 데 F5– F11바로 가기를 코드, 시계 창, 호출 스택 및 주요 코드를 디버깅 할 때 – 어떤 GDB 명령을 입력 할 필요없이 모두 볼 수 있습니다.
그래서 여기에 질문이 있습니다 :
디버깅에도 Vim을 사용합니까? 아니면이 목적으로 일부 IDE로 전환합니까? 어느 것?
Vim을 사용하여 코드를 디버깅하는 사람들을 위해 : 편집기에서 중단 점을 설정하는 플러그인이 있습니까? 현재 디버깅중인 줄, 강조 표시하는 단계, 단계 시작, 단계 종료를 강조 표시합니까?
명령 줄로 GDB를 사용한다고 말하지 말고 디버깅 된 한 줄만 참조하십시오.
답변
다른 답변과 달리, clewn , pyclewn 및 vimgdb 와 같은 세 가지 옵션 만 있으면 됩니다.
세 프로젝트 모두 관련되어 있습니다. 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
최근에 예제 세션을 진행하는 블로그 게시물을 작성했습니다.
답변
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
답변
소스 레벨 디버거를 사용하는 것은 잘못된 프로그램 동작을 진단하는 많은 방법 중 하나 일 뿐이며, 매우 쉬운 방법에도 불구하고 자신을 시작하는 경우는 거의 없습니다.
따라서 저에게 디버거이기도 한 텍스트 편집기를 사용하는 것의 장점은 없습니다 . 대신, 내가 선택한 디버거에 관계없이 내가 선호하는 텍스트 편집기를 사용합니다. 현재, 나는 주로 이러한 목적으로 gedit 와 kdbg 를 사용 하지만 이러한 선택은 시간이 지남에 따라 독립적으로 진화합니다.
답변
업데이트 2020 : 디버그 어댑터 프로토콜을 사용 하는 새로운 플러그인 Vimspector 가 있습니다
-
플러그인 https://github.com/puremourning/vimspector#installation을 설치 하십시오.
-
구성 (쓰기
.vimspector.json
) -
디버그 기호로 컴파일
g++ cpp.cpp -ggdb -o cpp
-
눌러서
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
에서 로그 파일 에서 실행 중이었습니다.
간단히 말해 디버거를 전혀 사용하지 않았습니다. 예기치 않게 죽는 것이 있으면 로깅 수준을 높이고 다시 실행 한 다음 마지막으로 기록 된 것이 무엇인지 확인한 다음 분석하고 문제를 해결합니다.
좋은 점은 고객 환경에서 문제가 발생했을 때 디버그 수준 로그를 요청하고 서버에 액세스하지 않고도 문제를 식별 할 수 있다는 것입니다.
…하지만 예, 디버거를 사용하는 것이 좋을 때가있었습니다.