Как автоматически запустить исполняемый файл в GDB?

92

Я бы хотел gdbсразу запустить исполняемый файл, как если бы я набрал «запустить» (мотивация: мне не нравится печатать «запустить»).

Один из способов - передать команду gdbтак:

$ echo run | gdb myApp

Но проблема с этим подходом в том, что вы теряете интерактивность gdb, например. если срабатывает точка останова или происходит myAppсбой, gdbзавершается работа. Этот метод обсуждается здесь .

Глядя на варианты --help, я не вижу способа сделать это, но, возможно, я что-то упускаю.

Орион Элензил
источник

Ответы:

129
gdb -ex run ./a.out

Если вам нужно передать аргументы a.out:

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

РЕДАКТИРОВАТЬ: Орион говорит, что это не работает в Mac OSX.

Этот -exфлаг был доступен с тех пор GDB-6.4(выпущен в 2005 году), но OSX использует форк GDB от Apple, и последний XCode для Leopard содержит GDB 6.3.50-20050815 (Apple version gdb-967), так что вам не повезло.

Сборка текущей GDB-7.0.1версии - одно из возможных решений. Обязательно прочтите это .

Занятые русские
источник
1
Спасибо за ответ. эта строка для меня ведет себя так же, как просто "gdb ./a.out".
orion elenzil
3
Я только что подтвердил, что вы также можете передать несколько параметров -ex в командной строке, и они будут запускаться по порядку перед передачей вам ввода gdb.
Tung Nguyen
Это решение не работает, если у программы есть такие аргументы, как:./a.out a b
gigilibala
поскольку OSX / xcode больше не поддерживает gdb из коробки (lldb - это новый gdb), теперь это кажется лучшим подходом.
orion elenzil
Я сделал командный файл и использую его gdb -xв системах Linux. OS X использует LLVM и clang, поэтому ознакомьтесь с возможностями отладки lldb.
Дайсуке Арамаки
23

Я бы использовал gdb-скрипт:

gdb -x your-script

где your-script содержит что-то вроде:

file a.out
b main
r

после этого у вас будет обычная интерактивная подсказка gdb

ИЗМЕНИТЬ :

вот оптимизация для истинно ленивых:

  1. сохраните скрипт как .gdbinitв working directory.
  2. После этого вы просто запускаете gdb как

    gdb

... и gdb автоматически загружает и выполняет содержимое .gdbinit.


источник
привет спасибо за ответ. это похоже на то, что я хочу, за исключением того, что я не получаю приглашение gdb, я получаю приостановку gdb, и я снова в командной строке, как если бы я набрал "ctrl-z". если я "fg", то GDB возобновляет работу и приложение запускается. это OS X.
orion elenzil
орион: ммм - это меня удивляет. Хорошо работает со всеми разновидностями UNIX, которые я использую (Linux, Solaris, AIX). Какую версию gdb вы используете?
Я только что перепроверил поведение этого - все еще выходит в командную строку с приостановленным gdb. GNU gdb 6.3.50-20050815 (версия Apple gdb-1518) (Сб, 12 февраля, 02:52:12 UTC, 2011).
orion elenzil
@orionelenzil Не знаю почему, но если поставить fgпосле rстроки, действует разумно
dbr
Команда startпредоставляет ярлык для b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli 郝海东 冠状 病 六四 事件
20
(echo r ; cat) | gdb a.out

Кот позволяет вам продолжать печатать после того, как GDB прерывается.

кадабра
источник
эй, круто. вам нужно нажать ctrl-c после выхода из gdb, чтобы остановить кота, но это здорово.
orion elenzil
3
Похоже, вы теряете некоторые ключевые элементы управления экземпляром gdb, используя это.
Treviño
Более того, такие вопросы, как Make breakpoint pending on future shared library load? (y or [n])автоматически предполагают ответ «Нет».
Руслан
6

start команда

Эта команда - еще один хороший вариант:

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

Это похоже на запуск, но также устанавливает временную точку останова mainи останавливается на ней.

Эта временная точка останова деактивируется после ее достижения.

starti

Существует также связанный, startiкоторый запускает программу и вместо этого останавливается на самой первой инструкции, см. Также: Остановка на первой инструкции машинного кода в GDB

Отлично, когда вы делаете что-то низкое.

Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник