2010-06-01 13 views
6

के साथ gdb परेशानी मैं नेटवर्क पर दीनिक के अधिकतम प्रवाह एल्गोरिदम को लागू करने के लिए एक प्रोग्राम लिख रहा हूं। नेटवर्क को हाथ से या स्टडीन रीडायरेक्शन का उपयोग करके फ़ाइल से लोड किया जा सकता है। मैं छोटी फ़ाइलों (लगभग 30 लाइनों) के साथ प्रोग्राम डीबग करने के लिए जीडीबी का उपयोग करने में सक्षम हूं, लेकिन जब मैं बड़ी फ़ाइलों (> 1000 लाइनों) के साथ प्रोग्राम डीबग करने का प्रयास करता हूं तो मुझे परेशानी हो रही है।stdin redirection

uint32_t read_lines = 0; 
while(!feof(stdin)) 
{ 
    err = fscanf(stdin, "%u %u %u\n", &n1, &n2, &c); 
    if (err != 3) 
    { 
     printf("read_lines=%u\n", read_lines); /*for debugging purposes*/ 
    } 
    read_lines += 1; 
    /* write to debug file */ 
    fprintf(debug, "line %u: %u %u %u\n", read_lines, n1, n2, c); 
} 

अगर मैं gdb के बिना कार्यक्रम चलाने के लिए, यह चलता है, ठीक नहीं है क्योंकि यह एक विभाजन गलती (जो कारण मैं gdb का उपयोग करने के कोशिश कर रहा हूँ है) उत्पन्न करता है, लेकिन यह माध्यम से चला जाता: कोड में ही यह है इनपुट फ़ाइल को "पार्सिंग" का यह हिस्सा (और इसे आउटपुट डीबगिंग फ़ाइल में लिखना)। हालांकि, अगर मैं टाइप करें:

gdb --args ./dinic --mode=NUM --verbose=LOW 
(gdb) b 61 
(gdb) run < tests/numterc.in 

मैं:

(gdb) Program exited with 01 code. 

और जब मैं डिबगिंग फ़ाइल को खोलने के लिए यह लगभग 2000 लाइनों है, जब यह होना चाहिए सबसे कम 1000 है, जो इनपुट फ़ाइल लंबाई है ।

मैं दोहराता हूं, यह "बड़ी" फ़ाइलों के साथ होता है, यह छोटे बच्चों के साथ सही काम करता है। प्रश्न होगा, क्या मुझे gdb का उपयोग करते समय कुछ याद आ रहा है, या यह एक जीडीबी बग है?

उत्तर

7

ठीक है, मैं अंत में एक काम-आसपास मिल सकता है। ऐसा लगता है कि कम से कम मेरे मामले में --args विकल्प अच्छी तरह से काम नहीं कर रहा है। मेरे पास जीडीबी 6.8-डेबियन और डेबियन 5.0.4 है।

मुझे क्या करना था --args विकल्प के बिना gdb चलाया गया था:

$gdb ./dinic 
(gdb) b 61 
(gdb) run --mode=NUM --verbose=LOW < tests/numterc.in 

और यह अच्छी तरह से काम किया। शायद कोई इसे उपयोगी पा सकता है।

+0

ध्यान दें कि यह MinGW साथ काम नहीं करता विंडोज़ पर, जैसा कि यहां वर्णित है: http://stackoverflow.com/a/3652530/47984 (और जैसा कि अभी मेरे द्वारा MinGW के gdb 7.7.1 के साथ अनुभव किया गया है)। –

2

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

(gdb) show args 

और इसे आपके मामले में --mode=NUM --verbose=LOW में प्रारंभ किया जाना चाहिए। लेकिन कोई पुनर्निर्देशन नहीं है, इसलिए आप उन्हें दौड़ के साथ निर्दिष्ट करते हैं, जो तर्कों को ओवरराइड करता है!

  1. निर्दिष्ट भी आर्ग में पुनर्निर्देशन:: तो आपके पास दो विकल्प

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in 
    
  2. भी पुनर्निर्देशन निर्दिष्ट करें जब लागू run