2009-08-25 9 views
6

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

मैं भी नाम से मूल्य निर्दिष्ट करने में सक्षम होना चाहता हूं, पता नहीं। लेकिन पता ठीक है। बोनस पॉइंट्स यदि मैं एक फ़ंक्शन के लिए स्थानीय मान निर्दिष्ट कर सकता हूं।

मैं अभी भी अपने सिर को जीडीबी के ट्रेस कमांड को समझने की कोशिश कर रहा हूं। कोई भी मदद बहुत ही सराहनीय होगी। धन्यवाद।

उत्तर

1

@derobert और @peter दोनों धन्यवाद! मैं अंततः इस पर वापस गया, और यह:

break main 
commands 
     watch somevar 
     commands 
       cont 
     end 
     cont 
end 
run 

चाल है। यह तब काम करता है जब "कुछवर" वैश्विक है, या स्थानीय "मुख्य" है। अगर "कुछवर" एथर फ़ंक्शन के लिए स्थानीय है, तो ऊपर दिए गए फ़ंक्शन नाम के साथ बस "मुख्य" को प्रतिस्थापित करें।

एक फ़ाइल में इन आदेशों रखो (जैसे, "gdbscript") और रन gdb की तरह:

gdb -x gdbscript a.out 
6

सबसे पहले, आपको डीबग प्रतीकों के साथ अपने प्रोग्राम को संकलित करना सुनिश्चित करना होगा, और शायद gdb को सबसे उपयोगी बनाने के लिए w/o अनुकूलन सुनिश्चित करना होगा। जीसीसी के लिए, यह -g -O0 होगा।

दूसरा, जो सुविधा आप खोज रहे हैं वह ट्रेसिंग नहीं है, इसकी घड़ी।

(gdb) help watch 
Set a watchpoint for an expression. 
A watchpoint stops execution of your program whenever the value of 
an expression changes. 

तो, कुछ उदाहरण कोड दिया:

int main() { 
    int a; 
    a = 1; 
    a = 2; 
    return 0; 
} 

आप फिर उस पर gdb चला सकते हैं, और:

(gdb) b main 
Breakpoint 1 at 0x80483a5: file test.c, line 4. 
(gdb) run 
Starting program: /tmp/test 

Breakpoint 1, main() at test.c:4 
4    a = 1; 
(gdb) watch a 
Hardware watchpoint 2: a 
(gdb) c 
Continuing. 
Hardware watchpoint 2: a 

Old value = -1207552288 
New value = 2 
main() at test.c:8 
8    return 0; 

यह ढेर पर एक होने के कारण थोड़ा अजीब काम कर रहा है, स्मृति नहीं और यदि अनुकूलन चालू था, तो यह भी कम काम करेगा: एक अनुकूलित किया जाएगा।

+1

'के रूप में अस्थिर int' घोषित' A', उदाहरण के बेहतर काम कर सकते हैं कि कोशिश करो। – caf

+0

धन्यवाद derobert। घड़ियों के बारे में जो मैं समझता हूं उससे यह है कि वे प्रोग्राम निष्पादन को तब तक समाप्त कर देते हैं जब तक कि उपयोगकर्ता "जारी नहीं रहता"। मुझे यकीन है कि मैं ऐसा करने के लिए एक उम्मीद स्क्रिप्ट लिख सकता हूं, लेकिन क्या यह स्वचालित रूप से जीडीबी के भीतर से ऐसा करने के लिए है? – tvaughan

+0

@tvaughan: मुझे gdb के भीतर ऐसा करने का स्वचालित तरीका पता नहीं है। – derobert

3

जैसा कि पहले से कहा गया है, आपको अपने चर पर एक घड़ी सेट करने की आवश्यकता है।

, जिसे आप

(gdb) help commands 
Set commands to be executed when a breakpoint is hit. 
Give breakpoint number as argument after "commands". 
With no argument, the targeted breakpoint is the last one set. 
The commands themselves follow starting on the next line. 
Type a line containing "end" to indicate the end of them. 
Give "silent" as the first line to make the breakpoint silent; 
then no output is printed when it is hit, except what the commands print. 

तो "कमांड" आदेश का उपयोग करें, घड़ी आदेश से watchpoint संख्या मिल जाए, और यह करने के

(gdp) commands 2 
> print a 
> cont 
> end 

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

आप दृष्टिकोण को सेट करने और जारी रखने के लिए अपने मूल ब्रेकपॉइंट में कमांड का भी उपयोग कर सकते हैं।

संबंधित मुद्दे