Jak załadować program czytający stdin i pobierający parametry w gdb?


101

Mam program, który pobiera dane wejściowe ze stdin, a także pobiera niektóre parametry z wiersza poleceń. To wygląda tak:

cat input.txt > myprogram -path "/home/user/work"

Próbuję debugować kod z gdb wewnątrz emacsa, przez Mx gdb, próbuję załadować program poleceniem:

gdb cat input.txt > myprogram -path "/home/user/work"

Jednak gdb tego nie lubi.

Pytanie zaczerpnięte stąd . Niestety nie rozumiem rozwiązania i nie jestem pewien co zrobić poza kompilacją z -gopcją i uruchomieniem polecenia Mx gdb.

Odpowiedzi:


132

Gdybyś robił to z powłoki, zrobiłbyś to w ten sposób:

% gdb myprogram
gdb> run params ... < input.txt

Wydaje się, że działa to również w emacsie.


Wydaje się, że przekierowanie działa, ale pojawiają się błędy. Nie udało się odczytać prawidłowego obrazu pliku obiektu z pamięci. Program został zakończony z kodem 042. Jakieś pomysły?
vinc456

To prawdopodobnie ogólny błąd GDB i prawdopodobnie nie ma to nic wspólnego z faktem, że używasz emacsa. Naucz się najpierw uruchamiać GDB z powłoki (z nowym pytaniem, jeśli to konieczne), a następnie martw się o uruchomienie go w emacsie.
Alnitak

1
Rozgryzłem to. Z jakiegoś powodu wpisałem void main (int argc, char * argv []) zamiast „int main ...” i wypadło mi to z oczu. W każdym razie wszystko teraz działa dobrze; dzięki za pomoc!
vinc456

2
Spóźnione podziękowanie - podręcznik gdb to ból w tyłku.
Usunięto

1
W systemie Windows przy użyciu msys64 otrzymuję <i input.txtjako argvargumenty do mojego programu :( Będę dalej kopać wokół tych odpowiedzi za pomocą mojego gdb 8.2.1: stackoverflow.com/questions/3544325/ ...
ixe013

32

Można to zrobić na kilka sposobów:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

lub

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

lub

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

gdzie runpolecenie gdb ( r) domyślnie używa argumentów ustawionych wcześniej w set args.


4
Kiedy próbuję tego z gdb w cygwin, to nie działa. Polecenie "show args" pokazuje, że wprowadziłem argumenty, które chciałem, ale kiedy uruchamiam program z "r", program czeka, aż napiszę coś, zamiast czytać z określonego pliku.
Cardiff Space Man

1
@cardiffspaceman, cóż, nie mogę tego przetestować z Cygwin - być może ich wersja gdb jest w jakiś sposób ograniczona
maxschlepzig

Dlaczego nie po prostu gdb -ex 'r -path /home/user/work < input.txt' myprogramw trzecim wariancie?
Ruslan

@Ruslan, również działa - użycie opcji „set args ...” daje tylko możliwość interaktywnego zdefiniowania niektórych punktów przerwania itp. Przed uruchomieniem programu
maxschlepzig

Prawda, ale możesz też ustawić punkt przerwania w sposób nieinteraktywny, np gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan

6

Ze względu na kompletność podczas rozpoczynania sesji debugowania dostępna jest również opcja --args. to znaczy)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
Jak przekierowałbyś input.txt jako dane wejściowe do yourprog po rozpoczęciu takiej sesji debugowania?
Peter Ajtai

1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar,

1
Działa to tylko wtedy, gdy „yourprog” oczekuje, że nazwa pliku będzie określać dane wejściowe, a nie przekierowanie danych wejściowych.
Alnitak

0

A jeśli nie musisz debugować od samego początku, możesz również dołączyć do już działającego procesu, używając:

$ gdb myprogram xxx

gdzie xxx to identyfikator procesu. Wtedy nie musisz podawać gdb argumentów początkowych.


4
Brakowało Ci odpowiedzi na tytuł pytania w części „Reading stdin”. Gdzieś zrobiłbym dobry komentarz, gdyby był krótszy.
Notinlist
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.