Jak automatycznie uruchomić plik wykonywalny w GDB?

92

Chciałbym gdbnatychmiast uruchomić plik wykonywalny, tak jakbym napisał „run” (motywacja: nie lubię pisać „run”).

Jednym ze sposobów jest potokowanie polecenia w gdbten sposób:

$ echo run | gdb myApp

Ale problem z tym podejściem polega na tym, że tracisz interaktywność z gdbnp. jeśli punkt przerwania wyzwala lub myAppulega awarii, gdbkończy działanie. Ta metoda jest omawiana tutaj .

Patrząc na opcje w --help, nie widzę sposobu, aby to zrobić, ale być może czegoś mi brakuje.

orion elenzil
źródło

Odpowiedzi:

129
gdb -ex run ./a.out

Jeśli potrzebujesz przekazać argumenty do a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

EDYCJA: Orion mówi, że to nie działa w systemie Mac OSX.

-exFlaga jest dostępna od GDB-6.4(wydany w 2005), ale OSX używa widelca Apple z GDB, a najnowszy XCode dla Leoparda zawiera GDB 6.3.50-20050815 (Apple version gdb-967), więc pecha.

Tworzenie aktualnej GDB-7.0.1wersji jest jednym z możliwych rozwiązań. Po prostu koniecznie przeczytaj to .

Zatrudniony Rosjanin
źródło
1
Dziękuję za odpowiedź. ta linia zachowuje się dla mnie tak samo jak po prostu „gdb ./a.out”.
orion elenzil
3
Właśnie potwierdziłem, że możesz również przekazać wiele opcji -ex w wierszu poleceń i będą one działać w kolejności przed przesłaniem danych wejściowych gdb do ciebie.
Tung Nguyen,
To rozwiązanie nie działa, jeśli program ma argumenty takie jak:./a.out a b
gigilibala
ponieważ OSX / xcode nie obsługuje już gdb po wyjęciu z pudełka (lldb to nowy gdb), teraz wydaje się to lepszym podejściem.
orion elenzil
Zrobiłem plik poleceń i używam go gdb -xw systemach Linux. OS X używa LLVM i clang, więc sprawdź możliwości debugowania lldb.
Daisuke Aramaki
23

Użyłbym skryptu gdb:

gdb -x your-script

gdzie twój-skrypt zawiera coś takiego:

file a.out
b main
r

potem masz normalny interaktywny znak zachęty gdb

EDYCJA :

oto optymalizacja dla naprawdę leniwych:

  1. zapisz skrypt jak .gdbinitw working directory.
  2. Następnie po prostu uruchom gdb jako

    gdb

... a gdb automatycznie ładuje i wykonuje zawartość .gdbinit.


źródło
hej dzięki za odpowiedź. wygląda to na to, czego chcę, z wyjątkiem tego, że nie otrzymuję zachęty gdb, otrzymuję zawieszenie gdb i wróciłem do wiersza poleceń, jakbym wpisał „ctrl-z”. jeśli „fg”, gdb wznawia działanie i aplikacja działa. to jest OS X.
orion elenzil
orion: mmmh - to mnie zaskoczyło. Działa dobrze z każdym systemem UNIX, którego aktualnie używam (Linux, Solaris, AIX). Jakiej wersji GDB używasz?
Właśnie ponownie zweryfikowałem zachowanie tego - nadal opuszcza mnie do wiersza poleceń z zawieszonym gdb.GNU gdb 6.3.50-20050815 (wersja Apple gdb-1518) (sob. 12 lutego 02:52:12 UTC 2011).
orion elenzil
@orionelenzil Nie mam pojęcia dlaczego, ale jeśli wstawisz fgpo rlinii, działa to
zdrowo
startKomenda zapewnia skrót do b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli郝海东冠状病六四事件法轮功
20
(echo r ; cat) | gdb a.out

Kot pozwala na pisanie dalej po przerwach w gdb.

cadabra
źródło
whoa, super. musisz ctrl-c po wyjściu z gdb, aby zatrzymać kota, ale to świetnie.
orion elenzil
3
Wygląda na to, że przy użyciu tego tracisz kontrolę nad klawiszami w instancji gdb.
Treviño,
Ponadto pytania takie jak Make breakpoint pending on future shared library load? (y or [n])automatycznie przyjmują odpowiedź „Nie”.
Rusłan
6

start Komenda

To polecenie jest kolejną dobrą opcją:

gdb -ex start --args ./a.out arg1 arg2

To jest jak bieg, ale także ustawia tymczasowy punkt przerwania maini zatrzymuje się tam.

Ten tymczasowy punkt przerwania jest dezaktywowany po trafieniu.

starti

Istnieje również powiązanie, startiktóre uruchamia program i zamiast tego zatrzymuje się na pierwszej instrukcji, zobacz także: Zatrzymanie na pierwszej instrukcji kodu maszynowego w GDB

Świetnie, gdy robisz coś na niskim poziomie.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
4

gdb -x <(echo run) --args $program $args

met
źródło