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.

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 .


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.


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


20
(echo r ; cat) | gdb a.out

Kot pozwala na pisanie dalej po przerwach w gdb.


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.


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.