Як автоматично запустити виконуваний файл у GDB?


92

Я хотів би gdbнегайно запустити виконуваний файл, ніби набрав "запустити" (мотивація: мені не подобається вводити "запустити").

Одним із способів є передача команди gdbтаким чином:

$ echo run | gdb myApp

Але проблема такого підходу полягає в тому, що ви втрачаєте інтерактивність gdb, наприклад. якщо точка зупинки спрацьовує або myAppаварійно gdbзавершує роботу , завершує роботу. Цей метод обговорюється тут .

Переглядаючи варіанти --help, я не бачу способу зробити це, але, можливо, я чогось пропускаю.

Відповіді:


128
gdb -ex run ./a.out

Якщо вам потрібно передати аргументи a.out:

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

EDIT: Orion каже, що це не працює на Mac OSX.

-exПрапор був доступний з GDB-6.4(випущений в 2005 році), але OSX використовує вилку від Apple в GDB, і остання 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.
Дайсуке Арамакі

22

Я б використав скрипт gdb:

gdb -x your-script

де ваш скрипт містить щось на зразок:

file a.out
b main
r

згодом у вас з'явиться звичайний інтерактивний запит gdb

РЕДАГУВАТИ :

ось оптимізація для справді ледачих:

  1. зберегти сценарій, як .gdbinitу working directory.
  2. Згодом ви просто запускаєте gdb as

    gdb

... і gdb автоматично завантажує та виконує вміст .gdbinit.


привіт дякую за відповідь. це виглядає як саме те, що я хочу, за винятком того, що я не отримую запит gdb, я отримую призупинення роботи gdb, і я повертаюся до командного рядка, ніби я набрав "ctrl-z". якщо я "fg", то gdb відновлюється, і програма запускається. це OS X.
orion elenzil

orion: mmmh - це для мене дивно. Добре працює з кожним ароматом UNIX, який я фактично використовую (Linux, Solaris, AIX). Яку версію GDB ви використовуєте?

я просто переосмислив поведінку цього - все ще виходить до командного рядка w / gdb suspended. 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
Чіро Сантіллі郝海东冠状病六四事件法轮功

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

Кішка дозволяє продовжувати друкувати після перерв у gdb.


що, чудово. вам потрібно ctrl-c після виходу з gdb, щоб зупинити кота, але це чудово.
orion elenzil

3
Схоже, ви втрачаєте якийсь ключ-контроль на екземплярі gdb, використовуючи це.
Тревіньо

Більше того, такі запитання 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

Чудово, коли ви робите якісь речі низького рівня.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.