स्टडआउट के बजाय फाइल करने के लिए जीडीबी प्रिंट


104

मैं gdb चला रहा हूं और उन दुर्भाग्यपूर्ण देव वस्तुओं में से एक की जांच करना चाहता हूं। यह पूरी चीज़ देखने के लिए कई पृष्ठ लेता है (और मेरे पास 24 "मॉनिटर बग़ल में है!) उपयोग में आसानी के लिए, मैं gdb को स्क्रीन के बजाय किसी फ़ाइल में ऑब्जेक्ट प्रिंट करना चाहूंगा ताकि मैं इसे खोल सकूं vi और आसानी से घूमें। सभी gdb की बहुमुखी प्रतिभा के साथ, ऐसा करने का एक तरीका होना चाहिए, है ना?

जवाबों:


151

आपको लॉगिंग सक्षम करने की आवश्यकता है।

(gdb) set logging on

आप इसे बता सकते हैं कि किस फाइल का इस्तेमाल करना है।

(gdb) set logging file my_god_object.log

और आप वर्तमान लॉगिंग कॉन्फ़िगरेशन की जांच कर सकते हैं।

(gdb) show logging

15
और यदि आप चाहते हैं कि आउटपुट केवल लॉग फ़ाइल में जाए, तो उपयोग करें set logging redirect on
बेन सी।

5
क्या हमें set logging file my_god_object.logपहले सेट नहीं होना चाहिए set logging on?
हरपीज फ्री इंजीनियर

यह प्लस tail -fऔर awkआज वास्तव में मददगार था। धन्यवाद!
19 को रीसायकल

12

मैंने पाया है कि आप gdb से आउटपुट को runकमांड के माध्यम से फाइल में रीडायरेक्ट कर सकते हैं :

(gdb) run > outfile

11
यह प्रोग्राम से डिबग किया जा रहा आउटपुट होगा, स्वयं gdb से आउटपुट नहीं। ओपी जीडीबी के अपने आउटपुट को लॉग इन करना चाहता था।
पॉल


@ तिराहा, लेकिन यह वास्तव में बहुत उपयोगी है क्योंकि मैं एक क्यूटी प्रोग्राम को डिबग कर रहा हूं जो कि सिर्फ जीडीबी के स्टड को क्यूडबग कचरा के साथ मिटाता है
rostamn739

@ rostamn739 उप्स, सभी में मदद नहीं की
rostamn739

12

@ Quododup के उत्तर पर विस्तार

gdb core.3599 -ex bt -ex quit |& tee backtrace.log

-exस्विच एक gdb आदेश चलाता है। इसलिए उपरोक्त कोर फाइल लोड करता है, btकमांड चलाता है , फिर quitकमांड करता है। आउटपुट backtrace.logस्क्रीन पर भी लिखा है ।

एक अन्य उपयोगी gdb मंगलाचरण (सभी थ्रेड्स से स्थानीय चर के साथ स्टैकट्रेस देना) है

gdb core.3599 -ex 'thread apply all bt full' -ex quit

कुछ सिस्टम पर, आपको टाइप करना होगाgdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'धागा सभी bt पूर्ण लागू करें' -ex छोड़ें जोड़ें - एक प्रॉम्प्ट के बिना चलाने के लिए ले जाएं sudo gdb --batch core.3599 -ex 'धागा सभी bt पूर्ण' -ex लागू करें> आउटपुट .log
डेविड स्केली

9

से https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

आप किसी फ़ाइल में gdb कमांड के आउटपुट को सहेजना चाह सकते हैं। Gdb की लॉगिंग को नियंत्रित करने के लिए कई कमांड हैं।

set logging on

लॉगिंग करने देना।

set logging off

लॉगिंग अक्षम करें।

set logging file file

वर्तमान लॉगफ़ाइल का नाम बदलें। डिफ़ॉल्ट logfile gdb.txt है।

set logging overwrite [on|off]

डिफ़ॉल्ट रूप से, जीडीबी लॉगफ़ाइल में संलग्न होगा। ओवरराइट को सेट करें यदि आप चाहते हैं कि इसके बजाय लॉगफ़ाइल को अधिलेखित करने के लिए लॉगिंग सेट करें।

set logging redirect [on|off]

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

show logging

लॉगिंग सेटिंग्स के वर्तमान मान दिखाएं।


2
प्रतिलिपि के बिना sourceware.org/gdb/oniltocs/gdb/Logging-Output.html की कॉपी पेस्ट करें ।
हर्पीज फ्री इंजीनियर

5

आउटपुट को देखने के दौरान फ़ाइल में gdb लॉग करने की एक सरल विधि (जो कमांड लिखने में आसानी करती है) का उपयोग करना है tee:

gdb command |& tee gdb.log

1

हालाँकि यहाँ कई अच्छे उत्तर हैं, फिर भी मुझे केवल उसी चीज़ को पोस्ट करना है जो मेरे लिए काम करती है:

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt

यह एक ही log.txt फ़ाइल में gdb और बाइनरी आउटपुट प्राप्त करने का एकमात्र तरीका था , जबकि इसे कंसोल पर भी देखा गया था।

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

सावधानी: आउटपुट को आंशिक रूप से gdb आउटपुट और बाइनरी आउटपुट के बीच समन्वयित नहीं किया गया लगता है। क्या कोई पुष्टि कर सकता है? आप जाँच सकते हैं कि आपके टेलनेट / ssh क्लाइंट के पास आउटपुट को लॉग करने के लिए एक फ़ंक्शन है जो आप अपने कंसोल में देखते हैं।


1

आपके यहाँ कई उत्तर हैं। वे सही हैं। मैं केवल एक कमांड जोड़ना चाहता हूं जो आपको एक ही बार में सभी आउटपुट इकट्ठा करने में मदद करेगा। यह वास्तव में उपयोगी है जब आपका एक विशाल बैकट्रेस एकत्र करना। किसी भी लॉगिंग कॉन्फ़िगरेशन को करने से पहले, यह करें:

(gdb)set height 0

मैंने इसे इस लेख पर पाया: https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c45828285226351332

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