gdb Probleme mit stdin-Umleitung
Ich Schreibe ein Programm zum implementieren von Dinic s-max-flow-Algorithmus, der über ein Netzwerk. Die Netze geschrieben werden können, entweder von hand oder aus einer Datei geladen mit stdin-Umleitung.
Ich habe in der Lage, verwenden Sie gdb, um das Programm zu Debuggen mit kleinen Dateien (um die 30 Zeilen), aber ich habe Schwierigkeiten, wenn ich versuche zu Debuggen das Programm bei größeren Dateien (>1000 Zeilen). Der code an sich ist diese:
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);
}
Wenn ich das Programm ohne gdb, es läuft, nicht in Ordnung ist, wie es erzeugt einen segmentation fault (das ist der Grund, warum ich versuche, gdb), aber es geht durch dieses Teil "Parsen" des Eingabe-Datei (und schreiben Sie es in die Ausgabe von debugging-Datei).
Wenn ich allerdings geben:
gdb --args ./dinic --mode=NUM --verbose=LOW
(gdb) b 61
(gdb) run < tests/numterc.in
Bekomme ich:
(gdb) Program exited with 01 code.
und wenn ich öffnen Sie die debugging-Datei es ist über 2000 Zeilen, wenn es sollte höchstens 1000, das ist die input-Datei der Länge.
Ich wiederhole, dies geschieht mit "großen" Dateien, es funktioniert korrekt mit den kleinen.
Die Frage wäre, bin ich etwas fehlt, wenn die Verwendung des gdb, oder ist das ein gdb bug?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich konnte endlich mal ein work-around. Es scheint, dass die --args-option ist nicht gut arbeiten, zumindest in meinem Fall. Ich habe gdb 6.8-debian-und debian 5.0.4.
Was ich tun musste, war laufen gdb ohne die --args-option:
und es funktionierte gut. Vielleicht kann jemand diese nützlich finden.
Ich hatte das gleiche problem und kam auf die gleiche Lösung zu geben args in laufen. Die option
--args
nur können Argumente übergeben werden, aber doch nicht die Umleitungstdin
die normalerweise (im nicht-debug-Kontext) umgeleitet, für die Sie von der shell aufzurufen. In der debug-Sitzung Ihren Befehl aufgerufen wird, indem Siegdb
wo beide argument-Liste und Umleitungen sind angegeben durch den Wert desargs
variable. Mithilfe der--args
option initialisieren Sie diese variable (und die Programm-Datei Debuggen wie auch). Nur tunwerden und dies sollte initialisiert werden, um
--mode=NUM --verbose=LOW
in Ihrem Fall. Aber keine Umleitung, so dass Sie geben Sie mit Durchgang, überschreibt args! So haben Sie zwei Möglichkeiten:Geben Sie auch die Umleitung in args:
Geben Sie auch die Umleitung beim aufrufen der
run