Gdb içinde bir çeşit ayırıcı ile ayrılmış çoklu komutlar ';'?


145

Gdb bir kerede iki komut yürütmek çalışıyorum:

finish; next

';' komutları ayırmak için gdb her ikisini birden yapmama izin vermedi.

Gdb'de ';' ile ayrılmış bash komutlarına benzer çoklu komutlar yapmak mümkün müdür? sınırlayıcı?

Yanıtlar:


180

Buna inanmıyorum (ama yanlış olabilirim). Bunun gibi bir şey yapabilirsiniz:

(gdb) fn'yi tanımla
> bitirmek
> sonraki
> son

Ve sonra şunu yazın:

(gdb) fn

Bunu ~/.gdbinitdosyanıza da koyabilirsiniz, böylece her zaman kullanılabilir.


1
GDB sadece invoker'ın stacktrace yazdırmak için çağrıldığında kötü yöntem: execlp("gdb", "gdb", "-batch", "-n", "-ex", "bt full", ...ve sayfalandırma kapatamıyorum.
Vi.

4
Bir işlevi nasıl tanımladığınızı unutursanız show user <function name>, kaynağını görmek için kullanabilirsiniz , örn show user fn.
ntc2

44

Komut satırından gdb çalıştırıyorsanız, -ex parametresi ile birden fazla komut iletebilirsiniz:

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

Bu, display ve diğer komutlarla birleştiğinde gdb'nin çalıştırılmasını daha az hantal yapar.


10

GDB'nin böyle bir komut ayırıcı karakteri yoktur. Kısaca, bir tane eklemek kolay olurdu, ama ne yazık ki hayır baktı.


5

Bunu, içindeki python entegrasyonunu kullanarak yapabilirsiniz gdb.

s ; btBastırılıp sonra bir geri iz yazdırmak güzel olurdu , ama yapmaz.

Aynı şeyi Python yorumlayıcısını arayarak da başarabilirsiniz.

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

Bunu, burada "cmds" adı verilen ve bir python tanımıyla desteklenen özel bir komuta sarmak mümkündür.

Aşağıda, .gdbinitbirden çok komutu çalıştırmak için kullanılan bir işlevle genişletilmiş bir örnek verilmiştir .

# 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

örnek çağırma:

$ gdb
(gdb) cmds echo hi ; echo bye
hi
bye

Panodan komut yapıştırmaya ve yürütmeye izin verdiği için parlak.
Jean-François Fabre

0

Ben bir Bash HERE belgesi kullanarak GDB birden fazla komut yapmak için başka bir yol koştu .

misal:

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

GDB komutlar listesi yürütüldükten sonra bu sınırlama / kullanılabilirlik IMO'suna sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.