Bagaimana cara menjalankan executable di GDB secara otomatis?

92

Saya ingin gdbsegera menjalankan executable, seolah-olah saya mengetik "run" (motivasi: Saya tidak suka mengetik "run").

Salah satu caranya adalah menyalurkan perintah menjadi gdbseperti ini:

$ echo run | gdb myApp

Tetapi masalah dengan pendekatan ini adalah Anda kehilangan interaktivitas dengan gdb, misalnya. jika breakpoint memicu atau myAppcrash, gdbberhenti. Metode ini dibahas di sini .

Melihat opsi di --help, saya tidak melihat cara untuk melakukan ini, tapi mungkin saya melewatkan sesuatu.

orion elenzil
sumber

Jawaban:

129
gdb -ex run ./a.out

Jika Anda perlu meneruskan argumen ke a.out:

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

EDIT: Orion mengatakan ini tidak berfungsi di Mac OSX.

The -exflag telah tersedia sejak GDB-6.4(dirilis pada tahun 2005), tapi OSX menggunakan garpu Apple GDB, dan Xcode terbaru untuk Leopard mengandung GDB 6.3.50-20050815 (Apple version gdb-967), sehingga Anda beruntung.

Membangun GDB-7.0.1rilis saat ini adalah salah satu solusi yang mungkin. Pastikan untuk membaca ini .

Bekerja di Rusia
sumber
1
Terima kasih atas jawabannya. baris itu berperilaku sama seperti hanya "gdb ./a.out" untuk saya tho.
orion elenzil
3
Saya baru saja mengonfirmasi bahwa Anda juga dapat memberikan beberapa opsi -ex pada baris perintah dan mereka akan berjalan berurutan sebelum mentransfer masukan gdb kepada Anda.
Tung Nguyen
Solusi ini tidak berfungsi jika program memiliki argumen seperti:./a.out a b
gigilibala
karena OSX / xcode tidak lagi mendukung gdb di luar kotak (lldb adalah gdb baru), sekarang ini sepertinya pendekatan yang lebih baik.
orion elenzil
Saya membuat file perintah dan digunakan gdb -xpada sistem Linux. OS X menggunakan LLVM dan clang jadi periksalah kapabilitas debugging lldb.
Daisuke Aramaki
23

Saya akan menggunakan gdb-script:

gdb -x your-script

di mana skrip Anda berisi sesuatu seperti:

file a.out
b main
r

setelah itu Anda memiliki prompt gdb interaktif normal

EDIT :

berikut adalah optimasi untuk yang benar-benar malas:

  1. simpan skrip seperti .gdbinitpada working directory.
  2. Setelah itu Anda cukup menjalankan gdb as

    gdb

... dan gdb secara otomatis memuat dan mengeksekusi konten .gdbinit.


sumber
hei terima kasih atas jawabannya. Itu terlihat seperti yang saya inginkan kecuali saya tidak mendapatkan prompt gdb, saya mendapatkan gdb ditangguhkan dan saya kembali ke baris perintah seolah-olah saya mengetik "ctrl-z". jika i "fg", maka gdb dilanjutkan dan aplikasi berjalan. ini adalah OS X.
orion elenzil
orion: mmmh - itu mengejutkan saya. Bekerja dengan baik dengan setiap rasa UNIX yang sebenarnya saya gunakan (Linux, Solaris, AIX). Versi gdb apa yang Anda gunakan?
saya baru saja memverifikasi ulang perilaku ini - masih keluar dari saya ke baris perintah w / gdb ditangguhkan.GNU gdb 6.3.50-20050815 (Apple versi gdb-1518) (Sabtu 12 Februari 02:52:12 UTC 2011).
orion elenzil
@orionelenzil Tidak tahu mengapa, tetapi jika Anda meletakkannya fgsetelah rantrean, tindakannya masuk akal
dbr
The startperintah menyediakan shortcut untuk b+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli郝海东冠状病六四事件法轮功
20
(echo r ; cat) | gdb a.out

Kucing mengizinkan Anda tetap mengetik setelah gdb istirahat.

cadabra
sumber
whoa, mengagumkan. Anda harus menekan ctrl-c setelah keluar dari gdb untuk menghentikan kucing, tapi itu bagus.
orion elenzil
3
Sepertinya Anda kehilangan beberapa kontrol kunci pada instance gdb menggunakan ini.
Treviño
Selain itu, pertanyaan seperti Make breakpoint pending on future shared library load? (y or [n])ini secara otomatis akan mengasumsikan jawaban "Tidak".
Ruslan
6

start perintah

Perintah ini adalah opsi bagus lainnya:

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

Ini seperti lari, tetapi juga menetapkan breakpoint sementara maindan berhenti di sana.

Breakpoint sementara ini dinonaktifkan setelah tercapai.

starti

Ada juga yang terkait startiyang memulai program dan berhenti pada instruksi pertama sebagai gantinya, lihat juga: Berhenti pada instruksi kode mesin pertama di GDB

Hebat saat Anda melakukan beberapa hal tingkat rendah.

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

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

sabu
sumber