Forum: Compiler & IDEs GDB + Programm + Pipes


von Dennis S. (eltio)


Lesenswert?

Hallo zusammen,

ich lese in meinem C-Programm per scanf eine Reihe von Daten ein. Damit 
ich das nicht immer von Hand machen muss habe ich die Daten in eine 
Text-Datei geschrieben und rufe das Programm mit einer Pipe auf:
1
more prog.exe | input.txt

Frage: kann ich diese Funktionalität mit dem GNU Debugger verbinden?

Gruß Dennis

von Rolf Magnus (Gast)


Lesenswert?

Ja.

von Klaus W. (mfgkw)


Lesenswert?

more prog.exe liest die aber das Programm, und führt es nicht aus.

von Dennis S. (eltio)


Lesenswert?

@Klaus: Mein Fehler! Es muss natürlich heißen:
1
more input.txt | prog.exe

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wofür soll das "more" dabei noch gut sein?

Warum nicht gleich
1
prog.exe < input.txt

?

von Dennis S. (eltio)


Lesenswert?

Jörg Wunsch schrieb:
> Wofür soll das "more" dabei noch gut sein?
>
> Warum nicht gleich
>
>
1
prog.exe < input.txt
>
> ?

Hallo Jörg,
auch da besteht die Frage: wie bekomme ich das in GDB rein?

Gruß

von Rolf Magnus (Gast)


Lesenswert?

1
gdb prog.exe
2
run < input.txt

von Dennis S. (eltio)


Lesenswert?

Rolf Magnus schrieb:
>
1
> gdb prog.exe
2
> run < input.txt
3
>

Hmm... das funktioniert nicht so wie ich mir das vostelle. GDB (Version 
7.5) sagt zwar
"Reading symbols .... done." und
"Starting program: prog.exe < input.txt",
danach passiert aber nichts mehr (auch nach Eingabe von continue nicht). 
Gebe ich stattdessen die Daten manuell ein, geht alles wie gehabt.

Noch jemand eine Idee?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dennis S. schrieb:
> danach passiert aber nichts mehr (auch nach Eingabe von continue nicht).

Das passt nicht zusammen.

Wenn "nichts mehr passiert", wie willst du dann "continue" eingeben?

Wenn wirklich nichts mehr passiert, solltest du mit ^C einen Interrupt
senden können und dann sehen, an welcher Stelle das Programm jetzt
ist.

von Dennis S. (eltio)


Lesenswert?

Jörg Wunsch schrieb:
> Wenn "nichts mehr passiert", wie willst du dann "continue" eingeben?
Naja.... nach den zwei Befehlen warte ich. Es kommt keine Ausgabe, wie 
es eigentlich geschehen müsste (bei Aufruf ohne GDB). Ich kann aber 
Befehle eintippen, zum Beispiel "continue", "next", ... Wenn ich das 
mache kommt immer noch keine Ausgabe.

> Wenn wirklich nichts mehr passiert, solltest du mit ^C einen Interrupt
> senden können und dann sehen, an welcher Stelle das Programm jetzt
> ist.

Das habe ich ausprobiert:
1
gdb prog.exe
2
run < input.txt
3
STRG+C

Dann kommt die Ausgabe:
1
Program received signal SIGINT, Interrupt.
2
[...]
3
error detected on stdin

Es scheint wohl doch nicht möglich zu sein!?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dennis S. schrieb:
> Es scheint wohl doch nicht möglich zu sein!?

Kann sein.  Entweder ein Problem von GDB unter Windows generell,
oder eins speziell mit deinem Build.  Habe es gerade unter Unix
probiert:
1
$ cat lc.c
2
#include <stdio.h>
3
4
int
5
main(void)
6
{
7
        int cnt = 0;
8
        char b[100];
9
10
        while (fgets(b, 100, stdin) != NULL)
11
                cnt++;
12
13
        printf("Count: %d\n", cnt);
14
15
        return 0;
16
}
17
$ cc -O -o lc -g lc.c
18
$ gdb lc
19
GNU gdb (GDB) 7.6 [GDB v7.6 for FreeBSD]
20
Copyright (C) 2013 Free Software Foundation, Inc.
21
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
22
This is free software: you are free to change and redistribute it.
23
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
24
and "show warranty" for details.
25
This GDB was configured as "i386-portbld-freebsd8.2".
26
For bug reporting instructions, please see:
27
<http://www.gnu.org/software/gdb/bugs/>...
28
Reading symbols from /tmp/lc...done.
29
(gdb) run < /usr/share/dict/words
30
Starting program: /tmp/lc < /usr/share/dict/words
31
Count: 235923
32
[Inferior 1 (process 84800) exited normally]
33
(gdb) quit

von Rolf Magnus (Gast)


Lesenswert?

Hmm, bei mir funktioniert das so.

Dennis S. schrieb:
> Dann kommt die Ausgabe:Program received signal SIGINT, Interrupt.
> [...]
> error detected on stdin

Offenbar wartet dein Programm auf irgendwas. Tipp doch mal bt ein, um zu 
sehen, wo das Programm stehen geblieben ist. Vielleicht gibt das 
Aufschluss.

von Dennis S. (eltio)


Lesenswert?

Also wenn ich bt eintippe kommt... nichts (nur Zeilenwechsel). 
Anschließendes Drücken von "STRG+C" liefert
1
0x77116da7 in NlsUpdatesystemLocale () from C:\windows\syswow64\kernel32.dll

Ich probiere das trotzdem heute Abend mal auf meiner Linux-Kiste aus.

von Rolf Magnus (Gast)


Lesenswert?

Dennis S. schrieb:
> Ich probiere das trotzdem heute Abend mal auf meiner Linux-Kiste aus.

Ja. Vielleicht ist es doch wie von Jörg vermutet ein 
Windows-spezifisches Problem.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dennis S. schrieb:

> Anschließendes Drücken von "STRG+C" liefert
>
1
> 0x77116da7 in NlsUpdatesystemLocale () from 
2
> C:\windows\syswow64\kernel32.dll
3
>

Dort kannst du natürlich nochmal "bt" eingeben.

Klingt ja so, als wäre das Programm noch in der Initialisierungsphase
(NLS = National Language Support).

von Rolf Magnus (Gast)


Lesenswert?

Dennis S. schrieb:
> Also wenn ich bt eintippe kommt... nichts (nur Zeilenwechsel).
> Anschließendes Drücken von "STRG+C" liefert

Du mußt erst Strg+C drücken, um das Programm anzuhalten, und danach 
kannst du bt eingeben, um einen Backtrace zu erhalten.

von Dennis S. (eltio)


Lesenswert?

So... hab das Ganze gerade unter Linux auprobiert, da klappt es! Da will 
man sich einmal in ein neues Thema einarbeiten... ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.