Bạn có gỡ lỗi mã C ++ trong Vim không? Làm sao?


152

Câu hỏi là tất cả những người bạn, những người sử dụng Vim để phát triển các ứng dụng C ++.

Có một khoảng thời gian trong cuộc đời tôi, có thể được mô tả là 'Tôi ghét Vim !!!' .. 'Vim thật tuyệt!'

Tuy nhiên, đã phát triển chủ yếu trên các IDE phát triển của Microsoft, tôi đã quen với những điều đó F5- các F11phím tắt khi gỡ lỗi mã, cửa sổ xem, ngăn xếp cuộc gọi và mã chính - tất cả đều hiển thị mà không cần phải nhập bất kỳ lệnh GDB nào.

Vì vậy, đây là câu hỏi:

Bạn có sử dụng Vim để gỡ lỗi không? Hay bạn chuyển sang một số IDE cho mục đích này? Cái nào?

Đối với những người sử dụng Vim để gỡ lỗi mã: có plugin nào để đặt điểm dừng trong trình chỉnh sửa không, hãy tô sáng dòng chúng tôi hiện đang gỡ lỗi, tự động điều hướng trong bước, bước vào, bước ra?

Xin vui lòng, đừng nói với tôi rằng bạn sử dụng GDB làm dòng lệnh, chỉ xem một dòng được gỡ lỗi, v.v.


1
Tôi chắc rằng bạn vẫn có thể tìm thấy những người đang phát triển và gỡ lỗi bằng "ed".
e2-e4

55
Ôi chúa ơi, họ trả lời câu hỏi "gỡ lỗi mã C ++ của tôi", nhưng đóng cái này lại quá cục bộ ... lố bịch!
P Shved

17
Hãy thử gdb -tui.
Jayesh

1
Bạn có bị mắc kẹt trên Vim hoặc sẵn sàng xem xét các trình soạn thảo khác như Emacs có tích hợp gdb tuyệt vời không? Có phải vấn đề chính với gdb là đầu ra dòng đơn theo mặc định hoặc để tránh gõ l (ist) liên tục mà gdb -tui giúp với?
JLA

1
Superset: stackoverflow.com/questions/4237817/configuring-vim-for-c Nhưng tôi khuyên bạn nên sử dụng Eclipse với các phím bấm Vim để nhận thức về lớp.
Ciro Santilli 郝海东 冠状 病 事件

Câu trả lời:


76

Ngược lại với các câu trả lời khác, có ít nhất ba tùy chọn thực hiện đúng những gì bạn yêu cầu: clewn , pyclwnvimgdb .

Cả ba dự án đều liên quan. vimgdb là một bản vá chống lại Vim và yêu cầu Vim phải được biên dịch lại. clewn là một chương trình độc lập giao tiếp với Vim thông qua giao diện ổ cắm Netbeans. Điều này đòi hỏi Vim phải được xây dựng với +netbeanstùy chọn (đây là trường hợp trong các bản phân phối Linux gần đây nên không phải là vấn đề).

Để trích dẫn từ trang web của clewn:

Clewn thực hiện hỗ trợ gdb đầy đủ trong trình soạn thảo vim: điểm dừng, biến xem, hoàn thành lệnh gdb, cửa sổ lắp ráp, v.v.

Tôi nghĩ bạn chắc chắn nên cho nó đi.

Trang chủ của trang web pyclwn cho thấy sự so sánh giữa ba dự án.

Một vài tháng trước tôi đã thử pyclwn. Có một chút khó khăn để thiết lập, nhưng nó có vẻ tốt và đầy hứa hẹn. Tôi vừa thực hiện một số thử nghiệm và bạn có thể đặt dấu trang, v.v., những thứ thông thường bạn mong đợi từ trình gỡ lỗi đồ họa. Tôi cuối cùng đã không sử dụng nó vì lý do ngẫu nhiên nhưng tôi muốn thử lại lần nữa.


6
Conque GDB là một thay thế tốt đẹp. Dễ dàng cài đặt, đơn giản và rất mạnh mẽ.
Druesukker

@UncleZeiv vimgdb đã lỗi thời. Tôi bày tỏ sự cần thiết phải cập nhật tại đây: github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117

@Druesukker, câu trả lời của bạn xứng đáng có câu trả lời chính thức!
solotim

@UncleZeiv Liên kết của bạn đến vimgdb không. Nó nên truy cập github.com/larrupingpig/vimgdb-for-vim7.4 , tôi đoán
mcepl

2
Chỉ cần thêm trình gỡ lỗi "thích" vim dựa trên GDB - cgdb.github.io
Jimmy MG Lim

24

Vim đã thêm một trình gỡ lỗi tích hợp chính thức trong phiên bản 8.1, được phát hành vào tháng 5 năm 2018. Tính năng này đã có mặt trong một số phiên bản 8.0 cũng như vào đầu tháng 8 năm 2017.

Các lệnh vim sau đây tải plugin và khởi động trình gỡ lỗi.

:packadd termdebug
:Termdebug

Lệnh sau lấy một chương trình làm đối số tùy chọn hoặc thay vào đó, một chương trình có thể được tải từ gdbcửa sổ bằng filelệnh.

Với plugin được tải, gdbcó thể được sử dụng tương tác trong cửa sổ tương ứng. Ví dụ: các điểm dừng có thể được đặt, mã có thể được chuyển qua và các biến có thể được kiểm tra.

Các lệnh Vim có thể được ban hành để tương tác với gdb. Một số lệnh liên quan bao gồm :Step, :Over, :Finish, :Continue, :Stop, :Break, :Clear, và :Evaluate.

Ngoài ra, có các nút có thể nhấp ở đầu cửa sổ soạn thảo để tương tác gdb.

Cửa sổ soạn thảo được cập nhật để phản ánh trạng thái gỡ lỗi. Điểm dừng được chỉ định bằng >>và dòng hiện tại được tô sáng.

Trang trợ giúp tích hợp bao gồm tài liệu kỹ lưỡng.

:help terminal-debug

Gần đây tôi đã viết một bài đăng trên blog thông qua một phiên ví dụ.

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


14

Vim là một trình soạn thảo đẹp, nhưng để gỡ lỗi, tôi sử dụng trình gỡ lỗi (như GDB).

Nhưng bạn không phải sử dụng GDB ở chế độ văn bản; bạn có thể sử dụng lối vào đồ họa như KDbg , DDD hoặc Insight .

Có nhiều cách để đưa GDB vào Vim (nhưng sau đó bạn có được gỡ lỗi dựa trên văn bản).


10

editLệnh GDB

Mở trình soạn thảo trên dòng hiện tại bằng lệnh:

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

Mặc định editorex, nhưng vimcũng hiểu +<current-line>định dạng.

Khi bạn thoát khỏi trình soạn thảo, bạn sẽ quay lại gdb.

Điều này cho phép bạn duyệt nguồn một cách tự do và đặc biệt mạnh mẽ nếu bạn có ctagstích hợp.

Đây là một cách tích hợp gdb một chiều của một người nghèo để tích hợp vim: điều còn thiếu chính là thiết lập các điểm dừng từ Vim.

edit và trung tâm

editkhông mặc định trung tâm Vim xung quanh nguồn, vì vậy tôi đã tạo một tập lệnh Python thực hiện: Làm thế nào để mở tệp hiện tại ở dòng hiện tại trong trình soạn thảo văn bản từ GDB?

Lệnh Breakpoint để trợ giúp clipboard

Lệnh vim này sao chép một bộ xác định điểm dừng loại:

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

vào bảng tạm:

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

Sau đó, bạn có thể chỉ cần dán nó vào gdb.

Đây là sự tích hợp vim to gdb của một người nghèo để dễ dàng thiết lập các điểm dừng.

Bảng điều khiển GDB

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

Điều này không liên quan gì đến Vim, nhưng nó là một giải pháp nhẹ, đạt được rất nhiều và có thể phù hợp với các Vimmer khác ngoài kia.

Những người khác đã đề cập đến GDB TUI, nhưng tôi thấy nó quá hỏng và không đủ mạnh để có thể chịu đựng được.

Vì vậy, tôi đã chuyển sang các giải pháp dựa trên API Python như Bảng điều khiển GDB.

Tôi đã mô tả sử dụng và lý do chi tiết hơn tại: gdb split view with code

Đây là một ảnh chụp màn hình của những gì nó mang lại cho bạn:

nhập mô tả hình ảnh ở đây

Xem thêm: /vi/2046/how-can-i-integrate-gdb-with-vim

Từ bỏ và sử dụng một IDE thực sự

Với tất cả những gì đã nói, đây là giải pháp tốt nhất cho hầu hết mọi người, bao gồm cả bản thân tôi. Hầu hết mọi người sẽ chỉ đạt được hàng tấn thời gian nếu họ có thể chuyển qua các định nghĩa theo cách nhận biết lớp C ++ mà không cần chọn và tự cài đặt một số plugin khác nhau, và điều đó bao gồm trong khi bước gỡ lỗi. Vào năm 2020, thứ tồi tệ nhất đối với tôi là Eclipse: https://www.slant.co/topics/1411/~best-ides-for-c-on-linux


4

Sử dụng trình gỡ lỗi cấp nguồn chỉ là một trong nhiều cách để chẩn đoán hành vi chương trình bị lỗi và tôi hiếm khi thấy mình khởi chạy một chương trình - mặc dù thực tế là nó rất dễ thực hiện.

Vì vậy, đối với tôi, đơn giản là không có lợi thế vốn có để sử dụng trình soạn thảo văn bản mà cũng là một trình gỡ lỗi . Thay vào đó, tôi sử dụng trình soạn thảo văn bản mà tôi thích - độc lập với trình gỡ lỗi tôi chọn sử dụng. Hiện tại, tôi chủ yếu sử dụng geditkdbg cho các mục đích này, nhưng những lựa chọn này phát triển độc lập theo thời gian.


1
Trừ khi bạn đang phát triển từ xa trên máy chủ phát triển kde / gnome-free.
dùng826955

3

Cập nhật 2020: Có một vimspector plugin mới sử dụng Giao thức bộ điều hợp gỡ lỗi

  1. Cài đặt plugin https://github.com/puremourning/vimspector#installation

  2. Cấu hình (ghi .vimspector.json)

  3. Biên dịch với biểu tượng gỡ lỗi g++ cpp.cpp -ggdb -o cpp

  4. Nhấn F4để bắt đầu gỡ lỗi

nhập mô tả hình ảnh ở đây

  • Lưu ý của tôi .vimspector.jsontrong thư mục nhà của tôi (vì vậy làm việc trong bất kỳ thư mục con nào)
{
"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"
    }
  }
} }

1

Gần đây tôi đã làm việc trên một ứng dụng trong một thời gian dài đòi hỏi phải có một loạt các công cụ được đặt trên hộp mà nó đang chạy (thiết bị được thiết lập), tôi đã viết mã trong vim, có các kịch bản tự động xây dựng, đẩy nó đến một máy chủ , trong đó có một đoạn script để thông báo tệp sentinel được đẩy cùng với các nhị phân. Điều này sau đó sẽ khởi động lại các dịch vụ thích hợp trên hộp và trong một cửa sổ ssh khác tôi đã tail -fchạy trên tệp nhật ký của mình.

Tóm lại, tôi không sử dụng một trình sửa lỗi nào cả. Nếu tôi có một cái gì đó bất ngờ chết, tôi sẽ tăng mức ghi nhật ký, làm lại và xem điều cuối cùng được ghi lại trước khi nó chết, sau đó phân tích điều đó và khắc phục vấn đề.

Điều tuyệt vời là khi một cái gì đó có vấn đề trong môi trường khách hàng, tôi chỉ cần yêu cầu nhật ký cấp độ Debug và có thể xác định vấn đề mà không cần phải truy cập vào máy chủ của họ.

... nhưng đúng vậy, đã có những lúc thật tuyệt khi có một trình sửa lỗi.


0

Chỉ cần thêm vào ở trên:

IMO vim có xu hướng khá là một trình soạn thảo nhẹ và gỡ lỗi có xu hướng tăng thêm trọng lượng. Có nhiều cách để làm điều đó tức là sử dụng vim7.4 + với

:terminal

và chạy một trong các trình gỡ lỗi dòng lệnh (nguyền rủa) sau đây. Một số được sử dụng theo mặc định cho các IDE mà bạn chưa từng biết. tức là lldb = xcode.

rõ ràng là có nhiều cli dựa trên; @all cứ thoải mái gợi ý và thêm vào danh sách. cảm ơn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.