Beberapa perintah dalam gdb dipisahkan oleh semacam pembatas ';'?

145

Saya mencoba menjalankan dua perintah sekaligus di gdb:

finish; next

Saya mencoba menggunakan ';' untuk memisahkan perintah tetapi gdb tidak membiarkan saya melakukan keduanya sekaligus.

Apakah mungkin untuk melakukan banyak perintah dalam gdb mirip dengan perintah bash yang dipisahkan oleh ';' pembatas?

Trevor Boyd Smith
sumber

Jawaban:

179

Saya tidak percaya begitu (tapi saya mungkin salah). Anda dapat melakukan sesuatu seperti ini:

(gdb) mendefinisikan fn
> selesai
> selanjutnya
> akhir

Dan kemudian ketik:

(gdb) fn

Anda dapat meletakkan ini di ~/.gdbinitfile Anda juga sehingga selalu tersedia.

Sean Bright
sumber
1
Metode buruk ketika gdb dipanggil hanya untuk mencetak stacktrace dari invoker: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...dan saya tidak bisa mematikan pagination.
Vi.
4
Dan jika Anda lupa bagaimana Anda mendefinisikan suatu fungsi, Anda dapat menggunakan show user <function name>untuk melihat sumbernya, misalnya show user fn.
ntc2
44

Jika Anda menjalankan gdb dari baris perintah, Anda dapat melewati beberapa perintah dengan parameter -ex seperti:

$ gdb ./prog -ex 'b srcfile.c:90' -ex 'b somefunc' -ex 'r -p arg1 -q arg2'

Ini digabungkan dengan tampilan dan perintah lain membuat menjalankan gdb kurang rumit.

alecco
sumber
10

GDB tidak memiliki karakter pemisah perintah seperti itu. Saya melihat sebentar, kalau-kalau akan mudah untuk menambahkan satu, tapi sayangnya tidak ....

Michael Snyder
sumber
5

Anda dapat melakukan ini menggunakan integrasi python di gdb.

Akan lebih baik jika s ; btmelangkah dan kemudian mencetak backtrace, tetapi tidak.

Anda dapat melakukan hal yang sama dengan memanggil juru bahasa Python.

python import gdb ; print(gdb.execute("s")) ; print(gdb.execute("bt"))

Dimungkinkan untuk membungkus ini menjadi perintah khusus, di sini disebut "cmds", didukung oleh definisi python.

Berikut ini contoh yang .gdbinitdiperluas dengan fungsi untuk menjalankan banyak perintah.

# multiple commands
python
from __future__ import print_function
import gdb


class Cmds(gdb.Command):
  """run multiple commands separated by ';'"""
  def __init__(self):
    gdb.Command.__init__(
      self,
      "cmds",
      gdb.COMMAND_DATA,
      gdb.COMPLETE_SYMBOL,
      True,
    )

  def invoke(self, arg, from_tty):
    for fragment in arg.split(';'):
      # from_tty is passed in from invoke.
      # These commands should be considered interactive if the command
      # that invoked them is interactive.
      # to_string is false. We just want to write the output of the commands, not capture it.
      gdb.execute(fragment, from_tty=from_tty, to_string=False)
      print()


Cmds()
end

contoh doa:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye
Gregory Nisbet
sumber
brilian, karena memungkinkan untuk menempelkan perintah dari clipboard dan menjalankannya.
Jean-François Fabre
0

saya berlari melintasi cara lain untuk melakukan beberapa perintah di GDB menggunakan dokumen Bash HERE.

contoh:

cat << EOF | gdb
print "command_1"
print "..."
print "command_n"
EOF

ini memiliki IMO nilai / kegunaan terbatas karena GDB berhenti setelah menjalankan daftar perintah.

Trevor Boyd Smith
sumber