2010-06-01 27 views
6

Tôi đang viết chương trình để triển khai thuật toán dòng chảy tối đa của Dinic qua mạng. Các mạng có thể được viết bằng tay hoặc được tải từ một tệp sử dụng chuyển hướng stdin. Tôi đã có thể sử dụng gdb để gỡ lỗi chương trình với các tệp nhỏ (khoảng 30 dòng), nhưng tôi gặp sự cố khi cố gắng gỡ lỗi chương trình với các tệp lớn hơn (> 1000 dòng). Mã bản thân là thế này:vấn đề gdb với chuyển hướng stdin

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); 
} 

Nếu tôi chạy chương trình mà không cần gdb, nó chạy, không ok vì nó tạo ra một lỗi segmentation (đó là lý do tôi đang cố gắng để sử dụng gdb), nhưng nó đi qua phần này của "phân tích cú pháp" tệp đầu vào (và viết nó vào tệp gỡ lỗi đầu ra). Tuy nhiên, nếu tôi gõ:

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

tôi nhận được:

(gdb) Program exited with 01 code. 

và khi tôi mở file gỡ lỗi đó là khoảng 2000 dòng, khi đó phải có ít nhất 1000, đó là chiều dài tập tin đầu vào .

Tôi lặp lại, điều này xảy ra với các tệp "lớn", nó hoạt động chính xác với các tệp nhỏ. Câu hỏi đặt ra là, tôi thiếu một cái gì đó khi sử dụng gdb, hoặc là một lỗi gdb?

Trả lời

7

Ok, cuối cùng tôi cũng có thể làm việc xung quanh. Có vẻ như tùy chọn --args không hoạt động tốt, ít nhất là trong trường hợp của tôi. Tôi có gdb 6.8-debian và debian 5.0.4.

Những gì tôi phải làm là chạy gdb mà không có sự lựa chọn --args:

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

và nó làm việc tốt. Có thể ai đó có thể thấy điều này hữu ích.

+0

Lưu ý rằng điều này không làm việc với MinGW trên Windows, như được mô tả ở đây: http://stackoverflow.com/a/3652530/47984 (và theo kinh nghiệm của tôi với gdb 7.7.1 của MinGW vừa rồi). –

2

Tôi đã gặp vấn đề tương tự và đã đưa ra giải pháp tương tự để chỉ định arg trong khi chạy. Tùy chọn --args chỉ có thể vượt qua đối số, nhưng không thể chuyển hướng stdin thường (trong ngữ cảnh không gỡ lỗi) được chuyển hướng cho bạn bởi trình vỏ gọi lệnh. Trong phiên gỡ lỗi, lệnh của bạn được gọi bởi gdb trong đó cả hai danh sách đối số và chuyển hướng được chỉ định bởi giá trị của biến số args. Bằng cách sử dụng tùy chọn --args bạn khởi tạo biến này (cũng như tệp chương trình để gỡ lỗi). Chỉ cần làm

(gdb) show args 

và điều này nên được khởi tạo thành --mode=NUM --verbose=LOW trong trường hợp của bạn. Nhưng không có chuyển hướng, vì vậy bạn chỉ định chúng với chạy, ghi đè args! Vì vậy, bạn có hai lựa chọn:

  1. Chỉ định cũng chuyển hướng trong args:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in 
    
  2. Chỉ định cũng chuyển hướng khi gọi run

Các vấn đề liên quan