คุณดีบักรหัส C ++ เป็นกลุ่มหรือไม่ อย่างไร?


152

คำถามนี้สำหรับทุกคนที่ใช้ Vim เพื่อพัฒนาแอพพลิเคชั่น C ++

มีช่วงเวลาหนึ่งในชีวิตของฉันซึ่งสามารถอธิบายได้ว่า 'ฉันเกลียด Vim !!!' .. 'Vim is nice!'

อย่างไรก็ตามการเติบโตขึ้นส่วนใหญ่บน IDEs การพัฒนาของไมโครซอฟท์ฉันเคยชินกับการใช้งานF5- F11ทางลัดเมื่อทำการดีบั๊กโค้ด, หน้าต่างดู, call stack และรหัสหลัก - ทั้งหมดนี้มองเห็นได้โดยไม่จำเป็นต้องพิมพ์คำสั่ง GDB ใด ๆ

ดังนั้นนี่คือคำถาม:

คุณใช้ Vim เพื่อแก้จุดบกพร่องหรือไม่ หรือคุณเปลี่ยนไปใช้ IDE บางอย่างเพื่อจุดประสงค์นี้ อันไหน?

สำหรับผู้ที่ใช้ Vim to debug code: มีปลั๊กอินสำหรับตั้งเบรกพอยต์ในตัวแก้ไขหรือไม่ให้ไฮไลต์บรรทัดที่เรากำลังทำการดีบัก, การนำทางอัตโนมัติในระหว่างขั้นตอน, ก้าวเข้าสู่, ก้าวออก?

โปรดอย่าบอกฉันว่าคุณใช้ GDB เป็นบรรทัดคำสั่งดูบรรทัดเดียวที่ debugged และอื่น ๆ


1
ฉันแน่ใจว่าคุณยังสามารถหาคนที่กำลังพัฒนาและแก้ไขจุดบกพร่องด้วย "ed"
e2-e4

55
โอ้พระเจ้าพวกเขาตอบคำถาม "แก้ปัญหารหัส C ++ ของฉัน" แต่ปิดนี่เป็นภาษาท้องถิ่นเกินไป ... ไร้สาระ!
P Shved

17
ลองgdb -tuiดู
Jayesh

1
คุณติดอยู่ในกลุ่มหรือเต็มใจที่จะดูบรรณาธิการอื่น ๆ เช่น Emacs ที่มีการรวม gdb ไว้อย่างดีหรือไม่? ปัญหาหลักของ gdb คือการเอาท์พุทบรรทัดเดียวโดยค่าเริ่มต้นหรือเพื่อหลีกเลี่ยงการพิมพ์ l (ist) อย่างต่อเนื่องซึ่ง gdb -tui ช่วยด้วย?
jla

1
Superset: stackoverflow.com/questions/4237817/configuring-vim-for-cแต่ฉันขอให้คุณใช้ Eclipse กับ Vim keybindinds สำหรับการรับรู้ในชั้นเรียน
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


76

ตรงกันข้ามกับคำตอบอื่น ๆ มีอย่างน้อยสามตัวเลือกที่ทำสิ่งที่คุณต้องการ: clewn , pyclewnและvimgdb

ทั้งสามโครงการเกี่ยวข้องกัน vimgdbเป็น patch สำหรับ Vim และต้องการให้ Vim ทำการคอมไพล์ใหม่ clewnเป็นโปรแกรมแบบสแตนด์อโลนที่สื่อสารกับ Vim ผ่าน Netbeans socket interface สิ่งนี้ต้องใช้ Vim ในการสร้างด้วย+netbeansตัวเลือก (นี่เป็นกรณีในลีนุกซ์รุ่นล่าสุดดังนั้นจึงไม่น่าจะมีปัญหา)

อ้างจากเว็บไซต์ของ clewn:

Clewn ใช้การสนับสนุน gdb แบบเต็มในเครื่องมือแก้ไข vim: จุดพัก, ตัวแปรเฝ้าดู, การเสร็จสิ้นคำสั่ง gdb, หน้าต่างประกอบ ฯลฯ

ฉันคิดว่าคุณควรจะไปแน่นอน

หน้าแรกของเว็บไซต์ pyclewn แสดงการเปรียบเทียบระหว่างสามโครงการ

ไม่กี่เดือนที่ผ่านมาฉันลอง pyclewn มันค่อนข้างยากที่จะตั้งค่า แต่มันก็ดูดีและสดใส ฉันเพิ่งทำการทดสอบและคุณสามารถตั้งค่าบุ๊คมาร์ค ฯลฯ สิ่งปกติที่คุณคาดหวังจากดีบักเกอร์แบบกราฟิก ฉันลงเอยด้วยการไม่ใช้มันเพราะเหตุผลที่อาจเกิดขึ้น แต่ฉันก็อยากลองอีกครั้ง


6
Conque GDB เป็นทางเลือกที่ดี ติดตั้งง่ายเรียบง่ายและทรงประสิทธิภาพ
Druesukker

@ UncleZeiv vimgdb ล้าสมัยแล้ว ฉันแสดงความต้องการการอัปเดตที่นี่: github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117

@Druesukker คำตอบของคุณสมควรได้รับคำตอบอย่างเป็นทางการ!
solotim

@ UncleZeiv ลิงก์ของคุณไปยัง vimgdb ไม่ได้ มันควรจะไปที่github.com/larrupingpig/vimgdb-for-vim7.4ฉันเดา
mcepl

2
เพียงเพิ่มกลุ่ม "like" ดีบักเกอร์ที่อ้างอิงจาก GDB - cgdb.github.io
Jimmy MG Lim

24

Vim เพิ่มตัวดีบักเกอร์ในตัวเป็นทางการในเวอร์ชัน 8.1 วางจำหน่ายในเดือนพฤษภาคม 2018 คุณลักษณะดังกล่าวมีอยู่ในรีลีสเวอร์ชัน 8.0 บางรุ่นเช่นกันในช่วงต้นเดือนสิงหาคม 2560

คำสั่ง vim ต่อไปนี้โหลดปลั๊กอินและเริ่มดีบักเกอร์

:packadd termdebug
:Termdebug

คำสั่งหลังใช้โปรแกรมเป็นอาร์กิวเมนต์ตัวเลือกหรือมิฉะนั้นโปรแกรมสามารถโหลดจากgdbหน้าต่างด้วยfileคำสั่ง

เมื่อโหลดปลั๊กอินแล้ว gdbคุณสามารถใช้โต้ตอบได้ในหน้าต่างที่เกี่ยวข้อง ตัวอย่างเช่นจุดพักสามารถตั้งค่ารหัสสามารถก้าวผ่านและสามารถตรวจสอบตัวแปร

gdbคำสั่งที่เป็นกลุ่มจะสามารถออกสำหรับการโต้ตอบกับ คำสั่งที่เกี่ยวข้องบางอย่างรวมถึง:Step, :Over, :Finish, :Continue, :Stop, :Break, :Clearและ:Evaluateและ

นอกจากนี้ยังมีปุ่มที่คลิกได้ที่ด้านบนของหน้าต่างตัวแก้ไขสำหรับการโต้ตอบกับ gdbนอกจากนี้ยังมีปุ่มคลิกได้ที่ด้านบนของหน้าต่างแก้ไขสำหรับการโต้ตอบกับ

หน้าต่างตัวแก้ไขได้รับการอัปเดตเพื่อแสดงสถานะของการดีบัก จุดพักถูกระบุด้วย>>และบรรทัดปัจจุบันจะถูกเน้น

หน้าความช่วยเหลือในตัวมีเอกสารประกอบอย่างละเอียด

:help terminal-debug

ฉันเพิ่งเขียนโพสต์บล็อกที่เดินผ่านเซสชันตัวอย่าง

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


14

Vim เป็นตัวแก้ไขที่ดี แต่ในการทำการดีบักฉันใช้ตัวดีบัก (เช่น GDB)

แต่คุณไม่จำเป็นต้องใช้ GDB ในโหมดข้อความ คุณสามารถใช้ส่วนหน้าแบบกราฟิกเช่นKDbg , DDDหรือInsight Insight

มีวิธีในการทำให้ GDB เป็นกลุ่ม (แต่คุณจะได้รับการดีบักแบบข้อความ)


10

editคำสั่งGDB

เปิดตัวแก้ไขบนบรรทัดปัจจุบันโดยใช้คำสั่ง:

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

ค่าเริ่มต้นeditorคือexแต่vimยังเข้าใจ+<current-line>รูปแบบ

เมื่อคุณออกจากโปรแกรมแก้ไขคุณจะกลับเข้ามา gdbมา

สิ่งนี้ช่วยให้คุณสามารถสืบค้นแหล่งข้อมูลได้อย่างอิสระและมีประสิทธิภาพเป็นพิเศษหากคุณมี ctagsการรวมระบบ

นี่คือการรวม gdb กับ vim ในตัวของคนยากจน: สิ่งที่ขาดหายไปหลักคือการตั้งค่าเบรกพอยต์จาก Vim

edit และศูนย์

editไม่จัด Vim เป็นค่าเริ่มต้นรอบแหล่งที่มาดังนั้นฉันจึงสร้างสคริปต์ Python ขึ้นมา: ทำอย่างไรจึงจะเปิดไฟล์ปัจจุบันที่บรรทัดปัจจุบันในตัวแก้ไขข้อความจาก GDB ได้อย่างไร

คำสั่งเบรกพอยต์เพื่อช่วยคลิปบอร์ด

คำสั่ง vim นี้คัดลอกตัวระบุจุดพักประเภท:

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

ไปที่คลิปบอร์ด:

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

จากนั้นคุณสามารถวางลงในgdbนั้น

นี่เป็นกลุ่มคนจนที่รวม gdb เพื่อความสะดวกในการตั้งค่าเบรกพอยต์

GDB Dashboard

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

สิ่งนี้ไม่เกี่ยวกับ Vim แต่เป็นโซลูชันที่มีน้ำหนักเบาที่ได้ผลมากและอาจเหมาะสมกับ Vimmers อื่น ๆ

คนอื่นพูดถึง GDB TUI แต่ฉันพบว่ามันหักเกินไปและไม่ทรงพลังพอที่จะรับได้

ดังนั้นฉันจึงเปลี่ยนไปใช้โซลูชันที่ใช้ Python API เช่น GDB Dashboard

ฉันได้อธิบายการใช้และเหตุผลในรายละเอียดเพิ่มเติมได้ที่: gdb แยกดูด้วยรหัส

นี่คือภาพหน้าจอของสิ่งที่ให้คุณ:

ป้อนคำอธิบายรูปภาพที่นี่

ดูเพิ่มเติมที่: /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


4

การใช้ดีบักเกอร์ระดับซอร์สเป็นเพียงหนึ่งในหลายวิธีในการวินิจฉัยพฤติกรรมของโปรแกรมที่ผิดพลาดและฉันไม่ค่อยพบตัวเองที่เปิดใช้งานหนึ่ง - แม้ว่าจะเป็นเรื่องง่ายที่จะทำ

ดังนั้นสำหรับผมแล้วมีประโยชน์เพียงไม่ธรรมชาติเพื่อใช้โปรแกรมแก้ไขข้อความที่เกิดขึ้นนอกจากนี้ยังจะมีการดีบักเกอร์ แต่ฉันใช้โปรแกรมแก้ไขข้อความที่ฉันชอบ - ไม่ขึ้นอยู่กับ debugger ที่ฉันเลือกใช้ ในขณะนี้ฉันส่วนใหญ่ใช้geditและkdbgเพื่อวัตถุประสงค์เหล่านี้ แต่ตัวเลือกเหล่านี้มีการพัฒนาอย่างอิสระเมื่อเวลาผ่านไป


1
ยกเว้นว่าคุณกำลังพัฒนารีโมตบนโฮสต์การพัฒนา kde / gnome-free
user826955

3

อัปเดต 2563: มีปลั๊กอิน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"
    }
  }
} }

1

เมื่อเร็ว ๆ นี้เพิ่งได้ทำงานกับแอปพลิเคชั่นเป็นเวลานานซึ่งต้องมีสิ่งต่าง ๆ ติดอยู่ในกล่องที่มันกำลังทำงานอยู่ (ตั้งค่าอุปกรณ์) ฉันเขียนโค้ดเป็นกลุ่มมีสคริปต์ที่สร้างอัตโนมัติผลักไปที่เซิร์ฟเวอร์ ซึ่งมีสคริปต์อยู่ที่นั่นเพื่อสังเกตไฟล์แมวมองที่ถูกส่งไปพร้อมกับไบนารี นี่จะเป็นการเริ่มบริการที่เหมาะสมบนกล่องและในหน้าต่าง ssh อื่นฉันมีtail -fทำงานในไฟล์บันทึกของฉัน

เรื่องสั้นสั้นฉันไม่ได้ใช้ดีบักเกอร์เลย หากฉันมีบางสิ่งบางอย่างตายไปอย่างกะทันหันฉันจะชนระดับการบันทึกใหม่ทำซ้ำและดูว่าสิ่งสุดท้ายที่บันทึกไว้ก่อนที่มันจะตายคืออะไรจากนั้นวิเคราะห์และแก้ไขปัญหา

สิ่งที่ดีคือเมื่อบางสิ่งมีปัญหาในสภาพแวดล้อมของลูกค้าฉันแค่ขอบันทึกระดับ Debug และสามารถระบุปัญหาได้โดยไม่จำเป็นต้องเข้าถึงเซิร์ฟเวอร์ของพวกเขา

... แต่ใช่มีหลายครั้งที่การดีบั๊กเกอร์น่าจะดีกว่า


0

เพียงเพิ่มไปด้านบน:

IMO vim มีแนวโน้มที่จะเป็นตัวแก้ไขที่ค่อนข้างเบาและการดีบักมีแนวโน้มที่จะเพิ่มลงในน้ำหนัก มีวิธีที่จะทำเช่นใช้ vim7.4 + ด้วย

:terminal

และเรียกใช้หนึ่งใน debuggers commandline (curses) ต่อไปนี้ โดยค่าเริ่มต้นมีการใช้งานเล็กน้อยสำหรับ IDE ที่คุณไม่เคยรู้จัก ie lldb = xcode

เห็นได้ชัดว่ามีคนอื่นตาม cli; @ ไม่ลังเลที่จะแนะนำและเพิ่มในรายการ ขอบคุณ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.