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.

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 .


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.


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


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

Kucing mengizinkan Anda tetap mengetik setelah gdb istirahat.


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.


4

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.