Wie führe ich die ausführbare Datei automatisch in GDB aus?

88

Ich hätte gdbdie ausführbare Datei gerne sofort ausgeführt, als hätte ich "run" eingegeben (Motivation: Ich mag es nicht, "run" einzugeben).

Eine Möglichkeit besteht darin, den Befehl gdbwie folgt zu leiten :

$ echo run | gdb myApp

Das Problem bei diesem Ansatz ist jedoch, dass Sie die Interaktivität verlieren gdb, z. Wenn ein Haltepunkt ausgelöst wird oder myAppabstürzt, wird er gdbbeendet. Diese Methode wird hier diskutiert .

Wenn --helpich mir die Optionen in anschaue , sehe ich keinen Weg, dies zu tun, aber vielleicht fehlt mir etwas.

Orion Elenzil
quelle

Antworten:

124
gdb -ex run ./a.out

Wenn Sie Argumente übergeben müssen an a.out:

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

EDIT: Orion sagt, dass dies unter Mac OS X nicht funktioniert.

Die -exFlagge ist seit GDB-6.4(veröffentlicht im Jahr 2005) verfügbar , aber OSX verwendet Apples GDB-Gabel, und der neueste XCode für Leopard enthält GDB 6.3.50-20050815 (Apple version gdb-967), sodass Sie kein Glück haben.

Das Erstellen einer aktuellen GDB-7.0.1Version ist eine mögliche Lösung. Lesen Sie dies unbedingt durch .

Angestellt Russisch
quelle
1
Danke für die Antwort. Diese Zeile verhält sich für mich genauso wie "gdb ./a.out".
Orion Elenzil
3
Ich habe gerade bestätigt, dass Sie auch mehrere -ex-Optionen in der Befehlszeile übergeben können und diese in der richtigen Reihenfolge ausgeführt werden, bevor Sie die GDB-Eingabe an Sie übertragen.
Tung Nguyen
Diese Lösung funktioniert nicht, wenn das Programm Argumente wie:./a.out a b
Gigilibala
Da OSX / xcode gdb nicht mehr sofort unterstützt (lldb ist die neue gdb), scheint dies nun der bessere Ansatz zu sein.
Orion Elenzil
Ich habe eine Befehlsdatei erstellt und gdb -xauf Linux-Systemen verwendet. OS X verwendet LLVM und Clang. Überprüfen Sie daher die Debugging-Funktionen von lldb.
Daisuke Aramaki
22

Ich würde ein GDB-Skript verwenden:

gdb -x your-script

wo dein-Skript so etwas enthält wie:

file a.out
b main
r

Danach haben Sie die normale interaktive GDB-Eingabeaufforderung

EDIT :

Hier ist eine Optimierung für die wirklich Faulen:

  1. Speichern Sie das Skript wie .gdbinitim working directory.
  2. Danach führen Sie einfach gdb as aus

    gdb

... und gdb lädt automatisch den Inhalt von .gdbinit und führt ihn aus.


quelle
Hey, danke für die Antwort. das sieht so aus, als ob ich genau das will, außer dass ich die gdb-Eingabeaufforderung nicht bekomme, gdb angehalten werde und ich wieder in der Kommandozeile bin, als hätte ich "ctrl-z" eingegeben. wenn ich "fg", dann wird gdb fortgesetzt und die App läuft. Dies ist OS X.
Orion Elenzil
orion: mmmh - das überrascht mich. Funktioniert gut mit jeder UNIX-Variante, die ich tatsächlich verwende (Linux, Solaris, AIX). Welche GDB-Version verwenden Sie?
Ich habe gerade das Verhalten erneut überprüft - ich werde immer noch zur Befehlszeile mit ausgesetztem GDB zurückkehren. GNU GDB 6.3.50-20050815 (Apple-Version GDB-1518) (Sa 12. Februar 02:52:12 UTC 2011).
Orion Elenzil
@orionelenzil Keine Ahnung warum, aber wenn Sie fgnach der rLinie setzen, handelt es vernünftig
dbr
Der startBefehl bietet eine Verknüpfung für b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli 法轮功 冠状 病 六四. 23
20
(echo r ; cat) | gdb a.out

Mit der Katze können Sie nach GDB-Pausen weiter tippen.

Cadabra
quelle
whoa, großartig. Sie müssen nach dem Beenden von gdb Strg-C drücken, um die Katze zu stoppen, aber das ist großartig.
Orion Elenzil
3
Es sieht so aus, als ob Sie damit die Schlüsselkontrolle für die GDB-Instanz verlieren.
Treviño
Darüber hinaus wird bei Fragen wie Make breakpoint pending on future shared library load? (y or [n])automatisch die Antwort "Nein" angenommen.
Ruslan
6

start Befehl

Dieser Befehl ist eine weitere gute Option:

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

Es ist wie ein Lauf, setzt aber auch einen temporären Haltepunkt mainund stoppt dort.

Dieser temporäre Haltepunkt wird deaktiviert, sobald er getroffen wird.

starti

Es gibt auch einen verwandten, startider das Programm startet und stattdessen beim allerersten Befehl stoppt, siehe auch: Stoppen beim ersten Maschinencode-Befehl in GDB

Großartig, wenn du ein paar Sachen auf niedrigem Niveau machst.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
4

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

meth
quelle