क्या आप विम में C ++ कोड डिबग करते हैं? कैसे?


152

प्रश्न आप सभी लोगों के लिए है, जो C ++ एप्लिकेशन विकसित करने के लिए Vim का उपयोग करते हैं।

मेरे जीवन में एक अवधि थी, जिसे 'आई हेट विम !!!' .. के रूप में वर्णित किया जा सकता है।

हालाँकि, ज्यादातर Microsoft विकास आईडीई पर बड़े होने के बाद, मैं उन लोगों के लिए उपयोग किया गया है F5- F11जब कोड डीबग करना, विंडो देखना, कॉल स्टैक और मुख्य कोड - सभी बिना किसी GDB कमांड टाइप करने के लिए दिखाई देते हैं।

तो, यहाँ सवाल है:

क्या आप डिबगिंग के लिए विम का उपयोग करते हैं? या क्या आप इस उद्देश्य के लिए कुछ IDE पर स्विच करते हैं? कौनसा?

जो लोग डीम कोड का उपयोग करने के लिए विम का उपयोग करते हैं: क्या संपादक में ब्रेकपॉइंट सेट करने के लिए प्लगइन्स हैं, वर्तमान में हम डिबगिंग की रेखा को उजागर करते हैं, कदम के दौरान ऑटो-नेविगेशन, चरण में, बाहर कदम?

कृपया, मुझे नहीं बताएं कि आप GDB को कमांड लाइन के रूप में उपयोग करते हैं, केवल एक लाइन देखें जो डीबग की गई है, आदि।


1
मुझे यकीन है कि आप अभी भी "एड" के साथ लोगों को विकसित और डिबगिंग पा सकते हैं।
e2-e4

55
हे भगवान, वे सवालों के जवाब "मेरी सी ++ कोड plz डीबग करें", लेकिन इसे भी स्थानीयकृत के रूप में बंद करें ... हास्यास्पद!
P Shved

17
कोशिश करो gdb -tui
जयेश

1
क्या आप वीआईएम पर अटक गए हैं या अन्य संपादकों को देखने के लिए तैयार हैं जैसे एमएसीएस जिसमें महान जीडीबी एकीकरण अंतर्निहित है? क्या मुख्य मुद्दे के साथ gdb सिंगल लाइन आउटपुट डिफ़ॉल्ट रूप से या टाइपिंग l (ist) से लगातार जुड़ा रहता है, जिसके साथ gdb -tui होता है?
जला

1
सुपरसेट: stackoverflow.com/questions/4237817/configuring-vim-for-c लेकिन मैं आपसे वर्ग जागरूकता के लिए विम कीबाइंड के साथ ग्रहण का उपयोग करने का आग्रह करता हूं।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

जवाबों:


76

अन्य उत्तरों के विपरीत, कम से कम तीन विकल्प हैं जो आपको केवल वही करने की आवश्यकता है: क्लीवन , पाइक्विंन और विम्ग्डब

तीनों परियोजनाएं संबंधित हैं। vimgdb Vim के विरुद्ध एक पैच है और Vim को फिर से कनेक्ट करने की आवश्यकता होती है। क्लेवन एक स्टैंडअलोन प्रोग्राम है जो नेटबीन्स सॉकेट इंटरफेस के माध्यम से विम के साथ संचार करता है। इसके लिए विम को +netbeansविकल्प के साथ बनाया जाना आवश्यक है (हाल के लिनक्स वितरण में यही स्थिति है इसलिए यह समस्या नहीं होनी चाहिए)।

क्लेवन की वेबसाइट से उद्धृत करने के लिए:

क्लीवन फुल gdb सपोर्ट को vim एडिटर में लागू करता है: ब्रेकप्वाइंट, वॉच चर, gdb कमांड पूर्णता, असेंबली विंडोज आदि।

मुझे लगता है कि आपको इसे जरूर छोड़ देना चाहिए।

Pyclewn वेबसाइट का होमपेज तीन परियोजनाओं के बीच तुलना दिखाता है।

कुछ महीने पहले मैंने साइकिल चलाने की कोशिश की। इसे स्थापित करना थोड़ा मुश्किल था, लेकिन बाहर और होनहार होने के बावजूद यह अच्छी तरह से दिखता है। मैंने अभी कुछ परीक्षण किए हैं और आप बुकमार्क इत्यादि सेट कर सकते हैं, सामान्य सामान जो आप एक ग्राफिकल डिबगर से उम्मीद करेंगे। मैंने आकस्मिक कारणों से इसका उपयोग नहीं किया, लेकिन मैं इसे एक और कोशिश देने के लिए उत्सुक हूं।


6
Conque GDB एक अच्छा विकल्प है। स्थापित करने में आसान, सरल और बहुत शक्तिशाली।
Druesukker

@UncleZeiv vimgdb पुराना है। मैंने यहां एक अपडेट की आवश्यकता व्यक्त की: github.com/larrupingpig/vimgdb-for-vim7.4/issues/4
hlin117

@ Druesukker, आपका उत्तर एक औपचारिक उत्तर का हकदार है!
सोलोटिम

@UncleZeiv vimgdb के लिए आपका लिंक नहीं है। इसे github.com/larrupingpig/vimgdb-for-vim7.4 पर जाना चाहिए , मुझे लगता है
15

2
बस GDB पर आधारित "डिबगर" की तरह एक विम जोड़ने के लिए - cgdb.github.io
जिमी एमजी लिम

24

विम ने मई 2018 में जारी संस्करण 8.1 में आधिकारिक तौर पर एक बिल्ट-इन डिबगर जोड़ा है। यह फीचर अगस्त 2017 की शुरुआत में संस्करण 8.0 के कुछ रिलीज में भी मौजूद था।

निम्नलिखित विम कमांड प्लगइन लोड करते हैं और डीबगर शुरू करते हैं।

: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

विम एक अच्छा संपादक है, लेकिन डिबगिंग करने के लिए मैं डीबगर (जैसे GDB) का उपयोग करता हूं।

लेकिन आपको पाठ मोड में GDB का उपयोग करने की आवश्यकता नहीं है; आप केडीबीजी , डीडीडी या इनसाइट जैसे ग्राफिकल फ्रंटेंड का उपयोग कर सकते हैं ।

VDB में GDB प्राप्त करने के तरीके हैं (लेकिन फिर आपको टेक्स्ट आधारित डिबगिंग मिलता है)।


10

GDB editकमांड

कमांड का उपयोग करके वर्तमान लाइन पर एक संपादक खोलता है:

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

डिफ़ॉल्ट editorहै ex, लेकिन प्रारूप को vimभी समझता है +<current-line>

जब आप संपादक को छोड़ देते हैं, तो आप वापस आ जाते हैं gdb

यह आपको स्रोत को स्वतंत्र रूप से ब्राउज़ करने की अनुमति देता है और विशेष रूप से शक्तिशाली है यदि आपके पास ctagsएकीकरण है।

यह एक गरीब आदमी का बिल्ट-इन वन तरीका है gdb to vim इंटीग्रेशन: मुख्य अनुपलब्ध चीज विम से ब्रेकपॉइंट सेट कर रहा है।

edit और केंद्र

editस्रोत के चारों ओर डिफ़ॉल्ट रूप से Vim केंद्र नहीं करता है, इसलिए मैंने एक पायथन स्क्रिप्ट बनाई है जो इसे करती है: GDB से पाठ संपादक में वर्तमान लाइन पर वर्तमान फ़ाइल कैसे खोलें?

ब्रेकपॉइंट कमांड क्लिपबोर्ड हेल्पर को

यह vim कमांड टाइप के एक ब्रेकप्वाइंट स्पेसियर को कॉपी करता है:

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

क्लिपबोर्ड पर:

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

तो आप बस में पेस्ट कर सकते हैं gdb

यह ब्रेकपॉइंट्स सेट करने में आसानी के लिए gdb इंटीग्रेशन के लिए एक गरीब आदमी की विम है।

GDB डैशबोर्ड

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

इसका विम के साथ कोई लेना-देना नहीं है, लेकिन यह एक हल्का समाधान है जो बहुत कुछ हासिल करता है और अन्य विमर्स के लिए उपयुक्त हो सकता है।

अन्य लोगों ने GDB TUI का उल्लेख किया है, लेकिन मैंने पाया कि यह बहुत टूटी हुई है और पर्याप्त रूप से शक्तिशाली नहीं है।

इसलिए मैं इसके बजाय GDB डैशबोर्ड जैसे पायथन एपीआई आधारित समाधानों की ओर बढ़ा।

मैंने उपयोग किया है और औचित्य वर्णन किया है: कोड के साथ gdb विभाजन दृश्य

यहाँ एक स्क्रीनशॉट है जो यह आपको देता है:

यहाँ छवि विवरण दर्ज करें

यह सभी देखें: /vi/2046/how-can-i-integrate-gdb-with-vim

असली आईडीई का त्याग करें और उसका उपयोग करें

सभी ने कहा कि, यह ज्यादातर लोगों के लिए सबसे अच्छा समाधान है, जिसमें मैं भी शामिल हूं। ज्यादातर लोग बस समय का एक बहुत कुछ हासिल करेंगे अगर वे C ++ वर्ग जागरूक तरीके से परिभाषाओं के इर्द-गिर्द कूद सकते हैं, बिना कई अलग-अलग प्लगइन्स को चुनने और स्थापित किए बिना, और जिसमें स्टेप डीबगिंग सामान शामिल है। 2020 तक मेरे लिए सबसे कम एक ग्रहण था: https://www.slant.co/topics/1411/~best-ides-for-c-on-linux


4

स्रोत स्तर डिबगर का उपयोग करना दोषपूर्ण कार्यक्रम व्यवहार का निदान करने के कई तरीकों में से एक है, और मैं शायद ही कभी खुद को लॉन्च करता हुआ पाता हूं - इस तथ्य के बावजूद कि यह करना बहुत आसान है।

तो मेरे लिए, एक टेक्स्ट एडिटर का उपयोग करने का कोई अंतर्निहित लाभ नहीं है जो कि डिबगर भी होता है । इसके बजाय, मैं उस पाठ संपादक का उपयोग करता हूं जिसे मैं पसंद करता हूं - जिस डिबगर का उपयोग करने के लिए मैं स्वतंत्र हूं। फिलहाल, मैं इन उद्देश्यों के लिए ज्यादातर gedit और kdbg का उपयोग करता हूं , लेकिन ये विकल्प समय के साथ स्वतंत्र रूप से विकसित होते हैं।


1
जब तक आप एक kde / सूक्ति-मुक्त विकास मेजबान पर रिमोट विकसित नहीं कर रहे हैं।
user826955

3

अद्यतन 2020: डिबग एडाप्टर प्रोटोकॉल का उपयोग करके एक नया प्लगइन विम्पेक्टर है

  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

हाल ही में एक लंबे समय के लिए एक एप्लिकेशन पर काम करने के बाद, उस बॉक्स पर जगह बनाने के लिए सामान का एक गुच्छा आवश्यक था (उपकरण सेट अप), मैंने vim में कोड लिखा था, स्क्रिप्ट्स थीं जो स्वचालित बिल्डिंग थीं, इसे एक सर्वर पर धकेलती हैं , जिसमें बायनरी के साथ-साथ भेजे जाने वाले प्रहरी फ़ाइल को नोटिस करने के लिए एक स्क्रिप्ट थी। इसके बाद बॉक्स पर उपयुक्त सेवाओं को फिर से शुरू किया जाएगा, और दूसरी ssh विंडो में मैं tail -fअपनी लॉग फ़ाइल पर चल रहा था ।

लंबी कहानी छोटी, मैंने डिबगर का उपयोग बिल्कुल नहीं किया। अगर मैं कुछ अप्रत्याशित रूप से मर गया था, तो मैं बस लॉगिंग स्तरों को टक्कर दूँगा, इसे फिर से करें, और देखें कि मरने से पहले आखिरी चीज़ क्या लॉग थी, फिर उसका विश्लेषण करें और समस्या को ठीक करें।

अच्छी बात यह थी कि जब किसी ग्राहक के वातावरण में कुछ समस्याएँ होती हैं, तो मैं बस एक डीबग-स्तरीय लॉग माँगता हूँ और अपने सर्वर तक पहुँच की आवश्यकता के बिना भी समस्या की पहचान कर सकता था।

... लेकिन हां, कई बार ऐसा होता था कि डिबगर होना अच्छा होता था।


0

बस ऊपर जोड़ने के लिए:

IMO विम काफी हल्का संपादक हो जाता है और डिबगिंग वजन को जोड़ने के लिए जाता है। इसे करने के तरीके हैं अर्थात vim7.4 + के साथ

:terminal

और निम्नलिखित कमांडलाइन (शाप) डिबगर्स में से एक चल रहा है। कुछ का उपयोग डिफ़ॉल्ट रूप से आईडीई के लिए किया जाता है जिसे आप कभी नहीं जानते थे। यानी lldb = xcode।

स्पष्ट रूप से अधिक क्लि आधारित हैं; @ सभी का सुझाव है और सूची में जोड़ने के लिए स्वतंत्र महसूस हो रहा है। धन्यवाद!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.