Comment exécuter automatiquement l'exécutable dans GDB?


91

J'aurais aimé gdblancer immédiatement l'exécutable, comme si j'avais tapé "run" (motivation: je n'aime pas taper "run").

Une façon est de diriger la commande pour gdbaimer ceci:

$ echo run | gdb myApp

Mais le problème avec cette approche est que vous perdez l'interactivité avec gdb, par exemple. si un point d'arrêt se déclenche ou se myAppbloque, se gdbferme. Cette méthode est discutée ici .

En regardant les options dans --help, je ne vois pas de moyen de le faire, mais peut-être que je manque quelque chose.

Réponses:


127
gdb -ex run ./a.out

Si vous devez transmettre des arguments à a.out:

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

EDIT: Orion dit que cela ne fonctionne pas sur Mac OSX.

Le -exdrapeau est disponible depuis GDB-6.4(sorti en 2005), mais OSX utilise le fork d'Apple de GDB, et le dernier XCode pour Leopard contient GDB 6.3.50-20050815 (Apple version gdb-967), donc vous n'avez pas de chance.

La création de la GDB-7.0.1version actuelle est une solution possible. Assurez-vous simplement de lire ceci .


1
Merci d'avoir répondu. cette ligne se comporte comme juste "gdb ./a.out" pour moi tho.
orion elenzil

3
Je viens de confirmer que vous pouvez également passer plusieurs options -ex sur la ligne de commande et qu'elles fonctionneront dans l'ordre avant de vous transférer l'entrée gdb.
Tung Nguyen

Cette solution ne fonctionne pas si le programme a des arguments comme:./a.out a b
gigilibala

puisque OSX / xcode ne prend plus en charge gdb par défaut (lldb est le nouveau gdb), cela semble maintenant être la meilleure approche.
orion elenzil

J'ai créé un fichier de commande et utilisé gdb -xsur les systèmes Linux. OS X utilise LLVM et clang alors vérifiez les capacités de débogage de lldb.
Daisuke Aramaki

22

J'utiliserais un script gdb:

gdb -x your-script

votre-script contient quelque chose comme:

file a.out
b main
r

ensuite vous avez l'invite gdb interactive normale

MODIFIER :

voici une optimisation pour les vraiment paresseux:

  1. enregistrez le script comme .gdbinitdans le working directory.
  2. Ensuite, vous exécutez simplement gdb comme

    gdb

... et gdb charge et exécute automatiquement le contenu de .gdbinit.


hé merci pour la réponse. cela ressemble à ce que je veux sauf que je ne reçois pas l'invite gdb, je reçois gdb suspendu et je suis de retour à la ligne de commande comme si j'avais tapé "ctrl-z". si je "fg", alors gdb reprend et l'application s'exécute. c'est OS X.
orion elenzil

orion: mmmh - c'est surprenant pour moi. Fonctionne bien avec toutes les versions UNIX que j'utilise actuellement (Linux, Solaris, AIX). Quelle version de gdb utilisez-vous?

Je viens de re-vérifier le comportement de ceci - me quitte toujours à la ligne de commande w / gdb suspendu.GNU gdb 6.3.50-20050815 (version Apple gdb-1518) (samedi 12 février 02:52:12 UTC 2011).
orion elenzil

@orionelenzil Je ne sais pas pourquoi, mais si vous mettez fgaprès la rligne, ça agit sainement
dbr


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

Le chat vous permet de continuer à taper après les pauses gdb.


whoa, génial. vous devez ctrl-c après avoir quitté gdb pour arrêter le chat, mais c'est génial.
orion elenzil

3
Il semble que vous perdiez un contrôle de clé sur l'instance gdb en utilisant ceci.
Treviño

De plus, des questions telles Make breakpoint pending on future shared library load? (y or [n])que la réponse supposeront automatiquement "Non".
Ruslan

6

start commander

Cette commande est une autre bonne option:

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

C'est comme exécuter, mais définit également un point d'arrêt temporaire à mainet s'arrête là.

Ce point d'arrêt temporaire est désactivé une fois qu'il est atteint.

starti

Il existe également un lien startiqui démarre le programme et s'arrête à la toute première instruction à la place, voir aussi: Arrêt à la première instruction de code machine dans GDB

Excellent lorsque vous faites des choses de bas niveau.


4

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.