मैं जीडीबी में एक लंबी स्ट्रिंग का पूरा मूल्य कैसे प्रिंट करूं?


376

मैं जीडीबी में सी-स्ट्रिंग की पूरी लंबाई प्रिंट करना चाहता हूं। डिफ़ॉल्ट रूप से इसे संक्षिप्त किया जा रहा है, मैं GDB को पूरे स्ट्रिंग को प्रिंट करने के लिए कैसे मजबूर करूं?

जवाबों:


504
set print elements 0

GDB मैनुअल से :

set print elements number-of-elements
GDB के कितने तत्व प्रिंट होंगे इस पर एक सीमा निर्धारित करें। यदि GDB एक बड़े सरणी को प्रिंट कर रहा है, तो यह set print elementsकमांड द्वारा सेट किए गए तत्वों की संख्या को प्रिंट करने के बाद प्रिंट करना बंद कर देता है । यह सीमा स्ट्रिंग्स के प्रदर्शन पर भी लागू होती है। जब GDB शुरू होता है, इस सीमा को 200 पर सेट है सेटिंग संख्या के- तत्वों शून्य का अर्थ है कि मुद्रण असीमित है

4
आजकल आपको "सेट प्रिंट रिपीट 0" की भी आवश्यकता हो सकती है, अन्यथा GDB स्ट्रिंग / सरणी के दोहराया तत्वों को छोड़ देगा।
जॉन लिंडग्रेन

यह सरणी प्रकारों पर भी लागू होता है
ट्रेवर बॉयड स्मिथ

1
आपको "अधिकतम-मूल्य-आकार असीमित सेट" करने की भी आवश्यकता हो सकती है।
एम्स

100

जब तक आपका कार्यक्रम एक शांत अवस्था में है, तब तक आप call (void)puts(your_string)इसे प्रिंटआउट करने के लिए भी कर सकते हैं । समान सिद्धांत डिबगर के लिए उपलब्ध सभी कार्यों पर लागू होता है, वास्तव में।


2
यह उत्तर "सेट प्रिंट एलिमेंट्स 0" (मेरे उद्देश्यों के लिए) से भी बेहतर है क्योंकि यह नई लाइन / कैरिज रिटर्न चार्ट्स का सम्मान करता है, क्योंकि वे उनसे बच रहे हैं।
mhenry1384

6
अच्छा समाधान है, लेकिन कोर डंप फ़ाइल का विश्लेषण करने की कोशिश करते समय काम नहीं करता है
Elalfer

शानदार सुझाव duskwuff, मेरी इच्छा है कि मैंने पढ़ा था कि इससे पहले कि मैं नकल करूँ और इसे एक
प्रिंटफ़

4
नोट: यह विकल्प केवल तभी काम करता है जब आप लाइव प्रोग्राम डिबग कर रहे हों। जब आप किसी कोर फ़ाइल को डीबग कर रहे होते हैं तो आप GDB के "कॉल" कमांड का उपयोग नहीं कर सकते।
सोलोमन स्लो

1
gdb को sane होने की भी आवश्यकता है, जो तेजी से मामला नहीं लगता है (मुझे वर्तमान संदर्भ में "कोई प्रतीक नहीं" "मिलता है" मेरे मैक OS X मशीन पर)
माइकल

39

एक तीसरा विकल्प है: x कमांड, जो आपको वैश्विक सेटिंग बदलने के बजाय विशिष्ट कमांड के लिए एक अलग सीमा निर्धारित करने की अनुमति देता है। एक स्ट्रिंग के पहले 300 अक्षरों को प्रिंट करने के लिए आप इसका उपयोग कर सकते हैं x/300s your_string। आउटपुट पढ़ने में थोड़ा कठिन हो सकता है। उदाहरण के लिए SQL क्वेरी के मुद्रण के परिणाम:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "SELECT article.r" ...
0x9cd958: "आर्टिकेल से बकाया" ...
..

3
मैं सोच रहा था कि "x / 300sb" का क्या मतलब है। इस धोखा पत्र (पीडीएफ) की सहायता से , मैंने "एक्स / 300 एसबीआर क्रस्ट" का अनुवाद "ईएक्सएमएनए 300 यूनिट (बाइट्स) मेमोरी ऑफ एड्रेस क्रस्ट के रूप में किया है, जिसे एनएलएल-टर्मिनेटेड स्ट्रिंग (एस) के रूप में व्याख्या किया गया है।" यदि आपकी स्ट्रिंग की लंबाई 100 है, तो आपको बहुत सारा कचरा दिखाई देगा, क्योंकि सभी 300 बाइट्स मुद्रित होते हैं, चाहे वे समझ में आएं या नहीं। फिर भी मुझे शुरू करने के लिए x!
रोब डब्ल्यू

39

printfआदेश पूरा तार प्रिंट होगा:

(gdb) printf "%s\n", string

2
क्षमा करें, लेकिन यह सच नहीं है
उमेनोबे

11
यह set print elements nnnसीमा का सम्मान करने के लिए लगता है , और जब तक आप ऐसा नहीं करते तब तक पूरी स्ट्रिंग नहीं छपेगी set print elements 0
निशान लता

3
जब मैं यह कोशिश करता हूं तो मुझे केवल यही मिलता है: "मान को पूर्णांक में परिवर्तित नहीं किया जा सकता है।"
फिलिप लुडविग

2
std :: string के लिए आपको string.c_str () की आवश्यकता है ताकि "मान को पूर्णांक में परिवर्तित नहीं किया जा सके" त्रुटि से बचने के लिए
पॉल चिल्ड्स

21

बस इसे पूरा करने के लिए:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

आपको एक लंबाई देनी होगी, लेकिन उस तार का प्रतिनिधित्व बदल सकता है:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

यदि आप उनके मूल्यों से डिबग करना चाहते हैं तो यह उपयोगी हो सकता है


1

उपयोग करना set elements ...हमेशा सबसे अच्छा तरीका नहीं है। यह उपयोगी होगा अगर एक अलग थे set string-elements ...

इसलिए, मैं अपने .gdbinit में इन कार्यों का उपयोग करता हूं:

define pstr
  ptype $arg0._M_dataplus._M_p
  printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
end

define pcstr
  ptype $arg0
  printf "[%d] = %s\n", strlen($arg0), $arg0
end

चेतावनियां:

  • पहला c ++ lib पर निर्भर है क्योंकि यह std :: string के सदस्यों तक पहुँचता है, लेकिन आसानी से समायोजित हो जाता है।
  • दूसरा केवल एक रनिंग प्रोग्राम पर इस्तेमाल किया जा सकता है क्योंकि इसे स्ट्रलेन कहते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.