ब्रेकप्वाइंट की सूची को बचाने के लिए जीडीबी प्राप्त करना


129

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

.Gdbinit फ़ाइल में वही समस्या है --command। जानकारी को तोड़ने आदेश मानव उपभोग के लिए एक मेज आदेशों की सूची नहीं है, बल्कि।

विस्तृत करने के लिए, यहाँ जानकारी ब्रेक से एक नमूना है :

(gdb) जानकारी विराम
Num Type Disp Enb पता क्या है
1 ब्रेकपाइंट y 0x08048517 <foo :: bar (शून्य) +7> रखें

जवाबों:


204

GDB 7.2 (2011-08-23) के अनुसार अब आप सेव ब्रेकपॉइंट कमांड का उपयोग कर सकते हैं ।

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

source <filename>फ़ाइल से सहेजे गए विराम बिंदुओं को पुनर्स्थापित करने के लिए उपयोग करें ।


2
यदि वे साझा देयता भार से हैं तो क्या होगा? यह उत्तर डिफ़ॉल्ट रूप से लगता है ...Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
bjackfly


ध्यान दें कि जब आपके पास एक ब्रेकपॉइंट की स्थिति होती है जिसे स्टार्टअप पर हल नहीं किया जा सकता है ( break g_log if log_level==G_LOG_LEVEL_CRITICAL), तो कम से कम gdb 7.8.1 आगे के आदेशों को पार्स कर देगा। यदि आपके पास अतिरिक्त कमांड हैं जिन्हें उस ब्रेकपॉइंट के लिए निष्पादित किया जाना चाहिए, तो commandsलाइन से पहले लाइन डालें condition
लेकेनस्टाइन

@ और फिर मैंने आपके संपादन को मेरे मूल ब्लॉककॉउट पर वापस ले लिया क्योंकि पाठ दस्तावेज़ से एक शब्दशः उद्धरण है ... मैं अन्यथा आपके संपादन से सहमत होता अगर इसके बजाय मेरे अपने शब्द होते।
aculich

@aculich: मैं देख रहा हूँ। मैं किसी भी मामले में कोड शैली के बजाय उद्धरण शैली का उपयोग करने की सलाह दूंगा।
एंड्री

26

यह उत्तर पुराना है। GDB अब सीधे बचत का समर्थन करता है। इस जवाब को देखें ।

आप लॉगिंग का उपयोग कर सकते हैं:

(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) q

फ़ाइल टूट जाती है। अब इसमें शामिल हैं:

Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>

एक AWK स्क्रिप्ट लिखना जो रूपांतरित करता है .gdbinitया --commandफ़ाइल के लिए उपयोगी प्रारूप में आसान है। या आप स्क्रिप्ट --eval-commandको GDB कमांड लाइन से अलग कर सकते हैं ...

इस छोटे मैक्रो को .gdbinit में जोड़ने से आपको इसे करने में मदद मिलेगी:

# Call with dump_breaks file.txt
define dump_breaks
    set logging file $arg0
    set logging redirect on
    set logging on
    info breakpoints
    set logging off
    set logging redirect off
end

कोई भी आसानी से कट-एंड-पेस्ट का उपयोग कर सकता है, लेकिन स्क्रिप्टिंग विधि को जाने का तरीका लगता है।
आकस्मिक कैडर

1
मुझे नहीं लगता कि कट-एंड-पेस्ट केवल एक बार एक स्क्रिप्ट लिखने से आसान है, फिर हर बार फिर से इसका उपयोग करना :) आखिरकार, यही कारण है कि आपने पहली बार में यह सवाल पूछा था, मुझे लगता है :)
जोहान्स स्काउब -

उम, मेरा मतलब लॉगिंग विधि के बजाय कट-एंड-पेस्ट का उपयोग करना था। स्क्रिप्टिंग यह सुनिश्चित करने के लिए अब तक है।
कैजुअलोडर

वाह! जीडीबी फेल! मैं इसका हर रोज इस्तेमाल करता हूं और इसके कई फीचर्स से प्यार करता हूं। लेकिन कमी सिर्फ सादे गूंगे की है।
deft_code

4
यह उत्तर अब 2 वर्ष से अधिक पुराना है, इसलिए यदि आप gdb के नए संस्करण का उपयोग कर रहे हैं तो यह अप्रचलित हो सकता है। Gdb 7.2 के रूप में आप अब save breakpointsकमांड का उपयोग कर सकते हैं ।
एसुलिच

11

अपने GDB कमांड और ब्रेकप्वाइंट को एक .gdbinit फ़ाइल में रखें जैसे कि आप उन्हें gdb>प्रॉम्प्ट पर टाइप कर सकते हैं , और GDB स्वचालित रूप से उन्हें स्टार्टअप पर लोड और चलाएगा। यह एक प्रति-निर्देशिका फ़ाइल है, इसलिए आपके पास विभिन्न परियोजनाओं के लिए अलग-अलग फाइलें हो सकती हैं।


1
यह वास्तव में काम करने में विफल रहता है, मुझे "चेतावनी: सहेजें-ट्रेस पॉइंट्स: कोई ट्रेसप्वाइंट नहीं बचा है।" ब्रेकपॉइंट्स सेट होने के बावजूद यह gdb 6.8 का उपयोग कर रहा है।
कैजुअल कोडर

यह मेरे लिए काम करता है। GDB को आपके $ HOME / .gdbinit में एक वैश्विक .gdbinit की उपस्थिति की आवश्यकता होती है जिसमें सामग्री 'ऐड-ऑटो-लोड-सेफ-पाथ /home/johnny/src/.gdbinit' होती है और इस प्रकार sd / फ़ोल्डर में एक अलग .gdbinit भी होता है।
त्रुथिड्रोसर

9

के लिए एक विस्तार anon का विस्तार करने के लिए जोहानिस 'जवाब :

.gdbinit:

define bsave
    shell rm -f brestore.txt
    set logging file brestore.txt
    set logging on
    info break
    set logging off
    # Reformat on-the-fly to a valid GDB command file
    shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
  store actual breakpoints
end

define brestore
  source brestore.gdb
end
document brestore
  restore breakpoints saved by bsave
end

साथ brestoreआप तो साथ सहेजा breakpoints बहाल कर सकते हैं bsave


यहाँ एक बेहतर रेगेक्स है: perl -ne "print \" break \ $ 1 \ n \ "अगर /at\s(.*:\d+)/" brestore.txt
जॉर्ज Godik

6

तक का विस्तार जोहान्स से उत्तर के : आप info breakएक मान्य GDB कमांड फ़ाइल में स्वचालित रूप से आउटपुट में सुधार कर सकते हैं :

.gdbinit:

define bsave
   shell rm -f brestore.txt
   set logging file brestore.txt
   set logging on
   info break
   set logging off
   # Reformat on-the-fly to a valid gdb command file
   shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
  store actual breakpoints
end

बाद में आपके पास एक मान्य कमांडफाइल है brestore.gdb

यह मेरे लिए तब काम आया जब आवेदन के साथ संकलित किया गया -g

मैंने उबंटू 9.10 ( कर्मिक कोअला) पर GDB v6.8 के साथ इसका सफल परीक्षण भी किया ।


1
इस स्निपेट के लिए धन्यवाद! बहुत अच्छा काम करता है। जीएनयू जीडीबी 6.3.50-20050815 (Apple संस्करण gdb-966) के साथ सफलतापूर्वक कार्बनइनेमैक GNU Emacs 22.3.1 (i386-apple-darwin9.6.0, Mac OS 10.5.8 पर कार्बन संस्करण 1.6.0) का परीक्षण किया गया।
पेस्टोफैगस


3

निम्नलिखित को ~ / .gdbinit में bsave और brestore को परिभाषित करने के लिए GDB कमांड के रूप में परिभाषित करें- ब्रेकपॉइंट्स को बचाने और पुनर्स्थापित करने के लिए।

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

1

चेतावनी: वर्तमान आउटपुट प्रोटोकॉल पुनर्निर्देशन का समर्थन नहीं करता है

टीयूआई मोड में लॉगिंग को सक्षम करने का प्रयास करते समय मुझे जीडीबी में यह त्रुटि / चेतावनी भी मिलती है। हालाँकि, जब "गैर-टीयूआई" मोड में लॉगिंग काम करने लगता है। इसलिए जब भी मैं कुछ लॉग करना चाहता हूं, मैं टीयूआई मोड छोड़ देता हूं। ( Ctrl+X , Ctrl+ केA साथ TUI मोड में आगे और पीछे टॉगल करें )।

यहां बताया गया है कि मैं कैसे काम करता हूं:

  1. GDB प्रारंभ करें (सामान्य मोड में)
  2. लॉगिंग करने देना: set logging on - अब इसे शिकायत नहीं करनी चाहिए।
  3. TUI मोड पर वापस / आगे टॉगल करें और GDB सामान करें
  4. जब भी मैं कुछ लॉग करना चाहता हूं (एक विशाल बैकट्रेस डंप की तरह) - सामान्य मोड में टॉगल करना

ओह, और यदि आप "स्क्रीन" (जैसे मैं करते हैं) का उपयोग करना पसंद करते हैं, तो यह थोड़ा गड़बड़ हो जाएगा, क्योंकि यह एक ही हॉटकी का उपयोग करता है।
मैग्नेक्स

1

मुझे किसी विशेष फ़ाइल में ब्रेकपॉइंट्स को बचाने / लोड करने के लिए उपयोगी पिछले उत्तर के अलावा मिला।

  • विराम सहेजें: bsave {फ़ाइल नाम}
  • ब्रेकपॉइंट लोड करें: लोड करें {फ़ाइल नाम}

पिछले उत्तर की तरह, फ़ाइल में निम्नलिखित कोड जोड़ें ~ / .gdbinit

# Save breakpoints to a file
define bsave
    if $argc != 1
        help bsave
    else
    save breakpoints $arg0
    end
end
document bsave
Saves all current defined breakpoints to the defined file in the PWD
Usage: bsave <filename>
end

# Loads breakpoints from a file
define bload
    if $argc != 1
        help bload
    else
        source $arg0
    end
end
document bload
Loads all breakpoints from the defined file in the PWD
Usage: bload <filename>
end

0

समस्या यह है कि ब्रेकपॉइंट स्थापित करना संदर्भ के प्रति संवेदनशील है। क्या होगा यदि आपके पास फू नाम के दो स्थिर कार्य हैं ?

यदि आप पहले से ही एक मॉड्यूल को डिबग कर रहे हैं जो फू को परिभाषित करता है, तो जीडीबी आपको यह मान लेगा कि आपका मतलब है। लेकिन अगर आप किसी फाइल में सिर्फ "ब्रेक फू" डंप करते हैं और फिर स्टार्ट-अप में उस फाइल को पढ़ते हैं, तो यह स्पष्ट नहीं होगा कि आप किस फंक्शन का मतलब निकाल रहे हैं।


0

कोई अन्य विचार? मुझे मिल गया है

warning: Current output protocol does not support redirection

उपरांत

set logging on

संपादित करें:

मुझे पता है कि सवाल "ब्रेकपॉइंट की एक सूची को कैसे सहेजना है", हालांकि मुझे अभी पता चला है, कि जीडीबी के साथ हम "फाइल में सहेजे गए" ब्रेकपॉइंट द्वारा बस सेट कर सकते हैं

gdb> source breakpoints.txt

breakpoints.txtइस तरह एक फ़ाइल कहां है:

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